【问题标题】:Why does this use of wxPython's EVT_KILL_FOCUS behave unexpectedly?为什么这种使用 wxPython 的 EVT_KILL_FOCUS 的行为会出乎意料?
【发布时间】:2014-05-30 13:28:01
【问题描述】:

我希望我的 wxPython 应用程序在文本输入小部件失去焦点时触发事件。我按照教程here 进行了操作,该教程描述了使用wx.EVT_KILL_FOCUS。但是,我遇到了意外行为。

以下代码可以正常工作:

import wx

class MyForm(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Focus Tutorial 1a")
        panel = wx.Panel(self, wx.ID_ANY)
        txt = wx.TextCtrl(panel, wx.ID_ANY, "")

        txt.Bind(wx.EVT_KILL_FOCUS, self.onTextKillFocus)
        """
        This next line seems to be important for working correctly,
        but I don't understand why:
        """
        txt.Bind(wx.EVT_SET_FOCUS, self.onTextFocus)

        btn = wx.Button(panel, wx.ID_ANY, "Test")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(txt, 0, wx.ALL, 5)
        sizer.Add(btn, 0, wx.ALL, 5)
        panel.SetSizer(sizer)

    def onTextFocus(self, event):
        print "text received focus!"

    def onTextKillFocus(self, event):
        print "text lost focus!"

if __name__ == '__main__':
    app = wx.App()
    frame = MyForm().Show()
    app.MainLoop()

当我在文本控件和按钮之间来回切换时,或者单击进入或退出文本控件时,我会收到预期的焦点消息。

但是,当我进行以下(合理的?)编辑时,事情就变糟了:

import wx

class MyForm(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Focus Tutorial 1a")
        panel = wx.Panel(self, wx.ID_ANY)
        txt = wx.TextCtrl(panel, wx.ID_ANY, "")

        txt.Bind(wx.EVT_KILL_FOCUS, self.onTextKillFocus)
        """
        This next line seems to be important for working correctly,
        but I don't understand why:
        """
##        txt.Bind(wx.EVT_SET_FOCUS, self.onTextFocus)

        btn = wx.Button(panel, wx.ID_ANY, "Test")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(txt, 0, wx.ALL, 5)
        sizer.Add(btn, 0, wx.ALL, 5)
        panel.SetSizer(sizer)

    def onTextFocus(self, event):
        print "text received focus!"

    def onTextKillFocus(self, event):
        print "text lost focus!"

if __name__ == '__main__':
    app = wx.App()
    frame = MyForm().Show()
    app.MainLoop()

出乎意料的行为是,当我尝试将焦点从文本框更改为其他任何内容(Tab 键或鼠标单击)时,'text lost focus!' 消息会打印一次,并且不再打印,并且我无法再编辑文本控件。

这是预期的行为吗?如果没有,我做错了什么?

Python 2.7 版、wxPython 3.0.0.0 版、Windows 7 64 位

【问题讨论】:

  • 我尝试了修改后的代码,并且在选项卡上,只要我选项卡,我就会重复文本失去焦点,但我使用的是 wxPython 2.9.5.0。我无法使用 3.0 进行测试,但听起来确实像一个错误。
  • 尝试在 onTextKillFocusonTextFocus 的末尾添加一个 event.Skip()
  • 迈克·德里斯科尔,这行得通。谢谢!如果您想将其作为答案,我会接受。不过,我不明白出了什么问题,或者为什么它会起作用,所以如果你能解释一下,我也很感激。

标签: python windows user-interface wxpython wxwidgets


【解决方案1】:

正如wxEvent::Skip() 文档中所解释的,您应该几乎总是将其用于非命令事件,因为您不想阻止默认处理的发生。

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 2011-11-24
    • 2014-05-27
    • 2022-08-02
    • 2014-04-02
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多