2016-03-13 110 views
-1

我有一個文本ctrl用戶給數字。 一旦他完成我想執行操作。如何使EVT_TEXT_ENTER與EVT_KILL_FOCUS一起工作?

我知道用戶完成時,textctrl失去了焦點或當他按下輸入。

我做了以下內容:

 self.a= wx.TextCtrl(self, -1,style=wx.TE_PROCESS_ENTER) 
     self.a.Bind(wx.EVT_KILL_FOCUS, self.OnA) 
     self.a.Bind(wx.EVT_TEXT_ENTER, self.OnA) 

    def onA(self,event): 
     print "hello" 
     event.Skip() 

我的問題是,如果用戶點擊別的地方用鼠標然後eveything作品。你好打印一次,這意味着發生了EVT_KILL_FOCUS。 但如果使用按回車比你好打印兩次。這意味着EVT_KILL_FOCUSEVT_TEXT_ENTER都發生了。我不想兩次完成事件。

我該怎麼辦?

回答

0

最簡單的答案不是爲兩個事件編寫代碼。
我會選擇EVT_KILL_FOCUS而忘記了EVT_TEXT_ENTER,記得刪除event.Skip()
編輯:
您的問題是,你是混合wx.Event(殺對焦)和wx.commandevent(ENTER)參見:http://wiki.wxpython.org/EventPropagation爲更多信息。我認爲這裏的問題在於wx.commandevent(Enter)導致了kill-focus事件。
編輯2:
將事件分配給不同的功能。
在這種用於EVT_TEXT_ENTER功能取消綁定EVT_KILL_FOCUS,輸出你的錯誤消息,然後重新綁定EVT_KILL_FOCUS事件

self.a.Unbind(wx.EVT_KILL_FOCUS) 
(do whatever to announce that there is a error here) 
self.a.Bind(wx.EVT_KILL_FOCUS, self.OnA) 
+0

這不是我的決定......它的客戶端請求。爲什麼要刪除event.Skip()? – java

+0

'event.Skip()'告訴它繼續處理除此之外的事件,在這種情況下,這是您需要的最後一件事。 –

+0

它僅適用於在相同功能或一般事件中處理的事件嗎?說我也有self.a.Bind(wx.EVT_TEXT,self.OnB) – java