python - 将 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
。
解决方案
您必须删除()
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()
推荐阅读
- swift - 如何使用 SCNShaderModifierEntryPointGeometry?
- javascript - 如何从 Three.JS AudioContext 将音频连接到 MediaStream
- node.js - 在 AWS Lambda NodeJS 中创建和访问通用代码
- css - 有没有办法在 kendo-ui 网格中显示/隐藏列后自动调整网格列宽?
- c++ - Infineons Tle493d_w2b6 传感器示例中的编译错误
- jquery - 自定义 typeform 按钮
- javascript - 错误类型错误:无法读取未定义的属性“-LlWio7vFBuxfeviKdWa”
- c++ - 将对象按值传递给子类构造函数导致超类的构造函数不调用
- android - 当我杀死应用程序广播接收器未在前台运行时将重新启动
- c++ - 如何使用类函数来处理中断?