Tkinter串口检测函数变量初始化报错:int()参数不能为Entry对象
解决Tkinter Entry控件传参到串口函数的类型错误问题
你碰到的这个错误其实很典型——你直接把Tkinter的Entry控件对象传给了串口函数,而不是从控件里取出用户输入的实际内容。比如int(entry_BAUD)里的entry_BAUD是整个输入框控件,不是用户输入的波特率字符串,自然没法转成整数。
核心修复思路
Tkinter的Entry控件需要用.get()方法来获取输入框内的文本内容,之后再根据参数需求做类型转换:
- 对于波特率、停止位、数据位这类需要整数的参数,先获取文本再转
int - 对于端口名、校验位这类字符串参数,直接获取文本即可(校验位需要额外处理,下文会说明)
修正后的代码
重点修改start_testing函数,同时给Entry控件加上默认值提升用户体验,还补充了输入合法性校验:
# entries from the GUI(添加默认值,方便用户直接使用) entry_PORT = Entry(second_frame, bg="white") entry_PORT.insert(0, '/dev/ttyUSB0') # 默认串口端口 entry_PORT.grid(row=14,column=1,padx=0,pady=5) entry_BAUD = Entry(second_frame, bg="white") entry_BAUD.insert(0, '115200') # 默认波特率 entry_BAUD.grid(row=16,column=1,padx=0,pady=5) entry_PARITY = Entry(second_frame, bg="white") entry_PARITY.insert(0, 'NONE') # 简化用户输入,用直观的字符串替代模块常量 entry_PARITY.grid(row=18,column=1,padx=0,pady=5) entry_STOPB = Entry(second_frame, bg="white") entry_STOPB.insert(0, '1') # 注意:串口停止位合法值是1/2,原默认值8错误 entry_STOPB.grid(row=20,column=1,padx=0,pady=5) entry_BYTES = Entry(second_frame, bg="white") entry_BYTES.insert(0, '8') # 默认数据位 entry_BYTES.grid(row=22,column=1,padx=0,pady=5) # running code: def start_testing(): try: logger.debug('test has started ') # 从Entry控件中获取实际输入内容 port_name = entry_PORT.get() # 转换数值型参数,捕获用户输入非数字的异常 try: baud_rate = int(entry_BAUD.get()) stop_bits = int(entry_STOPB.get()) byte_size = int(entry_BYTES.get()) except ValueError: logger.error("波特率、停止位或数据位必须输入有效数字!") return # 处理校验位:将用户输入的字符串映射为serial模块的常量 parity_input = entry_PARITY.get().upper() parity_map = { 'NONE': serial.PARITY_NONE, 'EVEN': serial.PARITY_EVEN, 'ODD': serial.PARITY_ODD, 'MARK': serial.PARITY_MARK, 'SPACE': serial.PARITY_SPACE } serial_parity = parity_map.get(parity_input, serial.PARITY_NONE) # 调用串口检测函数 check_SERIAL( port_name=port_name, baud_rate=baud_rate, serial_parity=serial_parity, stop_bits=stop_bits, byte_size=byte_size ) except Exception as e: # general exceptions logger.error('Something went wrong: ' + str(e))
额外注意事项
- 停止位参数修正:原代码中
stop_bits=8是错误的,串口停止位仅支持1或2,我已将默认值改为1,同时提醒用户输入合法值。 - 校验位映射处理:
serial.Serial要求校验位是模块内置常量(比如serial.PARITY_NONE),直接传用户输入的字符串会报错,所以加了映射字典,让用户可以输入直观的NONE/EVEN等字符串。 - 输入合法性校验:添加了
ValueError捕获,防止用户输入非数字的波特率等参数,避免程序崩溃。
内容的提问来源于stack exchange,提问作者anxiousPI
相关产品推荐
相关产品推荐

