wxPython: метод события в другом модуле - PullRequest
0 голосов
/ 03 января 2012

У меня есть два таких модуля (очень очень упрощенный):

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')

Теперь я хотел бы переместить метод OnClose из main.py в window.py (не только этот, если есть много других методов в main.py, и я хочу переместить их все в разные модули, чтобы сделать мой код более структурированный). Но просто вырезать модуль из main.py и вставить его в window.py не получится (как ожидалось). Итак, мой вопрос: что я должен изменить в своем коде, чтобы сделать метод события или другой метод доступным из другого модуля?

Ответы [ 2 ]

0 голосов
/ 03 января 2012

Вы всегда можете использовать модель PubSub (она включена как часть wxpython / получена из wxpython).

Вы настроили слушателя (подписчика) в одном модуле, а затем отправили ему событие (публикацию) вместе с контекстом, в котором происходит событие.

Это позволяет легко разделить.У них есть конкретные примеры для wxpython, которым вы можете следовать: http://pubsub.sourceforge.net/

0 голосов
/ 03 января 2012

Я не уверен, что вы хотите.Если речь идет об общем поведении, которое вы хотите реализовать в своих классах (например, конкретный способ их закрытия, состояние отчета, добавление системы всплывающих подсказок и т. Д.), То один из способов - создать класс с соответствующими методами и наследовать от него.

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):
        ..........
...