wx.ScrolledWindow 滚动时不重绘

2 投票
1 回答
1495 浏览
提问于 2025-04-16 11:26

我正在用wxPython开发一个小应用。

我有一个使用了wx.ScrolledWindow的滚动窗口。但它在滚动时似乎不愿意重新绘制里面的内容。

举个例子:
是的,我的窗口管理器颜色方案是粉色。有什么问题吗?

上面这个例子的代码如下:

import wx


class SaveEdFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_FRAME_STYLE|wx.EXPAND
        wx.Frame.__init__(self, *args, **kwds)

        self.__do_layout()

        self.Bind(wx.EVT_SIZE, self.onSize)


    def __mainSizer(self):
        self.mainSizer = wx.BoxSizer(wx.VERTICAL)

        for key in xrange(30):
            self.headerLabel = wx.StaticText(self, -1, "TestStr %s" % key)
            self.mainSizer.Add(self.headerLabel)
        return self.mainSizer


    def __do_layout(self):
        ## begin wxGlade: SaveEdFrame.__do_layout

        self.scroll = wx.ScrolledWindow(self, style=wx.FULL_REPAINT_ON_RESIZE)
        self.scroll.SetScrollbars(1, 10, 1, 10)
        self.scroll.SetSizer(self.__mainSizer())


    def onSize(self, event):
        self.scroll.SetSize(self.GetClientSize())

        self.Refresh()


if __name__ == "__main__":
    app = wx.App(0)

    mainFrame = SaveEdFrame(None)
    app.SetTopWindow(mainFrame)
    mainFrame.Show(True)
    app.MainLoop()

我查阅了wxDocs,感觉一个解决办法是创建一个wx.ScrolledWindow的子类,手动捕捉wx.EVT_SCROLLWIN事件,然后明确地重新绘制窗口。但是我尝试这样做时,调用self.Refresh()并没有让wx.ScrolledWindow内部的内容重新绘制。

总之,我觉得wx.ScrolledWindow的主要功能就是在滚动时应该自己处理重新绘制的事情。

我哪里做错了?

我的平台是W7-x64,使用的是python 2.7 32位,wxPython 2.8.11.0

1 个回答

3

我觉得问题出在你的wx.StaticText控件是SaveEdFrame的子控件,而不是ScrolledWindow的。每当你滚动ScrolledWindow时,它会把这些控件重新绘制在上面。你可以试试这个:

 headerLabel = wx.StaticText(self.scroll, -1, "TestStr %s" % key)
 self.mainSizer.Add(headerLabel)

撰写回答