【问题标题】:After the EVT_KILL_FOCUS event is executed, why does the blinking cursor in TextCtrl disappear?EVT_KILL_FOCUS事件执行后,为什么TextCtrl中闪烁的光标消失了?
【发布时间】:2018-07-03 10:26:29
【问题描述】:

我有一个 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()

但效果不好。

【问题讨论】:

    标签: python python-2.7 wxpython wxwidgets wxtextctrl


    【解决方案1】:

    您不能从KILL_FOCUS 处理程序调用SetFocus()。最直接的解决方法是稍后使用CallAfter() 调用它,但即使这会“工作”,这是一个非常糟糕的主意,因为您不应该阻止用户离开窗口——而且没有办法完全无论如何防止它发生。

    只需将代码标记为无效(例如更改其背景),但不要在失去焦点时尝试保持焦点。

    附:在许多情况下,从焦点事件处理程序调用 MessageBox() 可能也是个坏主意,最好使用 wxLogWarning()CallAfter() 来延迟显示消息框,直到下一次事件循环迭代。

    【讨论】:

    • 我同意,在类似的情况下,我只需更改背景颜色并发出wx.MessageBox() 警告(不知道为什么您认为这是一个坏主意,根据我的经验,它完美无缺)。
    【解决方案2】:

    除了瓦迪姆已经说过的话:

    • 您可以在点击“确定”按钮或对话框/面板即将关闭时进行验证

    • 您可以根据手头的任务使用 wxValidator 来验证用户输入。

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多