如何让ttk.Label的文本在Combobox选中项变更时自动更新?
问题解决:tkinter Combobox选中后Label文本不更新
问题根源
无法更新的问题有两个核心原因:
- handler函数内修改的
value是局部变量,和初始化的全局value变量无关,修改局部变量不会影响Label的初始绑定值 - tkinter的Label控件默认是静态绑定文本值,仅修改普通Python变量不会触发控件自动刷新,需要用tkinter专属的
StringVar绑定动态内容,或在事件回调里手动更新Label配置
修改方案
只需要调整create_input_frame函数内的逻辑,用StringVar绑定PH值显示Label即可,修改后的完整代码如下:
import tkinter as tk from tkinter import ttk from tkinter import * from time import * vegetable_needs = { 'Tomato': {'ph': '6', 'moisture': '60', 'humidity': '70'}, 'Bell pepper': {'ph': '9', 'moisture': '61', 'humidity': '71'}, 'Cucumber': {'ph': '2', 'moisture': '62', 'humidity': '72'}, 'Broccoli': {'ph': '4', 'moisture': '63', 'humidity': '73'}, 'Green Bean': {'ph': '1', 'moisture': '64', 'humidity': '74'}, 'Zucchini': {'ph': '5', 'moisture': '65', 'humidity': '75'}, 'Sweet potatoe': {'ph': '0', 'moisture': '66', 'humidity': '76'} } #Create Frame def create_input_frame(container): #declare string variables vegetable = tk.StringVar() # 新增:绑定PH值显示的StringVar ph_value = tk.StringVar(value="?") frame = tk.Frame(container, borderwidth=1, relief=RIDGE, padx=15, pady=10) options = ttk.Combobox(frame, width = 20, textvariable = vegetable) #list of veggies options['values'] = ( "Tomato", "Bell pepper", "Cucumber", "Broccoli", "Green Bean", "Zucchini", "Sweet potatoe" ) options['state'] = 'readonly' ttk.Label(frame, text = "Select a veggie: ", font = ("Times New Roman", 10)).grid(column=0, row=0, padx=5, pady=0) options.grid(column = 1, row = 0) # 可选:默认选中第一个选项,不需要可以删除 options.current(0) def handler(event): current = options.current() if current != -1: ph_level = vegetable_needs[vegetable.get()]['ph'] # 直接修改StringVar的值,会自动刷新绑定的Label ph_value.set(ph_level) print(ph_level) options.bind('<<ComboboxSelected>>', handler) # 改用textvariable绑定动态值 ttk.Label(frame, textvariable=ph_value).grid(column=1, row=2) ttk.Label(frame, text='PH Level').grid(column=0, row=2) return frame #Create the main window def create_main_window(): root = tk.Tk() root.title('Growing Veggies') root.attributes('-toolwindow', False) r1=0 r2=0 r3=0 #Create zones 1-5 row 0 if number_of_zones >= 1 and number_of_zones <= 5: for r1 in range(number_of_zones): input_frame = create_input_frame(root) input_frame.grid(column=r1, row=0) r1+=1 #Create zones 6-10 rows 0-1 elif number_of_zones > 5 and number_of_zones <=10: for r1 in range(5): input_frame = create_input_frame(root) input_frame.grid(column=r1, row=0) r1+=1 for r2 in range(number_of_zones - 5): input_frame = create_input_frame(root) input_frame.grid(column=r2, row=1) r2+=1 #Create zones 11-15 rows 0-2 elif number_of_zones > 10 and number_of_zones <=15: for r1 in range(5): input_frame = create_input_frame(root) input_frame.grid(column=r1, row=0) r1+=1 for r2 in range(5): input_frame = create_input_frame(root) input_frame.grid(column=r2, row=1) r2+=1 for r2 in range(number_of_zones - 10): input_frame = create_input_frame(root) input_frame.grid(column=r2, row=2) r3+=1 #Output an error else: root.title('ERROR') ttk.Label(root, text = "Please enter a valid number between 1 and 15").grid(column=1, row=1, padx=15, pady=5) ttk.Button(root, text = "Acknowledge", command=quit).grid(column=1, row=2, padx=5, pady=5) root.mainloop() if __name__ == "__main__": number_of_zones = int(input("How many zones should be made? ")) create_main_window()
补充说明
如果不想用StringVar,也可以把显示PH值的Label存为变量,在handler里直接调用ph_label.config(text=ph_level)手动更新文本,效果完全一致。
内容的提问来源于stack exchange,提问作者Mitchell Cooper
相关产品推荐
相关产品推荐

