Tkinter联动绑定的Combobox如何正确获取下拉框选中值
问题根本原因
你遇到的Box_2.get()始终返回空的问题,核心是Python作用域规则导致的变量指向错误:
- 你在全局作用域先实例化了一次
Box_2(空选项的版本),把它放到了界面网格上 - 但在写
Select_Mat响应函数的时候,你又在函数内部写了Box_2 = Combobox(...)这行代码——Python 碰到函数内部对变量的赋值操作时,会默认把这个变量当成函数局部作用域的变量,完全不会去修改函数外面全局定义的那个Box_2对象 - 最后实际出现在界面上、被你切换材料时更新的那个颜色下拉框,只是函数内部的临时局部变量,函数执行完引用就被销毁了;而
Print_Colour函数里调用Box_2.get(),取的还是最开始那个从来没被更新过选项、也从没被选过值的旧全局Box_2,自然永远返回空。
另外还有个隐藏问题:你每次响应材料选择就重新创建Combobox,其实旧的那个空下拉框根本没被销毁,只是被新的控件盖住了,长期运行会出现界面控件堆叠、布局错位的问题。
正确修复思路
- 移除
Select_Mat函数里所有重新实例化Combobox的代码,这种反复创建销毁控件的写法会带来额外的GUI资源开销,还容易出现布局堆叠的问题;就算当初给函数内的Box_2加了global声明修正作用域问题,这种实现逻辑也属于冗余设计 - 对已有的
Box_2直接通过Box_2['values'] = 新选项列表的方式更新可选值 - 每次更新完选项后,可以调用
Box_2.set('')清空之前残留的选中值,避免出现“选中的选项不在当前可选列表内”的异常状态
修复后可直接运行的代码
from tkinter import * from tkinter.ttk import Combobox win = Tk() win.title("Window") Material_List = ["Material1","Material2"] Colour_List = ["Green","Blue","Black","White"] def Print_Colour(): # 打印当前选中的颜色 print(Box_2.get()) def Select_Mat(eventObject): # 绑定材料选择事件,动态更新颜色选项 Material_Choice = Box_1.get() if Material_Choice == Material_List[0]: # 直接修改现有Box_2的选项,不新建控件 Box_2['values'] = [Colour_List[0], Colour_List[1]] Box_2.set('') # 清空旧的选中值 elif Material_Choice == Material_List[1]: Box_2['values'] = [Colour_List[2], Colour_List[3]] Box_2.set('') Box_1 = Combobox(win, values=[Material_List[0], Material_List[1]], width=17, state='readonly') Box_1.grid(row=1, column=1, columnspan=2) Box_2 = Combobox(win, width=17, state='readonly') Box_2.grid(row=1, column=4, columnspan=2) Box_1.bind("<<ComboboxSelected>>", Select_Mat) Print_Button = Button(win, text="Print Colour", width=16, command=Print_Colour) Print_Button.grid(row=2, column=1, columnspan=2) win.mainloop()
内容的提问来源于stack exchange,提问作者Fabian Pirrwitz
相关产品推荐
相关产品推荐

