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()))
补充说明
- 你的三个框架(HourlyWeather、WeeklyWeather、TwoWeekWeather)都正确地grid在同一位置(column=0, row=3, columnspan=3),所以
tkraise()方法可以正确切换显示层级,这部分是没问题的。 - lambda表达式在这里用来传递事件参数(虽然我们没用到,但Tkinter事件绑定会自动传递事件对象给回调函数),同时延迟执行
show_frame直到事件触发。
内容的提问来源于stack exchange,提问作者Ravs0nek
相关产品推荐
相关产品推荐

