views:

26

answers:

1

I am wondering how one would get a variable from one page to another from a wx notebook. I am thinking there should be some way to reference a variable if I know the variable name and page id. For example if I had the following code, how would I reference variable x from panel y and vice versa

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()
+2  A: 

The variables you're creating in your panels aren't "saved" in the class - they're a local variable used in the constructor, and discarded from memory as soon as that method's executed.

You'll have to create your variables with "self" in front of them -- self.x = 3 This will create "instance variables" - variables that have different values depending on the class instance they belong to.

You can get a page from a Notebook by using its GetPage method. Here's your example modified:

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()
Steven Sproat
+1 Thanks, the GetPage function was the missing link. Thanks for catching the local variables. That was on oversight.
Richard
no problem - I wasn't sure how detailed to go into describing local vs instance variables, plus I'm pretty rubbish at explaining those things :)
Steven Sproat