簡體   English   中英

將 Tkinter Combobox 綁定到條目更改?

[英]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.ComboboxEntry小部件的子類,這意味着您可以像添加到它們的基礎 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM