wxPython wx.Notebook 中选项卡之间的事件

Event between tabs in wxPython's wx.Notebook

我正在尝试使用 wxPython 的 wx.Notebook 创建两个选项卡;但是,如果按钮和列表框位于不同的选项卡中,我很难理解应该将 Bind() 放在哪里。

我的代码如下所示:它有 class TabOneTabTwo,两者都是 wx.Panel。 class enrollment 是使用 TabOneTabTwo 作为面板的 wx.Frame

class TabOne(wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self, parent)
        btn = wx.Button(self, 1, "Add", (120,110))

class TabTwo(wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self, parent)
        lst = wx.ListBox(self, 1, (40,40))

class enrollment(wx.Frame):
    def __init__(self, *args, **kargs):
        super(enrollment, self).__init__(*args, **kargs)

        panel = wx.Panel(self)
        nb = wx.Notebook(panel)

        tab1 = TabOne(nb)
        tab2 = TabTwo(nb)

        nb.AddPage(tab1, "Button")
        nb.AddPage(tab2, "ListBox")

        sizer = wx.BoxSizer()

        sizer.Add(nb, 1, wx.EXPAND)
        panel.SetSizer(sizer)

        self.Show(True)

def main():
    app = wx.App()
    enrollment(None)
    app.MainLoop()

if __name__ = '__main__':
    main()  

只是想知道我是否想为 TabOne 中的 btn 添加 Bind() 以便更新 TabTwo 中的 ListBox ,我应该在哪里添加它的定义?我现在不知所措。谢谢你们。

您可以通过不同的方式来组织它。 按钮的绑定是一回事,您在处理程序中执行的操作是另一回事。我的方法是让 enrollment class 处理绑定和操作,因为它知道这两个选项卡。您不希望在 TabOne 和 TabTwo 之间创建依赖关系。

class TabOne(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.btn = wx.Button(self, 1, "Add", (120,110))

    def BindButton(self, handler):
        # let users of TabOne to register their button handler
        self.btn.Bind(wx.EVT_BUTTON, handler)

class TabTwo(wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self, parent)
        self.lst = wx.ListBox(self, 1, (40,40))

    def InformButtonClicked(self):
        # signal to TabTwo about the button click
        self.lst.Append("Item")

class enrollment(wx.Frame):
    def __init__(self, *args, **kargs):
        super(enrollment, self).__init__(*args, **kargs)

        panel = wx.Panel(self)
        nb = wx.Notebook(panel)

        self.tab1 = TabOne(nb)
        self.tab2 = TabTwo(nb)
        # register your button handler
        self.tab1.BindButton(self.button_handler)

        nb.AddPage(self.tab1, "Button")
        nb.AddPage(self.tab2, "ListBox")

        sizer = wx.BoxSizer()

        sizer.Add(nb, 1, wx.EXPAND)
        panel.SetSizer(sizer)

        self.Show(True)

    def button_handler(self, evt):
        # this method gets called when the button is clicked
        self.tab2.InformButtonClicked()