[英]Bind Tkinter Combobox to Entry change?
我有一個ttk.Combobox
,我的用戶可以從選項下拉列表中 select ,或手動輸入一些內容。我將它綁定到Return
,這樣如果我的用戶在進行更改后按下 return ,它將更新,但如果我的用戶單擊該框並意外輸入其他內容,這將導致錯誤。 需要明確的是,我已經有一個綁定到新選擇的事件,以及按下回車鍵。
我在問是否可以在焦點離開框時檢查框值是否已更改,如果是,則調用 function? 當我嘗試使用FocusOut
綁定時,每次單擊其中一個下拉菜單時,它都會調用我的 function 並且不會讓我 select 下拉列表中的任何內容,所以這不起作用。
selection.bind('<Return>', lambda event, entry=selection, row=row: update(
updated_entry=entry.get(), row=row, entry=entry))
selection.bind('<<ComboboxSelected>>', lambda event, entry=selection, row=row: update(
updated_entry=entry.get(), row=row, entry=entry))
編輯:這是一個示例代碼。 這種寫法,如果用戶從下拉列表中選擇一個項目,它會更新 label。 如果用戶輸入內容並按下 Return 鍵,它會更新 label。 但如果用戶輸入內容並單擊另一個下拉菜單,則不會更新 label。
import tkinter as tk
from tkinter import ttk
def update(updated_entry, row, entry):
label = tk.Text(root, height=1, width=10)
label.insert(tk.END, updated_entry)
label.grid(row=row, column=2)
return 'break'
def gui(root):
root.geometry('300x150')
root.config(background='snow3')
for row in range(2):
options = ['test', 'test1', 'test2']
selection = tk.ttk.Combobox(root, value=options)
selection.bind('<Return>', lambda event, entry=selection, row=row: update(
updated_entry=entry.get(), row=row, entry=entry))
selection.bind('<<ComboboxSelected>>', lambda event, entry=selection, row=row: update(
updated_entry=entry.get(), row=row, entry=entry))
selection.grid(row=row, column=1)
label = tk.Text(root, height=1, width=10)
label.grid(row=row, column=2)
if __name__ == '__main__':
root = tk.Tk()
gui(root)
tk.mainloop()
ttk.Combobox
是Entry
小部件的子類,這意味着您可以像添加到它們的基礎 class 一樣向它們添加驗證。 即通過使用validate=
和validatecommand=
選項Entry
的支持。
這樣做的原因是因為“驗證”將允許在關聯的Combobox
失去焦點時檢查它的內容——即你聲明的目標。 這應該與您已經擁有的綁定事件處理一起正常工作。 以下代碼類似於您的最小可重現示例,說明了如何處理類似的事情。
注意:這種方法還允許對用戶輸入的值進行一些真正的驗證,以防止以后在它們無效時出現問題。
import tkinter as tk
from tkinter import ttk
def update(updated_entry, entry):
''' Combobox change Callback. '''
entry.delete('1.0', tk.END)
entry.insert(tk.END, updated_entry)
def gui(root):
root.geometry('300x150')
root.config(background='snow3')
for row in range(2):
text = tk.Text(root, height=1, width=10) # Widget to be updated.
text.grid(row=row, column=2)
def check_okay(new_value, text=text):
update(new_value, text)
return True # Note: accepts anything.
combobox = ttk.Combobox(root, value=('test', 'test1', 'test2'),
validate='focusout',
validatecommand=(root.register(check_okay), '%P'))
combobox.grid(row=row, column=1)
combobox.bind('<Return>', lambda event, entry=combobox, text=text:
update(entry.get(), entry=text))
combobox.bind('<<ComboboxSelected>>', lambda event, entry=combobox, text=text:
update(entry.get(), entry=text))
if __name__ == '__main__':
root = tk.Tk()
gui(root)
tk.mainloop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.