wxPython:如何引用框架';个人笔记本电脑面板上的状态栏?

wxPython:如何引用框架';个人笔记本电脑面板上的状态栏?,wxpython,statusbar,Wxpython,Statusbar,我相信这对你们来说很容易,但我很难找到解决办法 我有一个框架,它是由一堆导入的文件构成的,用来构建一个笔记本。。。比如: class myFrame(wx.Frame): """ Frame that holds all other widgets """ #---------------------------------------------------------------------- def __init__(self):

我相信这对你们来说很容易,但我很难找到解决办法

我有一个框架,它是由一堆导入的文件构成的,用来构建一个笔记本。。。比如:

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()
我想,从笔记本的各个页面内更改整个框架的状态文本。。。如果上述内容称为myFile,是否有办法从单独的笔记本页面(存储在单独的文件中)中
SetStatusText

例如,我想做的是,当您从一个笔记本页面移动到另一个笔记本页面时,状态栏会反映您当前在应用程序中的位置

多谢各位

Chow(对wxPython来说还是新手)

尝试类似的方法(对Python不是很熟悉,但这是我在C++中要做的)。在构造函数中:

self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
在框架类中编写一个新方法:

def OnPageChanged(self, event):
    selected_page = event.GetSelection()
    if selected_page == wx.NOT_FOUND:
        self.SetStatusText("No page selected!")
    else:
        self.SetStatusText("Welcome to notebook page: " + event.GetEventObject().GetPageText(selected_page)
我没有安装wxPython,所以这是未经测试的,但这是一般的想法。这将设置状态栏以反映所选页面的标题。如果需要它来显示存储在页面中的其他数据,您可以利用Python的动态特性,只需在每个页面中添加一个属性:

def OnLoadPages(self):
    # Read pages from a file
    # Every time you add a page, do this:
    page.status_bar_info = whatever_you_want_to_put_here
def OnPageChanged(self, event):
    # Basically the same as above
    # Instead of calling GetPageText, do this:
    self.SetStatusText(event.GetEventObject().GetCurrentPage().status_bar_info)

为此,最好使用PubSub,将类的依赖关系与其他类解耦(并减少GetParent().GetParent()噪音:)


当我在笔记本电脑面板上时,有没有办法参考它?这将为我以后在选项卡中添加状态更新等时提供所需的所有灵活性。“良好实践”可重用的方法是实现您自己的事件并将其绑定到更改文本的函数。但是如果你只是需要这个程序的快速解决方案,
notebook\u page.GetParent().GetParent().SetStatusText(“一些文本”)
就可以了。在我的例子中:
self.GetParent().GetParent().GetParent().SetStatusText(“一些文本”)
工作得非常出色!谢谢大家!<代码>self.GetTopLevelParent().GetStatusBar(“一些测试”)工作得更好!非常感谢。:)
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()