You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:42:51