Skip to main content
 首页 » 编程设计

python之wxPython wxScrolledWindow 函数引发 TypeError

2025年05月04日9xxx_UU

我正在尝试学习如何在项目中使用 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