2014-04-15 23 views
0

我希望我的wxPython应用程序在文本输入小部件失去焦点时触发事件。我按照教程here,其中描述使用wx.EVT_KILL_FOCUS。但是,我收到意想不到的行为。为什么wxPython的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位

+0

我试过修改后的代码,并在tabb我得到文本失去焦点重复只要我选项卡,但我使用的是wxPython 2.9.5.0。我无法用3.0测试,但它听起来像一个错误。 – pedram

+0

尝试将** event.Skip()**添加到** onTextKillFocus **和** onTextFocus **的末尾。 –

+0

迈克Driscoll,那工作。谢谢!如果您想将此作为答案,我会接受它。我不明白什么是错的,或者它为什么起作用,所以如果你能解决任何问题,我也会很感激。 – Andrew

回答

2

wxEvent::Skip()文档说明,你应该几乎无一例外地把它称为​​非命令事件,你不想阻止从发生的默认处理。

相关问题