您的位置:首页 > 编程语言 > Python开发

关于wxPython中的TextCtrl响应失去焦点事件后不能再次编辑或出现不正常现象的解决办法

2015-10-04 15:27 781 查看
关于wxPython中的TextCtrl响应失去焦点事件后不能再次编辑或出现不正常现象的解决办法

关键字:EVT_KILL_FOCUS self.Bind( ) TextCtrl wxPython 失去焦点

不能再次编辑 event.Skip( )

本人最近用Python写一个小程序,发现如果在wxpython中将TextCtrl绑定EVT_KILL_FOCUS事件后,一开始的确能够响应,但响应之后,该TextCtrl(也即是文本框)不能再次编辑,但可以选中,同时也不会再度响应该事件,表现为鼠标不正常与键盘不能输入响应过事件之后的TextCtrl。为此在国内查找了很久,都没有关于这类型的全面解决办法,后来在外国网站搜到了同样问题,然后得到了启发。

例如,写一个文本框绑定失去焦点事件是这样写的:

self.TextCtrl.Bind(wx.EVT_KILL_FOCUS,self.onKillFocus)

不能写成

self.Bind(wx.EVT_KILL_FOCUS,self.onKillFocus,self.TextCtrl)

因为失去焦点事件是非命令事件(non-command event)

像下面这种写法是不会得到事件响应的。

请参考这里http://wiki.wxpython.org/self.Bind%20vs.%20self.button.Bind

然后其实在wx.Bind方法中传递了一个默认隐藏的参数:event,它就是一个Event对象,Event里面有一个方法是Skip(),Skip()方法是什么,这里引用别人的解释,“event.skip()的作用是告诉MainLoop继续处理这个消息,而不是在当前handler处理完了就中断了,就是说如果其他的parent的窗口或者paragate窗口还有相应的handler时,也应该调用他们。”

不知道上述说法是否官方的,正确的,我也没有深究,反正与我出现的现象是有出入的。我觉得理解为跳过事件,让事件停止,重新等待响应更好。

然后在onKillFocus方法中最后加上这句,像下面这样就可以了。

def onKillFocus(self,event):
.....
事件执行代码
.....
event.Skip()   #最后加上这句就可以正常再次响应事件了


本文为原创文章,由于本人理解不够充分,文章可能会出现不足或错误,恳请各位留言指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: