我的活动分散在我的整个计划中。每当我们对提交给数据库的更改进行更改时,我们都会触发包含任意信息的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"按钮,但等到我点击"发布事件"我的框架获取原始事件之前的按钮并打印到控制台。
我不太了解如何编写我自己的事件类 - 也许我可以覆盖一些事情,告诉它何时发出事件,粗略的看起来没有'到达任何地方。有什么建议吗?
谢谢!
答案 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()