У меня есть TextCtrl с событием EVT_KILL_FOCUS, которое я использую для проверки содержимого поля, предупреждая пользователя, когда значение неверно. После открытия MessageBox я очищаю поле и устанавливаю фокус на поле, которое я снова оставил для проверки. Проблема в том, что текстовый мигающий курсор, который должен появиться внутри поля, исчезает, и я не знаю, почему и как это исправить. Такое поведение заставляет пользователя не знать, в каком поле находится фокус.
У кого-нибудь есть идеи?
...
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()
Но это не сработало.