簡體   English   中英

如何將函數綁定到 Ttk Combobox 對於 Combobox 的值的每次變化唯一

[英]How to bind Functions to Ttk Combobox uniquely for every change in value of Combobox

我想以唯一的方式鏈接一對組合框,例如 Combobox 中的值取決於另一個 Combobox 中的當前值。 但我無法讓它工作。 只有一個 Combobox 的初始值對另一個 Combobox 中的值有影響。 此外,我希望在 combobox 的值發生變化時調用 function。

import tkinter as tk
from tkinter import ttk

class Win(tk.Tk):
    opt_dic1 = {'Option1' : ['1', '2'], 'Option2' : ['3', '4']}
    opt_dic2 = {'Option3' : ['5', '6'], 'Option4' : ['7', '8']}
    def __init__(self):
        super().__init__()
        top = tk.Frame(self)
        btm = tk.Frame(self)
        cmb1 = ttk.Combobox(top, values = list(Win.opt_dic1.keys()))
        cmb2 = ttk.Combobox(top)
        cmb3 = ttk.Combobox(btm, values = list(Win.opt_dic2.keys()))
        cmb4 = ttk.Combobox(btm)
        top.pack(side = 'top')
        btm.pack(side = 'bottom')
        cmb1.pack(side = 'left')
        cmb2.pack(side = 'left')
        cmb3.pack(side = 'left')
        cmb4.pack(side = 'left')
        cmb1.current(0)
        cmb3.current(0)
        cmb1.bind('<<ComboboxSelected>>', cmb2.config(values = Win.opt_dic1[cmb1.get()]))
        cmb3.bind('<<ComboboxSelected>>', cmb4.config(values = Win.opt_dic2[cmb3.get()]))

if __name__ == '__main__':
    Win().mainloop()

我期望結果為 cmb2 中的 (1,2) 用於 cmb1 中的 Option1 , cmb2 中的 (3,4) 用於 cmb1 中的 Option2 和 cmb4 中的 (5,6) 用於 cmb3 中的 Option3 等等。

Well i just tried throwing the command with lambda: but then i got an error <lambda> takes 0....but 1 was given so i just add a argument in lambda function as lambda x: <function> and now i get the相同的預期結果,即代碼現在完美運行,但即使我已經讓它工作但我仍然不完全理解它是如何解決的,如果有人能解釋它會很有幫助。

Well i just tried throwing the command with lambda: but then i got an error takes 0....but 1 was given so i just add a argument in lambda function as lambda x: and now i get the same expected result ie, the代碼現在完美運行,但即使我已經讓它工作了,但我仍然不完全理解它是如何解決的

您的lambda正在通過bind()發送一個事件。 這就是您的錯誤的來源。 通過將x添加到您的 lambda 中,通過允許一個位置參數來處理該事件。 如果沒有正確格式化的 lambda,您的代碼無法工作的原因是由於有括號cmb2.config()和其他配置。 當您將某些命令/函數分配給bind()時,您需要保存對命令/函數的引用,而不是調用它。 這是通過不使用括號來完成的,但同時您不能通過 arguments。 這就是 lambda 所允許的。

以 lambda 為例:

import tkinter as tk
from tkinter import ttk


class Win(tk.Tk):
    opt_dic1 = {'Option1': ['1', '2'], 'Option2': ['3', '4']}
    opt_dic2 = {'Option3': ['5', '6'], 'Option4': ['7', '8']}

    def __init__(self):
        super().__init__()
        top = tk.Frame(self)
        btm = tk.Frame(self)
        cmb1 = ttk.Combobox(top, values=list(Win.opt_dic1.keys()))
        cmb2 = ttk.Combobox(top)
        cmb3 = ttk.Combobox(btm, values=list(Win.opt_dic2.keys()))
        cmb4 = ttk.Combobox(btm)
        top.pack(side='top')
        btm.pack(side='bottom')
        cmb1.pack(side='left')
        cmb2.pack(side='left')
        cmb3.pack(side='left')
        cmb4.pack(side='left')
        cmb1.current(0)
        cmb3.current(0)
        cmb1.bind('<<ComboboxSelected>>', lambda x: cmb2.config(values=Win.opt_dic1[cmb1.get()]))
        cmb3.bind('<<ComboboxSelected>>', lambda x: cmb4.config(values=Win.opt_dic2[cmb3.get()]))


if __name__ == '__main__':
    Win().mainloop()

沒有 lambda 的示例:

import tkinter as tk
from tkinter import ttk


class Win(tk.Tk):
    opt_dic1 = {'Option1': ['1', '2'], 'Option2': ['3', '4']}
    opt_dic2 = {'Option3': ['5', '6'], 'Option4': ['7', '8']}

    def __init__(self):
        super().__init__()
        top = tk.Frame(self)
        btm = tk.Frame(self)
        self.cmb1 = ttk.Combobox(top, values=list(Win.opt_dic1.keys()))
        self.cmb2 = ttk.Combobox(top)
        self.cmb3 = ttk.Combobox(btm, values=list(Win.opt_dic2.keys()))
        self.cmb4 = ttk.Combobox(btm)
        top.pack(side='top')
        btm.pack(side='bottom')
        self.cmb1.pack(side='left')
        self.cmb2.pack(side='left')
        self.cmb3.pack(side='left')
        self.cmb4.pack(side='left')
        self.cmb1.current(0)
        self.cmb3.current(0)
        self.cmb1.bind('<<ComboboxSelected>>', self.config_cmb2)
        self.cmb3.bind('<<ComboboxSelected>>', self.config_cmb4)

    def config_cmb2(self, _=None):
        self.cmb2.config(values=Win.opt_dic1[self.cmb1.get()])

    def config_cmb4(self, _=None):
        self.cmb4.config(values=Win.opt_dic2[self.cmb3.get()])


if __name__ == '__main__':
    Win().mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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