wxpython SetFocus和EVT_KILL_FOCUS组合框

时间:2014-08-20 14:49:43

标签: combobox wxpython setfocus

我试图理解组合框上的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

感谢您的帮助

1 个答案:

答案 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是“取消注释”,语句会多次打印,因为它会不断设置焦点,而焦点又会触发事件并继续循环播放。这可能是一个错误的解释,但尽管如此,这是我唯一能想到的。