我正在尝试学习如何在项目中使用 wxPython wxScrolledWindow 类,但我遇到了困难。
我已经设置了一个程序,它使一个面板派生自包含控件列表的 wxScrolledWindow 类;面板的客户端故意太小,无法一次显示所有控件。我已经设法在面板的侧面获得了一个滚动条,但是单击它什么也没做。此外,每当我尝试从该对象调用与滚动条相关的继承函数之一时,我都会收到一个奇怪的错误:
Traceback (most recent call last):
File "C:\Python27\Projects\Supervisor\test.py", line 69, in <module>
frame = MyFrame(None, "Test Bench")
File "C:\Python27\Projects\Supervisor\test.py", line 18, in __init__
self.mainpanel = MyPanel(self)
File "C:\Python27\Projects\Supervisor\test.py", line 62, in __init__
self.SetScrollRate(10, 10)
File "C:\Python27\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 179, in SetScrollRate
return _windows_.ScrolledWindow_SetScrollRate(*args, **kwargs)
TypeError: in method 'ScrolledWindow_SetScrollRate', expected argument 1 of type 'wxScrolledWindow *'
我看了很多例子,但我不知道我在哪里犯了错误。
我在 MS Windows 下使用 Python 2.7.3、wxPython 2.8 工作。实际上,我已经设法完成了很多事情而没有遇到严重的问题,当然没有像这样的。
我的代码如下:
# Test.py
#
# Dummy file for testing things that are too complex to type into the shell
# directly.
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title)
self.SetSize((800, 500))
self.Center()
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.mainpanel = MyPanel(self)
self.mainpanel.SetMaxSize(self.GetVirtualSize())
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.mainpanel)
self.SetSizer(sizer)
self.Show(True)
mpsize = self.mainpanel.GetSize()
mvsize = self.mainpanel.GetVirtualSize()
vsize = self.GetVirtualSize()
self.SetClientSize((mpsize[0], vsize[1]))
self.mainpanel.SetSize((mpsize[0], vsize[1]))
self.mainpanel.SetVirtualSize(mvsize)
def OnClose(self, e):
self.Destroy()
class MyPanel(wx.ScrolledWindow):
def __init__(self, parent):
wx.Panel.__init__(self, parent,
style = wx.VSCROLL)
sizer = wx.GridBagSizer(10, 10)
self.egps = []
for i in range(20):
leftbit = wx.StaticText(self, label = "Item " + str(i))
midbit = wx.TextCtrl(self, id = wx.ID_ANY)
rightbit = wx.CheckBox(self, id = wx.ID_ANY, label = "Checkbox")
self.egps.append([leftbit, midbit, rightbit])
for i in range(len(self.egps)):
sizer.Add(self.egps[i][0], (i,0))
sizer.Add(self.egps[i][1], (i,1))
sizer.Add(self.egps[i][2], (i,2))
self.SetSizer(sizer)
self.SetScrollRate(10, 10)
if __name__ == "__main__":
app = wx.App(False)
frame = MyFrame(None, "Test Bench")
app.MainLoop()
请您参考如下方法:
好吧,我觉得有点傻。经过进一步审查,问题是我改编了继承自 wx.Panel 的旧类的代码。因此,我有 wx.Panel.__init__... 行而不是 wx.ScrolledWindow.__init__... 行。
搞笑的是,你盯着代码看了半天也没看出来……可是帖子一上去,就在那里。 :P
