You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:36:02