代码之家  ›  专栏  ›  技术社区  ›  Vitor Rossi

wxpython SetFocus和EVT_KILL_FOCUS组合框

  •  2
  • Vitor Rossi  · 技术社区  · 10 年前

    我试图了解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 回复  |  直到 10 年前
        1
  •  3
  •   user2963623    10 年前

    在阅读了你问题中的链接并摆弄了你的代码后,我得出的结论是 SetFocus() combobox 显然正在触发 EVT_KILL_FOCUS 在里面 窗户 。我注意到,在运行程序时,它会打印一次语句,尽管从 下拉列表框 没有失去焦点。

    我尝试了两件事:

    第一 将组合框代码移到按钮代码之后。在这种情况下,当程序运行时,“焦点”在按钮上,并确保没有打印语句!

    编辑如下:

    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 将焦点设置为 下拉列表框

    btn.Bind(wx.EVT_BUTTON, self.On_Button)
    
    def On_Button(self, event):
        self.Calc_Display.SetFocus()
    

    在这种情况下,每次单击按钮时都会打印两次语句。我想这是一次用于焦点丢失时,一次用于设置焦点。注意 设置焦点() 仍在 OnKillFocus 在这种情况下。

    返回代码:如果 SetFocus “取消注释”时,语句被多次打印,因为它不断设置焦点,从而触发事件,并在循环中继续。这可能是一个错误的解释,但无论如何,这是我唯一能想到的。