如何在将事件释放给绑定到它的人之前对事件进行排队

时间:2017-04-15 21:26:56

标签: python-2.7 wxpython

我的活动分散在我的整个计划中。每当我们对提交给数据库的更改进行更改时,我们都会触发包含任意信息的ModelChanged事件,然后由各种GUI元素选取这些信息来更新屏幕。但是,我正在对它的工作方式进行一些重构。一旦它被解雇,GUI设备就不会捕获事件,我希望暂停它直到另一个事件发生。所以,而不是这样做:

火灾事件 - >绑定接收事件

我希望它能做到这一点:

火灾事件 - >等待另一个单独的事件开火 - >绑定接收原始事件。

以下是一些代码:

import wxversion
wxversion.select(['3.0', '2.8'])
import wx
import wx.lib.newevent

OriginalEvent, ORIGINAL_EVT = wx.lib.newevent.NewEvent()
ReleaseEvent, RELEASE_EVT = wx.lib.newevent.NewEvent()

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.fireOriginalBtn = wx.Button(self, wx.ID_ANY, "Fire Event")
        self.fireOriginalBtn.Bind(wx.EVT_BUTTON, self.fireOriginal)

        self.releaseEventBtn = wx.Button(self, wx.ID_ANY, "Release Event")
        self.releaseEventBtn.Bind(wx.EVT_BUTTON, self.releaseEvent)

        self.sizer.Add(self.fireOriginalBtn, 1, wx.EXPAND)
        self.sizer.Add(self.releaseEventBtn, 1, wx.EXPAND)

        self.SetSizer(self.sizer)
        self.SetAutoLayout(1)
        self.sizer.Fit(self)

        self.Bind(ORIGINAL_EVT, self.captureOriginal)
        self.Bind(RELEASE_EVT, self.captureRelease)
        self.Show(True)

    def fireOriginal(self, evt):
        wx.PostEvent(self, OriginalEvent(myInfo=[1,2,3,4]))

    def releaseEvent(self, evt):
        wx.PostEvent(self, ReleaseEvent())

    def captureOriginal(self, evt):
        print "Event captured"

    def captureRelease(self, evt):
        print "Release captured"

app = wx.App(False)
frame = MyFrame(None, 'Small editor')
app.MainLoop()

目前,当您单击“火灾事件”时,您将在控制台上打印文本。我希望能够点击" Fire Event"按钮,但等到我点击"发布事件"我的框架获取原始事件之前的按钮并打印到控制台。

我不太了解如何编写我自己的事件类 - 也许我可以覆盖一些事情,告诉它何时发出事件,粗略的看起来没有'到达任何地方。有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

wxPython与其他GUI工具包一样是事件驱动的。没有方法可以使事件暂停并等待第二个事件。相反,您可以设置一个属性,告诉您按下Fire Event按钮的时间,并在第二个事件中使用该属性来确定您应该执行的操作。这是一个例子:

import wxversion
wxversion.select(['3.0', '2.8'])
import wx
import wx.lib.newevent

OriginalEvent, ORIGINAL_EVT = wx.lib.newevent.NewEvent()
ReleaseEvent, RELEASE_EVT = wx.lib.newevent.NewEvent()

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))
        self.fire_event = False

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.fireOriginalBtn = wx.Button(self, wx.ID_ANY, "Fire Event")
        self.fireOriginalBtn.Bind(wx.EVT_BUTTON, self.fireOriginal)

        self.releaseEventBtn = wx.Button(self, wx.ID_ANY, "Release Event")
        self.releaseEventBtn.Bind(wx.EVT_BUTTON, self.releaseEvent)

        self.sizer.Add(self.fireOriginalBtn, 1, wx.EXPAND)
        self.sizer.Add(self.releaseEventBtn, 1, wx.EXPAND)

        self.SetSizer(self.sizer)
        self.SetAutoLayout(1)
        self.sizer.Fit(self)

        self.Bind(ORIGINAL_EVT, self.captureOriginal)
        self.Bind(RELEASE_EVT, self.captureRelease)
        self.Show(True)

    def fireOriginal(self, evt):
        self.fire_event = True

    def releaseEvent(self, evt):
        wx.PostEvent(self, ReleaseEvent())
        if self.fire_event:
            wx.PostEvent(self, OriginalEvent(myInfo=[1,2,3,4]))
            self.fire_event = False

    def captureOriginal(self, evt):
        print "Event captured"

    def captureRelease(self, evt):
        print "Release captured"

app = wx.App(False)
frame = MyFrame(None, 'Small editor')
app.MainLoop()