Tkinter问题:选择Combobox选项会重置Listbox选中值
问题:选择Combobox时Listbox选中项被自动取消
我用Tkinter编写了包含Combobox和Listbox的代码,但遇到一个问题:每次选择Combobox中的任意选项时,Listbox里已选中的所有值都会被取消,明明这两个控件看起来完全无关。
我的代码如下:
cities = df[df.columns[0]].tolist() city_frame = tk.Frame(root) city_frame.grid(row=1, column=1, sticky=tk.N) cities_var = tk.Variable() cities_var.set(cities) tk.Label(city_frame, text="Thành phố").grid(row=0, column=0) selected_cities_lb = tk.Listbox( city_frame, height=20, listvariable=cities_var, selectmode=tk.MULTIPLE ) selected_cities_lb.grid(row=1, column=0) plot_types = ['parallel coordinate', 'stacked bar chart', 'grouped bar chart'] plot_type_frame = tk.Frame(root) plot_type_frame.grid(row=1, column=2, sticky=tk.N) plot_type_var = tk.StringVar() plot_type_var.set(plot_types[0]) tk.Label(plot_type_frame, text="Loại biểu đồ").grid(row=0, column=0) selected_plot_type_lb = ttk.Combobox( plot_type_frame, textvariable=plot_type_var, values=plot_types, state='readonly') selected_plot_type_lb.grid(row=1, column=0)
原因分析
问题出在你给Listbox绑定了通用的tk.Variable作为listvariable参数。Tkinter的tk.Variable是基础变量类,并非专门为Listbox设计,当界面中其他控件(比如这里的Combobox)触发状态变更时,可能会意外触发这个通用变量的内部状态重置,进而导致Listbox的选中状态丢失。
解决方案
给Listbox使用专门的tk.StringVar来存储选项列表,替换原来的tk.Variable即可。修改后的代码片段如下:
cities = df[df.columns[0]].tolist() city_frame = tk.Frame(root) city_frame.grid(row=1, column=1, sticky=tk.N) # 替换为专门的StringVar cities_var = tk.StringVar() cities_var.set(cities) tk.Label(city_frame, text="Thành phố").grid(row=0, column=0) selected_cities_lb = tk.Listbox( city_frame, height=20, listvariable=cities_var, selectmode=tk.MULTIPLE ) selected_cities_lb.grid(row=1, column=0) # 以下Combobox部分代码保持不变 plot_types = ['parallel coordinate', 'stacked bar chart', 'grouped bar chart'] plot_type_frame = tk.Frame(root) plot_type_frame.grid(row=1, column=2, sticky=tk.N) plot_type_var = tk.StringVar() plot_type_var.set(plot_types[0]) tk.Label(plot_type_frame, text="Loại biểu đồ").grid(row=0, column=0) selected_plot_type_lb = ttk.Combobox( plot_type_frame, textvariable=plot_type_var, values=plot_types, state='readonly') selected_plot_type_lb.grid(row=1, column=0)
这样修改后,Combobox的选择操作就不会再影响Listbox的选中状态了,因为Listbox现在绑定了专门的字符串变量,不会和其他控件的变量产生意外交互。
内容的提问来源于stack exchange,提问作者Nanachi
相关产品推荐
相关产品推荐

