如何在不同的wx笔记本页面之间获取变量?

3 投票
1 回答
1970 浏览
提问于 2025-04-16 03:17

我在想,如何在wx笔记本的不同页面之间传递一个变量。如果我知道变量的名字和页面的ID,应该有办法引用这个变量。例如,如果我有以下代码,怎么才能从面板y中引用变量x,反之亦然呢?

import wx

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

class PanelY(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        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(PanelX(nb), "Panel X")
        nb.AddPage(PanelY(nb), "Panel Y")


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


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

1 个回答

5

你在面板中创建的变量并不是“保存”在类里的,它们只是构造函数中用的局部变量,方法执行完后就会被从内存中丢弃。

你需要在变量前加上“self”来创建它们,比如说 self.x = 3。这样做会创建“实例变量”——这些变量的值会根据它们所属的类实例而不同。

你可以通过使用 Notebook 的 GetPage 方法来获取一个页面。下面是修改过的示例:

import wx

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

class PanelY(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(PanelX(nb), "Panel X")
        nb.AddPage(PanelY(nb), "Panel Y")


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

        page = nb.GetPage(0)
        print "PanelX's X value is %s" % page.x

        page = nb.GetPage(1)
        print "PanelY's Y value is %s" % page.y       


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

撰写回答