抓取LDR条码的UI软件
main.py
import tkinter as tk
from tkinter import ttk, messagebox
from mes_api import MesSnFetcher
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("LDR MES-SN 读取器")
self.geometry("500x350+300+200")
self.resizable(False, False)
# ---- 顶部输入区 ----
frm_top = ttk.Frame(self)
frm_top.pack(fill='x', padx=10, pady=10)
ttk.Label(frm_top, text="MES 地址:").pack(side='left')
self.var_url = tk.StringVar(value="http://192.168.1.25:8080/api/barcode/find?position=2")
ttk.Entry(frm_top, textvariable=self.var_url, width=50).pack(side='left', padx=5)
ttk.Button(frm_top, text="获取 SN 列表", command=self.load_sn).pack(side='left', padx=5)
# ---- 中间表格 ----
columns = ("序号", "SN 条码")
self.tree = ttk.Treeview(self, columns=columns, show='headings', height=12)
for col in columns:
self.tree.heading(col, text=col)
self.tree.column(col, width=240 if col == "SN 条码" else 60, anchor='center')
self.tree.pack(fill='both', padx=10, pady=5)
# ---- 底部状态栏 ----
self.status = tk.StringVar(value="就绪")
ttk.Label(self, textvariable=self.status, relief='sunken', anchor='w').pack(fill='x', padx=10, pady=3)
# 在 main.py 里把 load_sn 整体替换成下面这段
def load_sn(self):
url = self.var_url.get().strip()
if not url:
messagebox.showwarning("提示", "请先填写 MES 接口地址")
return
self.status.set("正在请求 MES ...")
self.update()
try:
sn_list = MesSnFetcher.get_sn_list(url)
except Exception as e:
# 把任何异常都弹出来
import traceback
msg = traceback.format_exc()
print(msg) # 控制台也留一份
messagebox.showerror("请求失败", msg)
self.status.set("请求异常")
return
# 清空旧数据
for item in self.tree.get_children():
self.tree.delete(item)
if not sn_list:
messagebox.showinfo("结果", "未获取到任何 SN 条码")
self.status.set("就绪")
return
for idx, sn in enumerate(sn_list, 1):
self.tree.insert('', 'end', values=(idx, sn))
self.status.set(f"共获取 {len(sn_list)} 条 SN")
# ---------- 入口 ----------
if __name__ == "__main__":
# 如果本机没有装 requests,给一次自动安装机会(可选)
try:
import requests
except ImportError:
import subprocess, sys, os
subprocess.check_call([sys.executable, "-m", "pip", "install", "-r",
os.path.join(os.path.dirname(__file__), "requirements.txt")])
import requests # 再次尝试导入
App().mainloop()
import json, requests
class MesSnFetcher:
@staticmethod
def get_sn_list(plc_url: str):
"""
从力德尔内部 MES 获取 SN 列表
返回 List[str] 全是 ProductBarcode
"""
url, _, query = plc_url.partition('?') # url='http://.../find' query='position=2'
position_val = query.split('=')[-1] # '2'
payload = {'position': position_val} # {'position':'2'}
headers = {'Content-Type': 'text/plain; charset=utf-8'}
resp = requests.get(url, params=payload, headers=headers, timeout=5)
resp.raise_for_status() # 网络层异常直接抛
# 替换 mes_api.py 里 17-26 行
raw = resp.text.strip() # 先拿完整字符串
if not raw:
return []
# 1. 如果包含 | 就先按 | 分段,否则按行
segments = raw.split('|') if '|' in raw else raw.splitlines()
sn_list = []
for seg in segments:
seg = seg.rstrip(';').strip() # 去分号、去空白
if seg:
sn_list.append(seg)
return sn_list
夜雨聆风
