0

私は wxpython の初心者で、ブック (ツリーブック、ノートブック、チョイスブック) 内にいくつかのウィジェットを配置しようとしてきましたが、イベントに応答しないコンテナー内に配置されたウィジェットで終わることがよくありました。何が間違っているのかわかりません。以下は私のコードの1つです

import wx

class ChoicePanelTwo(wx.Panel):
    def __init__(self, parent, seed):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        self.SetBackgroundColour('blue')
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.List = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
        for i in range(seed):
            self.List.InsertStringItem(i, str(i))
        sizer.Add(self.List, 1, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer)

class ChoicePanelOne(wx.Panel):
    def __init__(self, parent, seed):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        self.SetBackgroundColour('green')
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.RegisterList = wx.Choicebook(self, wx.ID_ANY)
        sizer.Add(self.RegisterList, 1, wx.ALL|wx.EXPAND, 5)
        for i in range(seed):
            self.RegisterList.AddPage(ChoicePanelTwo(self, seed*50),  str(i))
        self.SetSizer(sizer)

class TreePanel(wx.Panel):
    def __init__(self, parent, seed):
        wx.Panel.__init__(self, parent, id=wx.ID_ANY)
        self.SetBackgroundColour('cyan')
        self.Choicbook = wx.Choicebook(self, wx.ID_ANY)
        for i in range(seed):
            self.Choicbook.AddPage(ChoicePanelOne(self, seed*2), str(i))
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.Choicbook, 1, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer)

class AppFrame(wx.Frame):
    """ The main frame of the application
    """
    title = 'Application'
    WindowSize = (1024, 768)
    seed = 2

    def __init__(self):
        wx.Frame.__init__(self, None, -1, self.title, size=self.WindowSize, style=wx.MINIMIZE_BOX|wx.SYSTEM_MENU|wx.CAPTION|wx.CLOSE_BOX|wx.CLIP_CHILDREN)
        self.create_main_panel()

    def create_main_panel(self):
        self.panel = TreePanel(self, self.seed)        

if __name__ == '__main__':
    app = wx.PySimpleApp()
    app.frame = AppFrame()
    app.frame.Show()
    app.MainLoop()

この例では。チョイスブックとリストは機能しているようです。私が間違っているのは何ですか?

4

1 に答える 1

2

親権の問題です。ChoicBook である必要があるときに、ChoicePanelOne インスタンスのすべての親を TreePanel として設定しています。また、ChoicePanelOne でも同じことを行っており、RegisterList である必要があるときに、親が ChoicePanelOne である ChoicePanelTwo を大量に作成します。以下のわずかに変更されたコードを確認してください。

import wx

class ChoicePanelTwo(wx.Panel):
    def __init__(self, parent, seed):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        self.SetBackgroundColour('blue')
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.List = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
        for i in range(seed):
            self.List.InsertStringItem(i, str(i))
        sizer.Add(self.List, 1, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer)

class ChoicePanelOne(wx.Panel):
    def __init__(self, parent, seed):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        self.SetBackgroundColour('green')
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.RegisterList = wx.Choicebook(self, wx.ID_ANY)
        sizer.Add(self.RegisterList, 1, wx.ALL|wx.EXPAND, 5)
        for i in range(seed):
            self.RegisterList.AddPage(ChoicePanelTwo(self.RegisterList, seed*50),  str(i))
        self.SetSizer(sizer)

class TreePanel(wx.Panel):
    def __init__(self, parent, seed):
        wx.Panel.__init__(self, parent, id=wx.ID_ANY)
        self.SetBackgroundColour('cyan')
        self.Choicbook = wx.Choicebook(self, wx.ID_ANY)
        for i in range(seed):
            self.Choicbook.AddPage(ChoicePanelOne(self.Choicbook, seed*2), str(i))
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.Choicbook, 1, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer)

class AppFrame(wx.Frame):
    """ The main frame of the application
    """
    title = 'Application'
    WindowSize = (1024, 768)
    seed = 2

    def __init__(self):
        wx.Frame.__init__(self, None, -1, self.title, size=self.WindowSize, 
                          style=wx.MINIMIZE_BOX|wx.SYSTEM_MENU|wx.CAPTION|wx.CLOSE_BOX|wx.CLIP_CHILDREN)
        self.create_main_panel()

    def create_main_panel(self):
        self.panel = TreePanel(self, self.seed)        

if __name__ == '__main__':
    app = wx.PySimpleApp()
    app.frame = AppFrame()
    app.frame.Show()
    app.MainLoop()

良い例がたくさん含まれているので、wxPython デモをダウンロードしてください。wikiまたは私のブログ記事も参照してください。

Widget Inspection Toolを使用すると、問題の診断に役立ちます。また、どの親がどこにあり、サイザーがどのようにレイアウトされているかなどを確認できます。

于 2012-07-12T14:15:58.737 に答える