進口?women's extra large size 女式特大號
班級?AutoCompleteComboBox(wx。組合框):
def?__init__(self,*參數,?* *誇脫):
超級(AutoCompleteComboBox,?自我)。__init__(*args,* *克瓦查)
自我選擇?=?[]
自我。綁定(wx。EVT_TEXT,?自我。上下文)
自我。綁定(wx。EVT組合框,?自我。OnSelect)
def?SetChoices(self,選擇):
自我選擇?=?選擇
def?context(self,事件):
輸入_文本?=?事件。GetString()
如果?不是嗎?輸入_文本:
自我。設置項目(自我選擇)
返回
過濾_選擇?=?【選擇?為了什麽?選擇?在?自我選擇?如果?input _ text.lower()?在?choice.lower()]
自我。SetItems(filtered_choices)
自我。彈出菜單()
def?OnSelect(self,事件):
及格
班級?MyFrame(wx。框架):
def?__init__(self,家長,?標題):
超級(MyFrame,?自我)。__init__(父級,title =標題,?size=(400,?300))
面板?=?wx。面板(自身)
自我。綁定(wx。EVT _克洛斯?自我。OnClose)
選擇?=?【「蘋果」,?“香蕉”,?“櫻桃”,?“日期”,?“無花果”,?“葡萄”,?「奇異果」,?“檸檬”,?“芒果”,?"橙色"]
self.combo_box?=?AutoCompleteComboBox(面板,?pos=(50,?50),?size=(200,?-1),?選擇=選擇,?style=wx。CB _下拉菜單)
self.combo_box。SetChoices(選擇)
def?OnClose(self,?事件):
自我。銷毀()
如果?__name__?==?" __main__ "
app?=?wx。應用程序(假)
框架?=?MyFrame(無,“自動完成?ComboBox?示例”)
框架。顯示()
app。主循環()
在這個例子中,我們首先創建了壹個AutoCompleteComboBox類,它繼承自wx。我們在這個類中添加了SetChoices方法來設置所有可能的選項。然後,我們通過監聽wx來監聽輸入框中文本的變化。EVT _文本事件。當文本改變時,我們根據輸入的文本過濾下拉列表中的選項,並顯示過濾的結果。
請註意,本例中使用的數據是固定的字符串列表。如果您需要從數據庫中獲取數據,只需用數據庫查詢的結果替換選項。
…………
回復:
經過仔細檢查,我發現在OnText方法中更新ComboBox項目確實存在問題。當我們使用SetItems方法設置壹個項目時,文本框的內容將被清除,這將觸發另壹個wx。EVT _文本事件。因此,我們需要稍微修改壹下OnText方法,以避免無限遞歸。
以下是壹個固定代碼示例:
導入wx
類AutoCompleteComboBox(wx。組合框):
def __init__(self,*args,**kwargs):
超級(AutoCompleteComboBox,self)。__init__(*args,**kwargs)
self.choices = []
自我。綁定(wx。EVT _文本,自我。上下文)
自我。綁定(wx。EVT組合框,自我。OnSelect)
定義集合選擇(自我,選擇):
自我選擇=選擇
定義上下文(自身,事件):
輸入文本=事件。GetString()
如果不是輸入文本:
自我。設置項目(自我選擇)
返回
filtered _ choices =[choice for choice in self . choices if input _ text . lower()in choice . lower()]
#設置項目時避免遞歸調用OnText。
自我。解除綁定(wx。EVT _正文)
自我。SetItems(filtered_choices)
自我。綁定(wx。EVT _文本,自我。上下文)
自我。SetValue(input_text)?#更新項目後重置文本值
自我。SetInsertionPointEnd()?#將光標移動到文本的末尾
自我。彈出菜單()
定義OnSelect(自身,事件):
及格
# ...(代碼的其余部分保持不變)
這裏的關鍵變化是解除wx的綁定。EVT _文本事件,然後在設置項目後重新綁定該事件。這樣,當我們更新項目時,就不會觸發OnText方法。我們還使用SetValue方法來重置文本值,並將光標移動到文本的末尾。
經過這些更改後,代碼應該能夠正常運行,而不會導致無限遞歸和不斷增長的項目列表。
…………
回復:
下面是根據您的要求修改的代碼示例。主要修改是在更新ComboBox項目後,使用ChangeValue方法代替SetValue方法設置文本值,從而在不觸發EVT _文本事件的情況下改變文本值。
導入wx
類AutoCompleteComboBox(wx。組合框):
def __init__(self,*args,**kwargs):
超級(AutoCompleteComboBox,self)。__init__(*args,**kwargs)
self.choices = []
自我。綁定(wx。EVT _文本,自我。上下文)
自我。綁定(wx。EVT組合框,自我。OnSelect)
定義集合選擇(自我,選擇):
自我選擇=選擇
定義上下文(自身,事件):
輸入文本=事件。GetString()
如果不是輸入文本:
自我。設置項目(自我選擇)
返回
filtered _ choices =[choice for choice in self . choices if input _ text . lower()in choice . lower()]
#設置項目時避免遞歸調用OnText。
自我。解除綁定(wx。EVT _正文)
自我。SetItems(filtered_choices)
自我。綁定(wx。EVT _文本,自我。上下文)
自我。ChangeValue(input_text)?#在不觸發EVT文本的情況下設置文本值
自我。SetInsertionPointEnd()?#將光標移動到文本的末尾
自我。彈出菜單()
定義OnSelect(自身,事件):
及格
# ...(代碼的其余部分保持不變)
現在,使用ChangeValue方法更新輸入值後,輸入框中的文本將保持不變,可以連續輸入多個字符。ComboBox將根據輸入值過濾選項,並顯示正確的選項。