如何在customTkinter GUI中利用选择的COM口建立Arduino串口连接?
解决CustomTkinter下拉菜单COM口参数传递到Serial的问题
核心问题是你没有正确获取下拉菜单的选中值,CustomTkinter的CTkOptionMenu需要通过绑定变量或调用自身get()方法来实时获取当前选中的COM口,直接用初始定义的choice变量不会同步选中状态。
修正方案示例
方式1:通过绑定StringVar获取选中值
import customtkinter as ctk import serial import serial.tools.list_ports app = ctk.CTk() app.title("Arduino串口控制") # 自动枚举可用COM口,避免手动输入错误 available_ports = [port.device for port in serial.tools.list_ports.comports()] # 绑定下拉框选中值到StringVar port_var = ctk.StringVar(value=available_ports[0] if available_ports else "") dropdown = ctk.CTkOptionMenu(app, variable=port_var, values=available_ports) dropdown.pack(pady=10) # 全局变量保存串口连接对象,方便后续控制 arduino_conn = None def connect_arduino(): global arduino_conn selected_port = port_var.get() if not selected_port: print("无可用COM口") return try: # 使用获取到的选中端口初始化串口 arduino_conn = serial.Serial(port=selected_port, baudrate=115200, timeout=.1) print(f"成功连接到 {selected_port}") except Exception as e: print(f"连接失败:{str(e)}") def send_control_cmd(cmd): if arduino_conn and arduino_conn.is_open: arduino_conn.write(cmd.encode()) print(f"已发送指令:{cmd}") # UI控件 connect_btn = ctk.CTkButton(app, text="连接Arduino", command=connect_arduino) connect_btn.pack(pady=5) on_btn = ctk.CTkButton(app, text="发送ON指令", command=lambda: send_control_cmd("ON\n")) on_btn.pack(pady=5) off_btn = ctk.CTkButton(app, text="发送OFF指令", command=lambda: send_control_cmd("OFF\n")) off_btn.pack(pady=5) app.mainloop()
方式2:直接调用下拉框的get()方法
如果不想用变量绑定,也可以直接在连接函数里调用下拉框的get()方法获取当前选中值:
def connect_arduino(): global arduino_conn selected_port = dropdown.get() # 后续连接逻辑和方式1一致
关键注意点
- 必须处理串口连接异常(端口不存在、被占用等),避免程序崩溃
- 要将串口连接对象保存为全局变量或类属性,否则连接函数执行完后对象会被销毁,无法后续控制
- 自动枚举可用COM口能大幅减少手动输入错误,推荐使用
serial.tools.list_ports.comports()实现
内容的提问来源于stack exchange,提问作者Finn
相关产品推荐
相关产品推荐

