首页 > 解决方案 > 将 Combobox 的选定值绑定到子程序

问题描述

我的代码:

import tkinter as tk
from tkinter import ttk

win = tk.Tk()

def assign():
    value = number.get()
    
    if value == 'op1':
        label = tk.Label(win, text = number)
        label.grid(column = 1, row = 0)

number = tk.StringVar()
box = ttk.Combobox(win, textvariable = number, state = 'readonly')
box['values'] = ('op1','op2','op3')

box.set('op2')

box.grid(column = 0, row = 0)

box.bind('<<ComboboxSelected>>', assign())


win.mainloop()

解释:这就是我认为我的程序的工作方式。

box,即Combobox,分配了一个textvariable命名number,我,取 的值box,即('op1', 'op2', 'op3')box然后绑定到一个名为的子程序,该子程序assign()将检索 的值number并将其设置为等于value. 如果value等于'op1',子程序将创建一个名为的标签并将其网格化,该标签label将显示文本 'Hello'。不幸的是,这不起作用。换句话说,我的目标是,当用户选择 中给出的值之一时box['values']assign()运行,如果满足条件,则显示label

输出:

输出

如您所见,即使我选择了'op1'label也不会显示在 旁边box

标签: pythontkinter

解决方案


您必须删除()while usingbind以避免函数调用,然后在函数外部创建一个标签,然后使用从内部更新它config,例如:

label = tk.Label(win)
def assign(event):
    value = number.get() # Get the value
    
    if value == 'op1':
        label.config(text=number) # Update the text
        label.grid(column = 1, row = 0)

box.bind('<<ComboboxSelected>>', assign) # Remove the ()

这样您就不会重写标签,只需使用新值更新标签。

但是我觉得这里没有用StringVar,直接去掉,box.get()用来从combobox中获取值。所以在我看来,最好的做法是:

import tkinter as tk
from tkinter import ttk

win = tk.Tk()

label = tk.Label(win) # Create this outside of function

def assign(event):
    value = box.get() # Get value from combobox
    
    if value == vals[0]: # Check the selected item with the values tuple
        label.config(text=value) # Update the text of label
        label.grid(column=1,row=0)

vals = ('op1','op2','op3') # Tuple of values
box = ttk.Combobox(win,values=vals,state='readonly') # Add value option
box.current(1) # Set the second item as current value
box.grid(column=0,row=0)

box.bind('<<ComboboxSelected>>', assign)

win.mainloop()

推荐阅读