获取wxpython程序的一部分以便彼此通信

时间:2014-02-21 07:31:17

标签: python-2.7 wxpython

因此,在编写了一些小型的个人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()是否会产生一个我不会遇到的问题,或者是否有更好的方法来处理这种面板间通信问题?

2 个答案:

答案 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()

注意:这与我之前回答的一些问题类似

wx.Python: Passing control between multiple panels

Passing a tuple between two Panels in wxPython