wxPython:不同模块中的事件方法

时间:2012-01-03 00:12:14

标签: python events methods module wxpython

我有两个这样的模块(非常非常简化):

main.py:

from window import *

class MyApp(wx.Frame):

    def __init__(self, parent, label, pos, size):
        wx.Frame.__init__(self, parent = parent, title = label, pos = pos, size = size) 
        self.Centre()
        create_window(self)
        self.Bind(wx.EVT_CLOSE, self.OnClose)

    def OnClose(self, event):
        self.dlg = wx.MessageDialog(self, 'Quit application', 
            'Please confirm', wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
        if self.dlg.ShowModal() == wx.ID_YES:
            self.Destroy()

if __name__ == '__main__':
    app = wx.App()
    frame = MyApp(None, 'MyApp', (0, 0), (740, 640))
    frame.Show()
    frame.SetFocus()
    app.MainLoop()

window.py:

import wx            

def create_window(self):

    self.menubar = wx.MenuBar()
    self.fileMenu = wx.Menu()

    self.item = self.fileMenu.Append(wx.ID_EXIT, 'Quit', 'Quit application')

    self.Bind(wx.EVT_MENU, self.OnClose, self.item)

    self.menubar.Append(self.fileMenu, '&File')
    self.SetMenuBar(self.menubar)

    self.statusbar = self.CreateStatusBar()
    self.statusbar.SetStatusText('Ready')

现在我想将main.py中的OnClose方法移动到window.py(不仅仅是这个,如果main.py中还有很多其他方法,我想把它们全部移到不同的模块中来制作我的代码更结构化)。 但是只是从main.py中删除模块并将其粘贴到window.py中并不起作用(正如期望的那样)。 所以,我的问题是,我需要在代码中进行哪些更改才能使事件方法或其他方法可以从其他模块访问?

2 个答案:

答案 0 :(得分:0)

我不确定你想要什么。如果这是关于你想在类中实现的一般行为(比如关闭它们的特定方式,报告状态,添加balloontip系统等),那么一种方法是使用相应的方法创建一个类并继承她的

class BehaviorPack(object):
    def __init__(self):
        whatever
    def OnClose(self, event)
        whatever
    def colour_panel(self):
        whatever

然后导入该类并从中继承:

class MyFrame(wx.Frame, BehaviorPack):
    def __init__(self, *args, **kargs):
        ..........

答案 1 :(得分:0)

您可以随时使用PubSub模型(wxpython / wxpython中包含一个模型)。

您在一个模块中设置了一个侦听器(订阅者),然后向其发送一个事件(发布)以及事件发生的上下文。

这样可以轻松分离。他们有特定的wxpython示例,即使您可以关注:http://pubsub.sourceforge.net/