wxPython - 防止相同的警告对话框出现两次

Posted

技术标签:

【中文标题】wxPython - 防止相同的警告对话框出现两次【英文标题】:wxPython - Prevent the same warning dialog from appearing twice 【发布时间】:2016-01-06 16:30:31 【问题描述】:

我有一个 textctrl 接受用户输入。我想在用户输入文本后检查文本,看看它是否也在预定义的单词列表中。当 textctrl 失去焦点时,我可以进行此检查。我还可以将其设置为检查何时按下回车键。但是,如果我两者都做,输入会被检查两次(不是什么大问题,但不是必需的)。如果输入不正确(单词不在列表中),则会弹出 2 个错误对话框。这并不理想。解决这个问题的最佳方法是什么?

编辑:如果我不清楚,如果输入不正确并按 Enter 键,则会弹出 2 个警告。这会导致出现一个对话框,从而窃取焦点,导致出现第二个。

【问题讨论】:

设置“已发出警告标志” 【参考方案1】:

此演示代码符合您的条件。 您应该能够在单独的文件中完整地测试运行它。

    import sys; print sys.version
    import wx; print wx.version()


    class TestFrame(wx.Frame):

        def __init__(self):
            wx.Frame.__init__(self, None, -1, "hello frame")
            self.inspected = True
            self.txt = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
            self.txt.SetLabel("this box must contain the word 'hello' ")
            self.txt.Bind(wx.EVT_TEXT_ENTER, self.onEnter)
            self.txt.Bind(wx.EVT_KILL_FOCUS, self.onLostFocus)
            self.txt.Bind(wx.EVT_TEXT, self.onText)

        def onEnter(self, e):
            self.inspectText()

        def onLostFocus(self, e):
            self.inspectText()

        def onText(self, e):
            self.inspected = False

        def inspectText(self):
            if not self.inspected:
                self.inspected = not self.inspected
                if 'hello' not in self.txt.GetValue():
                    self.failedInspection()
            else:
                print "no need to inspect or warn user again"

        def failedInspection(self):
            dlg = wx.MessageDialog(self,
                                   "The word hello is required before hitting enter or changing focus",
                                   "Where's the hello?!",
                                   wx.OK | wx.CANCEL)
            result = dlg.ShowModal()
            dlg.Destroy()
            if result == wx.ID_OK:
                pass
            if result == wx.ID_CANCEL:
                self.txt.SetLabel("don't forget the 'hello' !")

    mySandbox = wx.App()
    myFrame = TestFrame()
    myFrame.Show()
    mySandbox.MainLoop()
    exit()

使用的策略是向实例添加一个标志以指示它是否已被检查,并在文本更改时覆盖该标志。

【讨论】:

以上是关于wxPython - 防止相同的警告对话框出现两次的主要内容,如果未能解决你的问题,请参考以下文章

如何防止VBS的错误提示

如何防止在node.js中两次调用相同URL的获取

如何防止在包含的文件中包含两次相同的文件?

React - 防止生命周期组件两次渲染相同的数据:WillReceiveProps & componentDidMount

在 Android 应用程序中使用 MultiDex 运行 ProGuard 两次,只有第二次出现警告/注释?

wxpython 对话框