因此,在编写了一些小型的个人wxPython应用程序后,我决定将程序组织成一系列wx.Panel(),如下所示:
class display(wx.Panel):
<buttons, sliders, etc>
<sizer>
...
class selector(wx.Panel):
<buttons and stuff>
<sizer>
...
然后我拿这些面板将它们推到一个单独的框架中,作为主面板的孩子,此时我可以像这样使用sizer进行组织:
class mainwindow(wx.Frame):
master_panel = wx.Panel()
display = display(master_panel)
selector = selector(master_panel)
<sizers and stuff>
我现在的问题是两个面板需要某种方式来相互通信。例如,当在选择器中单击某些内容(如文件名)时,显示需要相应地更新。
首先想到的是使用现有的事件系统创建我自己的自定义事件,然后将它们绑定到每个面板中的处理程序,但我不确定这是正确的方法。我决定继承Panel()是否会产生一个我不会遇到的问题,或者是否有更好的方法来处理这种面板间通信问题?
答案 0 :(得分:2)
使用pubsub模块。它几乎为您提供了您自己所描述的内容:一种方法,用于将事件从一个模块发送到另一个模块。它的优势在于您不必在发送方和接收方之间建立连接 - 接收方只是声明它想要监听某些类型的消息并且... bingo ......它可以获得它们。
from wx.lib.pubsub import pub
class display(wx.Panel):
def __init__(self,... whatever):
<buttons, sliders, etc>
<sizer>
pub.subscribe("SELECTION_INFO", self.OnSelection)
def OnSelection(self, info):
# do stuff with info
...
class selector(wx.Panel):
def __init__(self, ... whatever)
<buttons and stuff>
<sizer>
def OnSomeButtonPressed(self, event):
pub.SendMessage("SELECTION_INFO", info="some useful info about what was pressed")
...
请注意,您不需要让主窗口参与其子级之间的通信。
答案 1 :(得分:0)
您可以使用知道其所有子面板的父级,在它们之间进行调解,当子面板引发事件(标准或自定义事件)时,父级绑定调用其他面板上的方法的事件处理程序相应地更新它们。
他是一些伪代码添加到你的伪代码
class display(wx.Panel):
def __init__(self, *args, **kwargs):
super(display, self).__init__(*args, **kwarg)
<buttons, sliders, etc>
<sizer>
def do_some_update(self):
<update>
...
class selector(wx.Panel):
def __init__(self, *args, **kwargs):
super(selector, self).__init__(*args, **kwargs)
<buttons and stuff>
<sizer>
...
class mainwindow(wx.Frame):
def __init__(self, *args, **kwargs):
super(mainwindow, self).__init__(*args, **kwargs)
master_panel = wx.Panel()
self.display = display(master_panel)
self.selector = selector(master_panel)
<sizers and stuff>
self.selector.button.Bind(wx.EVT_BUTTON, self.on_button_pressed)
def on_button_pressed(self, event):
self.display.do_some_update()
注意:这与我之前回答的一些问题类似