Python 执行EVT_KILL_FOCUS事件后,TextCtrl中闪烁的光标为什么会消失?
我有一个TextCtrl,它有一个EVT_KILL_FOCUS事件,我用它来验证字段的内容,当值出错时提醒用户。打开MessageBox后,我清除字段,并将焦点设置为我再次离开的字段。问题是应该出现在字段内的文本闪烁光标消失了,我不知道为什么或者如何修复它。此行为会导致用户不知道焦点位于哪个字段中 有人有什么想法吗Python 执行EVT_KILL_FOCUS事件后,TextCtrl中闪烁的光标为什么会消失?,python,python-2.7,wxpython,wxwidgets,wxtextctrl,Python,Python 2.7,Wxpython,Wxwidgets,Wxtextctrl,我有一个TextCtrl,它有一个EVT_KILL_FOCUS事件,我用它来验证字段的内容,当值出错时提醒用户。打开MessageBox后,我清除字段,并将焦点设置为我再次离开的字段。问题是应该出现在字段内的文本闪烁光标消失了,我不知道为什么或者如何修复它。此行为会导致用户不知道焦点位于哪个字段中 有人有什么想法吗 ... self.txtCode = wx.TextCtrl(self, value='') self.txtCode.Bind(wx.EVT_KILL_FO
...
self.txtCode = wx.TextCtrl(self, value='')
self.txtCode.Bind(wx.EVT_KILL_FOCUS, self.__onTxtCodeKillFocus)
self.txtCode.Bind(wx.EVT_CHAR_HOOK, self.__onTxtCodeTabKey)
def __validateTxtCodeContent(self):
if self.txtCode.GetValue() == "":
self.MessageBox(self, "Error Text", _("Warning"))
return False
return True
def __onTxtCodeKillFocus(self, event):
event.Skip()
if self.__validateTxtCodeContent() == False:
self.txtCode.SetValue("")
self.txtCode.SetFocus()
def __onTxtCodeTabKey(self, event):
key = event.GetKeyCode()
shift = event.ShiftDown()
# 9 = TAB, 13 = ENTER
if key != 9 and key != 13:
event.Skip()
return
elif key == 9:
if self.__validateTxtCodeContent():
if shift:
self.btnSave.SetFocus()
else:
self.txtDescription.SetFocus()
else:
self.txtCode.SetValue("")
self.txtCode.SetFocus()
else:
return False
我的验证不仅针对空字段,而且例如,只能验证空字段
重要提示:在EVT_CHAR_HOOK事件中,这种行为也会发生
我也试着用这个:
self.txtCode.SetValue("")
self.txtCode.SetFocus()
self.txtCode.SetInsertionPointEnd()
self.txtCode.Refresh()
但是它没有很好地工作。您不能从
KILL\u FOCUS
处理程序调用SetFocus()
。最直接的解决方法是使用CallAfter()
稍微晚一点调用它,但尽管这会“起作用”,但这是一个非常糟糕的主意,因为您不应该阻止用户离开窗口,而且无论如何也无法完全阻止它的发生
只需将代码标记为无效(例如更改其背景),但在丢失代码时不要试图保持焦点
另外,从焦点事件处理程序调用
MessageBox()
在许多情况下可能是一个坏主意,最好使用wxLogWarning()
或CallAfter()
延迟显示消息框,直到下一个事件循环迭代。除了Vadim已经说过的:
- 您可以点击“确定”按钮或在对话框/面板即将关闭时进行验证
- 根据手头的任务,您可以使用wxValidator验证用户输入
wx.MessageBox()
警告(不确定您为什么认为这是一个坏主意,根据我的经验,它可以完美地工作)。