2016-01-06 61 views
0

我有一個textctrl接受用戶輸入。我想在用戶輸入文本後查看文本是否也在預定義的單詞列表中。當textctrl失去焦點時,我可以做這個檢查。我也可以設置它來檢查何時按下回車鍵。然而,如果我這樣做,輸入被檢查兩次(不是很大的交易,但沒有必要)。如果輸入不正確(該單詞不在列表中),則彈出2個錯誤對話框。這並不理想。最好的解決辦法是什麼?wxPython - 防止相同的警告對話框出現兩次

編輯:如果我不清楚,如果輸入不正確並且輸入命中,則會彈出2個警告。這會導致一個對話框出現,這會竊取焦點,導致第二個出現。

+0

設置「警告已發出標誌」 –

回答

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() 

使用的策略是一個標誌添加到實例表明,如果它已經被檢查,如果文本更改覆蓋國旗。

+1

所以本質上,設置「警告已發出標誌」 –