【问题标题】:using wxpython and pubsub for changing text in statusbar使用 wxpython 和 pubsub 更改状态栏中的文本
【发布时间】:2014-03-13 21:09:42
【问题描述】:

我正在处理我的第一个 wxpython 项目,但我偶然发现了一个我无法解决的问题。基本上我有一个带有组合框和嵌入框架中的状态栏的面板。当我在组合框中选择一个项目时,我希望所选项目显示在状态栏中。这工作得很好。但我想要的是,当框架弹出时,组合框中的初始选择也已经显示在状态栏中。后者没有发生,我不明白为什么。因为我的应用非常复杂,所以我想通过使用 pubsub 来解决这个问题。

我做了一个最小的工作示例来演示问题所在。请注意,当框架打开时,状态栏是空的,但它应该显示组合框中的初始值。另外,我不知道为什么组合框中的当前项目被突出显示。有什么想法吗?

顺便说一句:我是 python 编程的新手,所以如果应该或可以以更 Python 的方式编写某些内容,我也会感谢我的代码中的一些 cmets。

好的,提前感谢您的帮助。最后,代码如下(我用的是wxpython 3.0):

import wx
from wx.lib.pubsub import pub

class CtrlPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1, style = wx.SUNKEN_BORDER)

        self.lstCombo = wx.ComboBox(self, -1)
        self.lstCombo.Bind(wx.EVT_COMBOBOX, self.onSelect)
        self.get_data()

    def get_data(self):
        self.lst = range(1,10)
        self.lst = [str(x) for x in self.lst]
        self.lstCombo.Clear()
        self.lstCombo.AppendItems(self.lst)
        self.lstCombo.SetValue(self.lst[2])
        pub.sendMessage('F.Change', fobj=self.lstCombo.GetValue())

    def onSelect(self, event):
        pub.sendMessage('F.Change', fobj=self.lstCombo.GetValue())

class MainFrame(wx.Frame):
    """ The main frame of the application
    """
    def __init__(self, parent, title):

        wx.Frame.__init__(self, parent, title=title)

        self.ctrl_panel = CtrlPanel(self)
        self.statusbar = self.CreateStatusBar()

        pub.subscribe(self.change_StatusBarText, 'F.Change')

    def change_StatusBarText(self, fobj):
        self.SetStatusText(fobj)

def main():
    app = wx.App(redirect=False)
    frame = MainFrame(None, "Test")
    frame.Centre()
    frame.Show(True)
    app.MainLoop()

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: combobox wxpython statusbar publish-subscribe


    【解决方案1】:

    状态栏未显示初始选择的原因取决于您的消息发送/订阅顺序。您正在创建一个 CtrlPanel 实例,该实例在其 init 末尾发送一条 pubsub 消息,然后订阅该消息。 消息发送前需要订阅,将CtrlPanel的创建移到pubsub订阅之后。

    组合框中的当前项被突出显示,因为它是唯一的 ctrl,因此它具有焦点。

    这里的代码修改了 pubsub 订阅的顺序。

    import wx
    from wx.lib.pubsub import pub
    
    
    class CtrlPanel(wx.Panel):
    
        def __init__(self, parent):
            wx.Panel.__init__(self, parent, -1, style=wx.SUNKEN_BORDER)
    
            self.lstCombo = wx.ComboBox(self, -1)
            self.lstCombo.Bind(wx.EVT_COMBOBOX, self.onSelect)
            self.get_data()
    
        def get_data(self):
            self.lst = range(1, 10)
            self.lst = [str(x) for x in self.lst]
            self.lstCombo.Clear()
            self.lstCombo.AppendItems(self.lst)
            self.lstCombo.SetValue(self.lst[2])
            pub.sendMessage('F.Change', fobj=self.lstCombo.GetValue())
    
        def onSelect(self, event):
            pub.sendMessage('F.Change', fobj=self.lstCombo.GetValue())
    
    
    class MainFrame(wx.Frame):
        """ The main frame of the application
        """
        def __init__(self, parent, title):
    
            wx.Frame.__init__(self, parent, title=title)
    
            self.statusbar = self.CreateStatusBar()
            pub.subscribe(self.change_StatusBarText, 'F.Change')
            self.ctrl_panel = CtrlPanel(self)
    
        def change_StatusBarText(self, fobj):
            self.SetStatusText(fobj)
    
    
    def main():
        app = wx.App(redirect=False)
        frame = MainFrame(None, "Test")
        frame.Centre()
        frame.Show(True)
        app.MainLoop()
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

    • 您好 Yoriz,谢谢您的回答和解释。我对其进行了测试,然后将您的答案标记为正确。最佳
    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 2011-06-09
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多