如何获取ttk.Combobox的选中值?Python Tkinter开发问题
解决Tkinter Combobox选中值存入变量的问题
我来帮你搞定这个问题,你现在的代码里有几个关键错误,导致没法正确获取用户选择的端口值:
错误原因分析
- 事件绑定错误:你直接把变量
Port传给了bind方法,但bind需要接收一个函数作为回调——当用户选择选项时会触发这个函数,并且会自动传递一个事件对象参数给它。 - 方法调用错误:
Port = PortCOM.get是把get方法本身赋值给了Port,而不是调用该方法获取的结果;cget方法是用来获取组件的配置参数(比如values、state这类),不是用户选中的当前值,所以用它会得到错误内容。
正确实现方式
下面是修正后的最小可复现示例,通过回调函数来获取选中的值并更新变量:
from tkinter import * import tkinter.ttk as ttk Port = '' def update_port(event): # 声明要修改全局变量Port global Port # 获取用户选中的当前值,赋值给Port Port = PortCOM.get() # 可选:实时打印选中的值,方便调试 print(f"当前选中端口:{Port}") root = Tk() PortCOM = ttk.Combobox(root, values=[1,2,3,4,5,6]) # 绑定Combobox选中事件到回调函数 PortCOM.bind("<<ComboboxSelected>>", update_port) PortCOM.pack() root.mainloop() # 窗口关闭后打印最终选中的端口 print(f"最终选择的端口:{Port}")
关键说明
- 回调函数:
update_port函数会在用户选中选项时被触发,event参数是事件对象(即使你不用它,也必须保留这个参数,因为Tkinter会自动传递)。 - 全局变量:如果要在函数里修改全局变量
Port,必须用global声明,否则函数会创建一个局部变量Port,不会修改全局的那个。 - 获取选中值:
PortCOM.get()是获取Combobox当前选中值的正确方法,返回的是字符串类型(如果你的values是数字,也可以转成int:Port = int(PortCOM.get()))。
替代方案(不用全局变量)
如果你不想用全局变量,可以用可变对象(比如列表)来存储值,这样不需要global声明:
from tkinter import * import tkinter.ttk as ttk # 用列表存储,列表是可变对象,函数内可以直接修改 Port = [''] def update_port(event): Port[0] = PortCOM.get() print(f"当前选中端口:{Port[0]}") root = Tk() PortCOM = ttk.Combobox(root, values=[1,2,3,4,5,6]) PortCOM.bind("<<ComboboxSelected>>", update_port) PortCOM.pack() root.mainloop() print(f"最终选择的端口:{Port[0]}")
这样当用户选择4时,Port变量就会被正确赋值为"4"(或者4,如果转成int的话)。
内容的提问来源于stack exchange,提问作者Hugo Vernier-Lambert




