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

Tkinter中tk.raise()失效:切换ComboBox值后框架未更新

问题解决:Tkinter框架切换失效(ComboBox选中无反应)

核心错误点

问题出在EntryButtons类的事件绑定代码里:

self.weather_type.bind('<<ComboboxSelected>>', self.container.show_frame(self.type_of_weather.get()))

这里直接调用了show_frame方法,导致程序初始化时就执行了一次框架切换,而不是在ComboBox选中时触发。绑定事件需要传递可调用的函数对象,而不是函数执行后的返回值(此处返回None)。

修复方案

把绑定代码改成用lambda表达式包裹,确保选中事件触发时才获取当前ComboBox值并调用show_frame:

self.weather_type.bind('<<ComboboxSelected>>', lambda event: self.container.show_frame(self.type_of_weather.get()))

完整修改后的EntryButtons类

class EntryButtons(ttk.Frame):
    def __init__(self, container):
        super().__init__(container)
        self.container = container
        self.city_value = tk.StringVar()
        self.state_value = tk.StringVar()
        self.country_value = tk.StringVar()
        self.type_of_weather = tk.StringVar()
        self.__create_widgets()
    
    def __create_widgets(self):
        city_entry = tk.Entry(self, textvariable=self.city_value)
        state_entry = tk.Entry(self, textvariable=self.state_value)
        country_entry = tk.Entry(self, textvariable=self.country_value)
        self.weather_type = ttk.Combobox(self, textvariable=self.type_of_weather, state='readonly')
        self.weather_type['values'] = ('HourlyWeather', 'WeeklyWeather', 'TwoWeekWeather')
        self.weather_type.current(0)
        tk.Label(self, text='City: ').grid(column=0, row=0)
        city_entry.grid(column=1, row=0)
        tk.Label(self, text='State: ').grid(column=2, row=0)
        state_entry.grid(column=3, row=0)
        tk.Label(self, text='Country: ').grid(column=4, row=0)
        country_entry.grid(column=5, row=0)

        self.weather_type.grid(column=6, row=0)
        # 修复事件绑定
        self.weather_type.bind('<<ComboboxSelected>>', lambda event: self.container.show_frame(self.type_of_weather.get()))

补充说明

  1. 你的三个框架(HourlyWeather、WeeklyWeather、TwoWeekWeather)都正确地grid在同一位置(column=0, row=3, columnspan=3),所以tkraise()方法可以正确切换显示层级,这部分是没问题的。
  2. lambda表达式在这里用来传递事件参数(虽然我们没用到,但Tkinter事件绑定会自动传递事件对象给回调函数),同时延迟执行show_frame直到事件触发。

内容的提问来源于stack exchange,提问作者Ravs0nek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:54:56