2017-08-09 142 views
0

在代碼中,我將事件self.Bind(wx.EVT_TEXT, self.OnText)綁定到wx.ComboBox。 OnText被調用兩次。我也看到了與其他事件類似的行爲。爲什麼在wx.ComboBox wx.EVT_TEXT事件被調用兩次?

我的問題是:

  • 它是一個預期的行爲?
  • 如果是,如何正確處理 他們?

我看到了以下解決方案:

def OnText(self, event): 
    if self.event_skip: 
     self.event_skip = False 
     return 
    do_somthing() 
    self.event_skip = True 

回答

2

可以說,回答你的第一個問題是肯定的!
您對wx.EVT_TEXT有約束力,而不是更常見的wx.EVT_COMBOBOX,我期望的結果將是觸發組合框中每個文本事件的事件,例如鍵入或取消其中的字符。
我懷疑,你真正想要的是wx.EVT_TEXT_ENTER,只有當你按下回車鍵時纔會發出一個事件,這將允許你輸入一個不在choices中的選擇。爲此,您需要使用style=wx.TE_PROCESS_ENTER選項創建組合框。
的組合框的事件有:

EVT_COMBOBOX: Process a wxEVT_COMBOBOX event, when an item on the list is selected. Note that calling GetValue returns the new value of selection. 
EVT_TEXT: Process a wxEVT_TEXT event, when the combobox text changes. 
EVT_TEXT_ENTER: Process a wxEVT_TEXT_ENTER event, when RETURN is pressed in the combobox (notice that the combobox must have been created with wx.TE_PROCESS_ENTER style to receive this event). 
EVT_COMBOBOX_DROPDOWN: Process a wxEVT_COMBOBOX_DROPDOWN event, which is generated when the list box part of the combo box is shown (drops down). Notice that this event is only supported by wxMSW, wxGTK with GTK+ 2.10 or later, and OSX/Cocoa. 
EVT_COMBOBOX_CLOSEUP: Process a wxEVT_COMBOBOX_CLOSEUP event, which is generated when the list box of the combo box disappears (closes up). This event is only generated for the same platforms as wxEVT_COMBOBOX_DROPDOWN above. Also note that only wxMSW and OSX/Cocoa support adding or deleting items in this event. 

編輯: 我看了一下你對對方的回答的註釋中引用的代碼。這有點令人困惑,因爲它指的是self.ignoreEvtText,這看起來好像與eventEVT_TEXT有某種關係。
它不是!編碼器設置變量了自己,

self.Bind(wx.EVT_TEXT, self.EvtText) 
self.Bind(wx.EVT_CHAR, self.EvtChar) 
self.Bind(wx.EVT_COMBOBOX, self.EvtCombobox) 
self.ignoreEvtText = False 

,並用它來操縱會發生什麼,因爲他們勢必3個事件相同的組合框。
如果用戶從選項wx.EVT_COMBOBOX中選擇一個項目,或者用戶按back tab(鍵碼8)wx.EVT_CHAR,則忽略wx.EVT_TEXT事件。
我希望能澄清一些事情。

+0

非常感謝您的回答。我意識到,捕捉此事件並操縱其中的文本以進行自動完成時,文本操作可觸發第二個事件。我對嗎?你的意思是?在你答案的第一部分中,我並沒有完全理解你對第一個問題說「是」的含義。不知何故,我創建了這個問題,因爲我有雙重事件的經驗,例如停靠時的aui.EVT_AUI_PERSPECTIVE_CHANGED事件。但我想我應該爲這個問題提出另一個問題,因爲它超出了範圍。 – Eddmik

+0

你在這篇文章中的第一個問題是「這是一個預期的行爲?」就是這樣,我正在迴應。後來我意識到你在回答其他答案時發佈了一個例子,我在編輯中回覆了這個答案。我指的是在綁定到'wx.EVT_TEXT'後,由於文本操作觸發了可能的多個事件,就像你說的那樣。 –

0

我不認爲讓兩個事件是預期的行爲。我構建了wx.TextCtrl的最小工作示例,不管我試過了,這種控制的內容的一個變化解僱了只有一個wx.EVT_TEXT事件對我來說,不是兩個:

import time 
import wx 

def evthandler(evt): 
    print(time.time()) 

if __name__ == "__main__": 
    app = wx.App() 
    frame = wx.Frame(None) 
    text = wx.TextCtrl(frame) 
    text.Bind(wx.EVT_TEXT, evthandler) 
    frame.Show() 
    app.MainLoop() 
+0

這裏是一個例子我的意思是:對於wx.Combobox而不是wx.TextCtrl。 https://wiki.wxpython.org/Combo%20Box%20that%20Suggests%20Options – Eddmik

相關問題