Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 执行EVT_KILL_FOCUS事件后,TextCtrl中闪烁的光标为什么会消失?_Python_Python 2.7_Wxpython_Wxwidgets_Wxtextctrl - Fatal编程技术网

Python 执行EVT_KILL_FOCUS事件后,TextCtrl中闪烁的光标为什么会消失?

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

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

但是它没有很好地工作。

您不能从
KILL\u FOCUS
处理程序调用
SetFocus()
。最直接的解决方法是使用
CallAfter()
稍微晚一点调用它,但尽管这会“起作用”,但这是一个非常糟糕的主意,因为您不应该阻止用户离开窗口,而且无论如何也无法完全阻止它的发生

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


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

除了Vadim已经说过的:

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

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


我同意,在类似的情况下,我只需更改背景颜色并发出
wx.MessageBox()
警告(不确定您为什么认为这是一个坏主意,根据我的经验,它可以完美地工作)。