2

プロジェクトでwxPython クラスを使用する方法を学習しようとしてwxScrolledWindowいますが、壁にぶつかりました。

wxScrolledWindowコントロールのリストを含むクラスから派生したパネルを作成するプログラムをセットアップしました。パネルのクライアントは、すべてのコントロールを一度に表示するには意図的に小さすぎます。パネルの横にスクロールバーを表示できましたが、クリックしても何も起こりません。さらに、オブジェクトから Scrollbar 関連の継承された関数のいずれかを呼び出そうとすると、奇妙なエラーが発生します。

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()
4

1 に答える 1

1

さて、私はちょっとばかげているように感じます。問題は、さらに検討したところ、wx.Panel から継承した古いクラスのコードを採用したことです。そのため、wx.Panel.__init__... 行の代わりにwx.ScrolledWindow.__init__... 行があります。

面白いことに、あなたは長い間コードを見つめていて、それを見ていません...しかし、投稿が上がるとすぐにそこにあります. :P

于 2013-01-11T00:45:36.660 に答える