从 wx notebook 一个页面获取变量到另一个页面

104 阅读2分钟

在一个wx notebook应用程序中,我们需要在不同的页面之间共享变量。例如,如果有一个带有两个页面的notebook,第一个页面包含一个文本框,第二个页面包含一个按钮。当用户在文本框中输入一些文本并单击按钮时,我们需要将文本框中的文本传递到第二个页面并显示在一个标签中。

2、解决方案

要从wx notebook的一个页面获取变量到另一个页面,可以使用以下方法:

  1. 使用派生类:

在派生类中定义一个变量,并在派生类的构造函数中将变量初始化为另一个页面的变量。例如:

class Page1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.x = 3

class Page2(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.y = 4

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Main Frame", size = (500,450))

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

        nb.AddPage(Page1(nb), "Page 1")
        nb.AddPage(Page2(nb), "Page 2")

        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)

if __name__ == "__main__":
    app = wx.App()
    MainFrame().Show()
    app.MainLoop()
  1. 使用事件处理:

在第一个页面中定义一个事件处理函数,并在事件处理函数中将变量传递到第二个页面。例如:

class Page1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.x = 3

        self.Bind(wx.EVT_BUTTON, self.on_button_click)

    def on_button_click(self, event):
        page2 = self.GetParent().GetPage(1)
        page2.y = self.x

class Page2(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.y = 4

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Main Frame", size = (500,450))

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

        nb.AddPage(Page1(nb), "Page 1")
        nb.AddPage(Page2(nb), "Page 2")

        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)

if __name__ == "__main__":
    app = wx.App()
    MainFrame().Show()
    app.MainLoop()
  1. 使用全局变量:

在两个页面中定义一个全局变量,并在两个页面中使用相同的全局变量。例如:

x = 3
y = 4

class Page1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        self.Bind(wx.EVT_BUTTON, self.on_button_click)

    def on_button_click(self, event):
        global y
        y = self.x

class Page2(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Main Frame", size = (500,450))

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

        nb.AddPage(Page1(nb), "Page 1")
        nb.AddPage(Page2(nb), "Page 2")

        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)

if __name__ == "__main__":
    app = wx.App()
    MainFrame().Show()
    app.MainLoop()
  1. 使用wx.lib.pubsub:

wx.lib.pubsub是一个事件发布订阅库,可以使用它来在两个页面之间传递变量。例如:

import wx.lib.pubsub as pubsub

class Page1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        self.Bind(wx.EVT_BUTTON, self.on_button_click)

    def on_button_click(self, event):
        pubsub.sendMessage("page1", self.x)

class Page2(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        pubsub.subscribe(self.on_message, "page1")

    def on_message(self, msg):
        self.y = msg.data

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Main Frame", size = (500,450))

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

        nb.AddPage(Page1(nb), "Page 1")
        nb.AddPage(Page2(nb), "Page 2")

        sizer = wx.BoxSizer()
        sizer.Add(nb, 1, wx.EXPAND)
        p.SetSizer(sizer)

if __name__ == "__main__":
    app = wx.App()
    MainFrame().Show()
    app.MainLoop()