wxPython:如何从各个笔记本电脑面板引用框架的状态栏?

cho*_*how 2 wxpython statusbar

我相信这对你们来说很容易,但我很难找到解决方案......

我有一个框架,由一堆导入的文件构成,以构建一个笔记本...类似于:

class myFrame(wx.Frame):
    """
    Frame that holds all other widgets
    """

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, wx.ID_ANY, "My Frame", size=(520,635))
        panel = wx.Panel(self)

        notebook = myFrameNotebook(panel)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5)
        panel.SetSizer(sizer)

        self.CreateStatusBar(style=0)
        self.SetStatusText("Welcome to My Frame...")

        self.Layout()

        self.Show()
        self.Centre()
Run Code Online (Sandbox Code Playgroud)

我想,从笔记本的各个页面内更改整个框架的状态文本...如果以上称为myFile,是否有办法SetStatusText从单独的笔记本页面(存储在单独的文件中) ?)

我想做的是,当你从笔记本页面移动到笔记本页面时,状态栏会反映你当前在应用程序中的位置......?

非常感谢,

周(对wxPython来说还是新手)

Ste*_*oat 5

最好使用PubSub,将你的类依赖于另一个(并减少那个GetParent().GetParent()noise :))

import random, string
import wx

from wx.lib.pubsub import Publisher

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, size=(300, 300))
        self.CreateStatusBar(style=0)
        self.notebook = wx.Notebook(self)
        btn = wx.Button(self, label="add page")
        btn.Bind(wx.EVT_BUTTON, lambda evt: self.create_page(random.choice(string.letters)))

        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(btn, 0)
        box.Add(self.notebook, 1, wx.EXPAND)
        self.SetSizer(box)

        Publisher().subscribe(self.change_statusbar, 'change_statusbar')
        self.create_page("1")
        self.create_page("2")
        self.Layout()

    def create_page(self, text):
        self.notebook.AddPage(Page(self.notebook, text), text)

    def change_statusbar(self, msg):
        self.SetStatusText(msg.data)


class Page(wx.Panel):
    def __init__(self, parent, text):
        wx.Panel.__init__(self, parent)
        Publisher().sendMessage(('change_statusbar'), text)


app = wx.App(redirect=False)
top = Frame()
top.Show()
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)