[英]tkinter ttk.Combobox dropdown/expand and focus on text
我正在嘗試在 tkinter 中使用組合框創建一個搜索欄,我希望在用戶輸入時他們可以看到組合框用值擴展。 我能夠擴展組合框,但是隨着組合框值的擴展,對組合框條目(文本框)的關注丟失了。 我也曾嘗試在擴展組合框值后設置 textvariable 的焦點,但仍然徒勞無功。 請在不創建類的情況下提供解決方案。
# tkinter modules
import tkinter as tk
import tkinter.ttk as ttk
win=tk.Tk()
searchVar = tk.StringVar()
searchVar.trace("w", lambda name, index, mode, searchVar=searchVar:
on_searchText_edit())
searchBar=ttk.Combobox(win,values=["1","2","3"],width=50,textvar=searchVar)
searchBar.grid(row=0,column=1,columnspan=2,padx=5,pady=5)
def on_searchText_edit():
txt=searchBar.focus_get() #searchVar has the focus
searchBar.event_generate('<Down>')
txt.focus_set()
我相信您將需要創建自己的小部件來完成此任務。 您可以結合使用一個條目小部件和一個列表框來執行此操作。 我已經將一些代碼放在一起,為您展示了這個概念。 輸入區分大小寫。 該代碼並不完美,但您可以對其進行調整以滿足您的需要。
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('420x200')
frm = tk.Frame(self)
self.var = tk.StringVar()
ent = tk.Entry(frm, textvariable=self.var, fg='black', bg='white')
lst = tk.Listbox(frm, bd=0, bg='white')
item_list = ('Big Dog', 'Big Cat', 'big bird', 'Small Bird', 'Small Fish', 'Little Insect', 'Long Snake')
ent.grid(sticky=tk.EW)
frm.grid(sticky=tk.NW)
def get_input(*args):
lst.delete(0, tk.END)
string = self.var.get()
if string:
for item in item_list:
if item.startswith(string):
lst.insert(tk.END, item)
lst.itemconfigure(tk.END, foreground="black")
for item in item_list:
if item.startswith(string):
lst.grid(sticky=tk.NSEW)
elif not lst.get(0):
lst.grid_remove()
else:
lst.grid_remove()
def list_hide(e=None):
lst.delete(0, tk.END)
lst.grid_remove()
def list_input(_):
lst.focus()
lst.select_set(0)
def list_up(_):
if not lst.curselection()[0]:
ent.focus()
list_hide()
def get_selection(_):
value = lst.get(lst.curselection())
self.var.set(value)
list_hide()
ent.focus()
ent.icursor(tk.END)
self.var.trace('w', get_input)
ent.bind('<Down>', list_input)
ent.bind('<Return>', list_hide)
lst.bind('<Up>', list_up)
lst.bind('<Return>', get_selection)
def main():
app = App()
app.mainloop()
if __name__ == '__main__':
main()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.