
代码
import serial
import threading
import tkinter as tk
from tkinter import messagebox, ttk
import re
from decimal import Decimal, getcontext
# 设置浮点数精度
getcontext().prec = 3
class ScaleDialogForm:
def __init__(self, port_name, title):
self.port_name = port_name
self.title = title
self.serial_port = None
self.recent_weights = []
self.stable_weight = -1
self.is_running = True
# 创建主窗口
self.root = tk.Tk()
self.root.title(title)
self.root.geometry("300x200")
self.root.resizable(False, False)
# 初始化UI
self.init_ui()
# 启动串口线程
self.start_serial_thread()
def init_ui(self):
# 重量显示区域
weight_frame = ttk.Frame(self.root)
weight_frame.pack(pady=20, padx=20, anchor=tk.W)
ttk.Label(weight_frame, text="当前重量:").pack(side=tk.LEFT)
self.current_weight_label = ttk.Label(weight_frame, text="-- kg")
self.current_weight_label.pack(side=tk.LEFT, padx=5)
# 状态标签
self.status_label = ttk.Label(self.root, text="等待数据稳定(连续6次相同值)...")
self.status_label.pack(pady=10, padx=20, anchor=tk.W)
# 取消按钮
btn_frame = ttk.Frame(self.root)
btn_frame.pack(side=tk.BOTTOM, pady=20)
cancel_btn = ttk.Button(btn_frame, text="取消", command=self.on_cancel)
cancel_btn.pack(side=tk.RIGHT, padx=20)
def start_serial_thread(self):
"""启动串口处理线程"""
self.serial_thread = threading.Thread(target=self.init_serial, daemon=True)
self.serial_thread.start()
def init_serial(self):
"""初始化串口连接"""
try:
self.serial_port = serial.Serial(
port=self.port_name,
baudrate=9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=0.5
)
# 更新状态标签(线程安全)
self.root.after(0, lambda: self.status_label.config(
text=f"串口 {self.port_name} 已打开,等待数据..."
))
# 开始读取数据
self.read_serial_data()
except Exception as e:
self.root.after(0, lambda: messagebox.showerror(
"错误", f"串口 {self.port_name} 打开失败:{str(e)}"
))
self.root.after(0, self.root.destroy)
def read_serial_data(self):
"""读取串口数据"""
while self.is_running and self.serial_port and self.serial_port.is_open:
try:
data = self.serial_port.readline().decode('utf-8', errors='ignore').strip()
if data:
weight = self.try_parse_weight(data)
if weight is not None:
# 更新UI显示当前重量
self.root.after(0, lambda w=weight: self.current_weight_label.config(
text=f"{w} kg"
))
self.check_stable_weight(weight)
except Exception as e:
self.root.after(0, lambda: messagebox.showerror(
"错误", f"数据处理错误:{str(e)}"
))
break
def try_parse_weight(self, data):
"""解析电子秤数据(根据实际协议调整)"""
# 提取数字部分(支持整数、小数,正负值)
match = re.search(r'[-+]?\d+\.?\d*', data)
if match:
try:
return Decimal(match.group())
except:
return None
return None
def check_stable_weight(self, current_weight):
"""检查是否连续6次读取到相同重量"""
# 保留最近6次数据
if len(self.recent_weights) >= 6:
self.recent_weights.pop(0)
self.recent_weights.append(current_weight)
# 检查是否稳定
if len(self.recent_weights) == 6 and self.all_equal():
self.stable_weight = current_weight
self.is_running = False
# 关闭串口
if self.serial_port and self.serial_port.is_open:
self.serial_port.close()
# 更新状态并关闭窗口
self.root.after(0, lambda: self.status_label.config(
text=f"数据稳定:{self.stable_weight} kg,自动确认中..."
))
self.root.after(1000, self.root.destroy) # 延迟1秒关闭,让用户看到状态
def all_equal(self):
"""检查列表中所有元素是否相等"""
if not self.recent_weights:
return False
first = self.recent_weights[0]
for w in self.recent_weights[1:]:
if w != first:
return False
return True
def on_cancel(self):
"""取消按钮事件"""
self.is_running = False
if self.serial_port and self.serial_port.is_open:
self.serial_port.close()
self.root.destroy()
def show_dialog(self):
"""显示对话框并返回结果"""
self.root.mainloop()
return self.stable_weight
if __name__ == "__main__":
# 示例:传入串口号"COM3"和标题"生鲜电子秤采集"
dialog = ScaleDialogForm("COM3", "生鲜电子秤采集")
stable_weight = dialog.show_dialog()
if stable_weight != -1:
messagebox.showinfo(
"采集完成",
f"最终稳定重量:{stable_weight} kg"
)
Python 电子秤读取:开启精准计量新时代
在数字化与智能化快速发展的当下,利用 Python 进行电子秤数据读取具有非凡的意义,它如同打开精准计量大门的钥匙,为众多领域带来了便利与革新。
一、Python 电子秤读取的重要意义
- 精准计量保障 :Python 凭借其强大的数据处理能力和丰富的库资源,能够精确解析电子秤输出的数据。在给定代码中,通过
try_parse_weight函数利用正则表达式提取数字部分,并使用Decimal类型确保精度,有效避免了浮点数运算可能产生的精度损失,为各种场景下的精准计量提供了可靠保障。 - 灵活性与可扩展性 :Python 语言简洁灵活,易于理解和修改。以代码中的
ScaleDialogForm类为例,其模块化的设计使得开发人员可以轻松根据不同电子秤的通信协议和功能需求,对串口配置、数据解析逻辑等进行扩展和定制,满足多样化的应用场景。 - 跨平台兼容性:Python 具有良好的跨平台特性,无论是 Windows、Linux 还是 macOS 系统,都能运行基于 Python 的电子秤读取程序。这使得在不同操作系统环境下的用户都能方便地实现电子秤数据的采集与处理,促进了数据在不同平台间的共享与交互。
二、10 个应用场景
- 生鲜零售:在生鲜市场或超市,通过 Python 读取电子秤数据,自动生成商品标签,包含重量、价格等信息,提高结算效率,减少人工操作可能带来的误差。就像代码示例中的 "生鲜电子秤采集" 场景,确保消费者购买的生鲜产品称重准确,价格合理。
- 工业生产:在制造业生产线中,电子秤用于对原材料、零部件及成品进行称重。Python 读取数据后可实时监测产品重量是否符合标准,实现质量控制。例如,汽车制造中对发动机零部件的称重检测,及时发现重量异常的部件,保证产品质量。
- 物流快递:快递站点利用电子秤称重包裹,Python 读取数据并与物流系统对接,自动计算运费、生成运单,提高物流处理效率,优化物流成本核算。
- 实验室研究:科研实验中,精确的重量测量至关重要。Python 读取电子秤数据,可实现实验数据的自动记录与分析,提高实验的准确性和效率。比如化学实验中对试剂的称重,确保实验配方的精确性。
- 餐饮行业:餐厅厨房使用电子秤控制食材用量,Python 读取数据帮助厨师严格按照食谱准备食材,保证菜品口味的一致性,同时实现食材库存的精准管理。
- 珠宝首饰销售:珠宝的价值与重量密切相关。通过 Python 读取高精度电子秤数据,为珠宝定价提供准确依据,保障交易的公平公正。
- 农业生产:在农产品收购、加工环节,电子秤称重结合 Python 数据处理,可统计农产品产量、计算收购价格,助力农业生产的数字化管理。例如粮食收购时对谷物的称重结算。
- 制药行业:药品生产过程中,对原材料和成品的重量要求极高。Python 读取电子秤数据用于质量监控和生产流程控制,确保药品剂量准确,保障用药安全。
- 废物回收处理:回收站利用电子秤称重回收物品,Python 读取数据用于统计回收量、计算回收费用,实现回收业务的规范化管理。
- 电商仓储:电商仓库中,对商品进行称重是库存管理和发货流程的重要环节。Python 读取电子秤数据,与电商平台库存系统集成,实时更新库存信息,保证商品库存数量的准确性。
三、初学者如何利用
- 学习基础知识 :
- Python 基础 :初学者应首先掌握 Python 的基本语法,如变量、数据类型、控制语句、函数和类等。了解 Python 的面向对象编程思想,这对于理解和修改给定代码中的
ScaleDialogForm类至关重要。 - 串口通信知识 :学习串口通信的基本原理,包括波特率、奇偶校验、停止位等概念。了解如何在 Python 中使用
pyserial库进行串口配置和数据读取,如代码中的init_serial函数所示。 - Tkinter 库 :由于代码使用 Tkinter 创建图形用户界面(GUI),初学者需学习 Tkinter 的基本组件,如
Label、Button、Frame等的使用方法,以及布局管理和事件处理机制。
- Python 基础 :初学者应首先掌握 Python 的基本语法,如变量、数据类型、控制语句、函数和类等。了解 Python 的面向对象编程思想,这对于理解和修改给定代码中的
- 运行和分析代码 :
- 运行示例代码 :将给定代码复制到本地开发环境,确保安装了
pyserial和tkinter库(tkinter通常随 Python 安装)。运行代码,观察程序的功能,如串口打开、数据读取、重量显示和稳定性判断等过程。 - 代码分析 :仔细阅读代码,理解每个函数和类的作用。例如,分析
try_parse_weight函数如何解析电子秤数据,check_stable_weight函数怎样判断数据的稳定性。逐步跟踪代码执行流程,掌握数据在各个模块之间的传递和处理方式。
- 运行示例代码 :将给定代码复制到本地开发环境,确保安装了
- 实践与扩展 :
- 简单修改:尝试对代码进行简单修改,如调整串口参数、改变数据解析规则或优化 GUI 界面布局。例如,将串口波特率从 9600 改为 115200,观察程序运行效果,加深对串口通信的理解。
- 功能扩展:根据自身需求扩展代码功能。比如,添加数据记录功能,将每次读取的重量数据保存到文件中;或者增加网络通信功能,将电子秤数据发送到远程服务器。通过实践不断提高对 Python 电子秤读取技术的应用能力。
阿雪技术观
让我们积极投身于技术共享的浪潮中,不仅仅是作为受益者,更要成为贡献者。无论是分享自己的代码、撰写技术博客,还是参与开源项目的维护和改进,每一个小小的举动都可能成为推动技术进步的巨大力量
Embrace open source and sharing, witness the miracle of technological progress, and enjoy the happy times of humanity! Let's actively join the wave of technology sharing. Not only as beneficiaries, but also as contributors. Whether sharing our own code, writing technical blogs, or participating in the maintenance and improvement of open source projects, every small action may become a huge force driving technological progress.