當前位置:編程學習大全網 - 源碼下載 - python如何使用wxpython的combobox讓下拉列表在輸入時自動給出包含該字符的可選列表?

python如何使用wxpython的combobox讓下拉列表在輸入時自動給出包含該字符的可選列表?

要實現這個自動完成功能,您可以使用wx。wxPython中的ComboBox控件並自定義壹個類來實現自動補全。下面是壹個簡單的代碼示例:

進口?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_TEXT事件,然後在設置項目後重新綁定該事件。這樣,當我們更新項目時,就不會觸發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將根據輸入值過濾選項,並顯示正確的選項。

  • 上一篇:怎麽申請博客
  • 下一篇:進超市掃的是什麽碼(進入超市需要掃碼)
  • copyright 2024編程學習大全網