将一个小部件绑定到EVT_TEXT事件以在wxpython中触发多个事件处理程序

时间:2016-01-25 12:14:26

标签: python-3.x wxpython

在我的示例中,将一些数据输入到wx.TextCtrl小部件必须触发两个事件处理函数。但是最后一次绑定会覆盖第一个绑定。

self.tc_limit.Bind(wx.EVT_TEXT, self.calculate_registration_fee)
self.tc_limit.Bind(wx.EVT_TEXT, self.catch_errors)

在我发生异常的情况下,最后一次绑定有效,但在向widget输入正确的数据后,它不会触发第一次绑定

所以我怎么做呢

1 个答案:

答案 0 :(得分:1)

像这样使用event.Skip()

import wx
def onText1(event):
    print "First Text1!"
    event.Skip()

def onText2(event):
    print "Then Text2!"

app = wx.App()

frame = wx.Frame(None, -1, '')
box = wx.StaticBox(frame, -1, "")
sizer = wx.StaticBoxSizer(box, orient=wx.VERTICAL)
text0 = wx.StaticText(frame,label="1st Item")
text0_input = wx.TextCtrl(frame, wx.ID_ANY, size=(345,25))
text0_input.SetValue("")
sizer.Add(text0, wx.ALIGN_LEFT|wx.ALL, border=10)
sizer.Add(text0_input, wx.ALIGN_LEFT|wx.ALL, border=10)
text0_input.Bind(wx.EVT_TEXT, onText2)
text0_input.Bind(wx.EVT_TEXT, onText1)

main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(sizer)
frame.SetSizer(main_sizer)

frame.Centre()
frame.Show()
text0_input.SetFocus()
window_focus = True

app.MainLoop()

event.Skip()
"此方法可以在事件处理程序中使用,以控制是否在当前事件返回后调用绑定到此事件的其他事件处理程序。如果没有Skip()(或等效使用Skip(False)),则不再处理该事件。如果调用Skip(True),则事件处理系统继续为此事件搜索进一步的处理函数,即使它已在当前处理程序中已经处理过。"