使用wxPython创建可滚动区域的最简单方法?

时间:2009-02-23 16:12:36

标签: python scroll wxwidgets scrolledwindow

好的,所以我想在windows中显示一系列窗口,并且可以滚动整个窗口。我一直在寻找the wxWidgets documentation以及来自各种来源的各种来自t'internet的例子。大多数似乎暗示wx.ScrolledWindow应该工作,如果我只是传递一组嵌套的sizer(?):

  

最自动和最新的方法是简单地让sizer确定滚动区域。现在,当您使用wxWindow :: SetSizer将内部sizer设置为wxScrolledWindow时,这是默认设置。滚动区域将设置为sizer请求的大小,并且将根据每个方向的需要和wxScrolledWindow :: SetScrollRate设置的滚动增量为每个方向分配滚动条。

...但我见过的所有示例似乎都使用列出的旧方法作为实现滚动的方法。我有一些基本的工作,但是一旦你开始滚动就会失去孩子的窗户:

import wx

class MyCustomWindow(wx.Window):
    def __init__(self, parent):
        wx.Window.__init__(self, parent)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.SetSize((50,50))

    def OnPaint(self, event):
        dc = wx.BufferedPaintDC(self)
        dc.SetPen(wx.Pen('blue', 2))
        dc.SetBrush(wx.Brush('blue'))
        (width, height)=self.GetSizeTuple()
        dc.DrawRoundedRectangle(0, 0,width, height, 8)

class TestFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1)

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

        self.scrolling_window = wx.ScrolledWindow( self )
        self.scrolling_window.SetScrollRate(1,1)
        self.scrolling_window.EnableScrolling(True,True)
        self.sizer_container = wx.BoxSizer( wx.VERTICAL )
        self.sizer = wx.BoxSizer( wx.HORIZONTAL )
        self.sizer_container.Add(self.sizer,1,wx.CENTER,wx.EXPAND)
        self.child_windows = []
        for i in range(0,50):
            wind = MyCustomWindow(self.scrolling_window)
            self.sizer.Add(wind, 0, wx.CENTER|wx.ALL, 5)
            self.child_windows.append(wind)

        self.scrolling_window.SetSizer(self.sizer_container)

    def OnSize(self, event):
        self.scrolling_window.SetSize(self.GetClientSize())

if __name__=='__main__':
    app = wx.PySimpleApp()
    f = TestFrame()
    f.Show()
    app.MainLoop()

1 个答案:

答案 0 :(得分:0)

哎呀..事实证明我正在制造我的儿童窗户:

wind = MyCustomWindow(self)

应该是:

wind = MyCustomWindow(self.scrolling_window)

..这意味着子窗口正在等待重新绘制顶层窗口(框架)而不是监听滚动窗口。改变这一切使它完美地工作:)