我试图理解组合框上的EVT_KILL_FOCUS和SetFocus是如何工作的。这是以下代码:
import wx
class MainWindow(wx.Frame):
count = 1
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(150,150), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX)
panel = wx.Panel(self, -1)
self.Calc_Display = wx.ComboBox(panel, -1, style=wx.CB_DROPDOWN|wx.TE_PROCESS_ENTER)
self.Calc_Display.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
btn = wx.Button(panel, label="Test")
MainFrameSizer = wx.BoxSizer(wx.VERTICAL)
MainFrameSizer.Add(self.Calc_Display, 0, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 5)
MainFrameSizer.Add(btn, 0, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 5)
panel.SetSizer(MainFrameSizer)
panel.Fit()
self.Show()
def OnKillFocus(self, event):
print ('EVT_KILL_FOCUS was called %i times' %MainWindow.count)
MainWindow.count += 1
# self.Calc_Display.SetFocus()
event.Skip()
app = wx.App(False)
frame = MainWindow(None, "Test")
app.MainLoop()
如果运行此选项,每次组合框失去焦点时都会得到一个打印件,这是预期的。 如果你取消注释第28行,那就是它变得怪异的时候。一遍又一遍地调用EVT_KILL_FOCUS。这是我试图理解的行为。在我写的程序中,我想强制组合框在不满足条件的情况下保持焦点。有没有办法绕过这种行为?
我在这个问题上找到了这个链接,但我不太明白:http://wiki.wxpython.org/Surviving%20with%20wxEVT%20KILL%20FOCUS%20under%20Microsoft%20Windows
感谢您的帮助
答案 0 :(得分:3)
在阅读了您的问题中发布的链接并使用了您的代码后,我得出的结论是,SetFocus()
上的combobox
调用显然会触发<{1}}中的EVT_KILL_FOCUS
>窗即可。我注意到在运行程序时,它会打印一次语句,尽管它不应该因为combobox
没有失去焦点。
我尝试了两件事:
首先是在按钮代码后移动组合框代码。在这种情况下,当程序运行时,焦点在按钮上,确定不打印语句!
这是编辑:
btn = wx.Button(panel, label="Test")
self.Calc_Display = wx.ComboBox(panel, -1, style=wx.CB_DROPDOWN|wx.TE_PROCESS_ENTER)
self.Calc_Display.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
第二次是尝试将btn
绑定到处理程序,该处理程序将焦点设置为combobox
btn.Bind(wx.EVT_BUTTON, self.On_Button)
def On_Button(self, event):
self.Calc_Display.SetFocus()
在这种情况下,每次单击按钮时都会打印两次语句。我想这是焦点丢失时的一次,也是焦点恢复时的一次。请注意,在这种情况下SetFocus()
仍会注释掉OnKillFocus
。
回到你的代码:如果SetFocus
是“取消注释”,语句会多次打印,因为它会不断设置焦点,而焦点又会触发事件并继续循环播放。这可能是一个错误的解释,但尽管如此,这是我唯一能想到的。