python开发箱号批量查询关联SN号码的程序
# 需要导入的包
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import pyodbc
import pandas as pd
# 创建GUI框
class CartonQueryApp:
def __init__(self, root):
self.root = root
self.root.title("箱号查询工具 v1.0")
self.root.geometry("800x600")
# 数据库配置(需要修改以下信息)
self.server = '' # 修改为你的服务器地址
self.database = '' # 修改为你的数据库名
self.username = ''
self.password = ''
self.create_widgets()
def create_widgets(self):
# 主容器
main_frame = ttk.Frame(self.root)
main_frame.pack(fill='both', expand=True, padx=10, pady=10)
# 输入区域
input_frame = ttk.LabelFrame(main_frame, text="批量输入箱号(每行一个)")
input_frame.pack(fill='x', pady=5)
self.txt_input = tk.Text(input_frame, height=10, font=('微软雅黑', 10))
self.txt_input.pack(fill='both', expand=True, padx=5, pady=5)
# 按钮区域
btn_frame = ttk.Frame(main_frame)
btn_frame.pack(fill='x', pady=5)
ttk.Button(btn_frame, text="清空输入", command=self.clear_input).pack(side='left', padx=5)
ttk.Button(btn_frame, text="执行查询", command=self.execute_query).pack(side='left', padx=5)
ttk.Button(btn_frame, text="导出Excel", command=self.export_excel).pack(side='left', padx=5)
# 结果表格区域
table_frame = ttk.LabelFrame(main_frame, text="查询结果")
table_frame.pack(fill='both', expand=True, pady=5)
# 创建Treeview和滚动条
self.create_result_table(table_frame)
def create_result_table(self, parent):
"""创建带滚动条的表格"""
# 表格容器
container = ttk.Frame(parent)
container.pack(fill='both', expand=True, padx=5, pady=5)
# 创建Treeview
self.tree = ttk.Treeview(
container,
columns=('箱号', '工单条码', '客户条码'),
show='headings',
height=15,
selectmode='browse'
)
# 配置表头
self.tree.heading('箱号', text='箱号', anchor='w')
self.tree.heading('工单条码', text='工单条码', anchor='w')
self.tree.heading('客户条码', text='客户条码', anchor='w')
# 配置列宽
self.tree.column('箱号', width=150, minwidth=100)
self.tree.column('工单条码', width=250, minwidth=150)
self.tree.column('客户条码', width=250, minwidth=150)
# 垂直滚动条
vsb = ttk.Scrollbar(container, orient="vertical", command=self.tree.yview)
self.tree.configure(yscrollcommand=vsb.set)
# 布局
self.tree.grid(row=0, column=0, sticky='nsew')
vsb.grid(row=0, column=1, sticky='ns')
# 配置容器网格
container.grid_columnconfigure(0, weight=1)
container.grid_rowconfigure(0, weight=1)
def get_connection(self):
"""创建数据库连接"""
conn_str = f'DRIVER={{ODBC Driver 17 for SQL Server}};' \
f'SERVER={self.server};DATABASE={self.database};' \
f'UID={self.username};PWD={self.password}'
try:
return pyodbc.connect(conn_str)
except Exception as e:
messagebox.showerror("数据库错误", f"连接失败: {str(e)}")
return None
def clear_input(self):
"""清空输入框"""
self.txt_input.delete('1.0', tk.END)
def execute_query(self):
"""执行查询操作"""
# 获取输入的箱号列表
cartons = self.txt_input.get('1.0', tk.END).strip().split('\n')
cartons = [c.strip() for c in cartons if c.strip()]
if not cartons:
messagebox.showwarning("输入错误", "请输入至少一个箱号")
return
# 建立数据库连接
conn = self.get_connection()
if not conn: return
try:
# 参数化查询
sql = f"""
SELECT
CartonNo AS '箱号',
SN AS '工单条码',
ParentSn as '客户条码'
FROM Prod_Unit
WHERE CartonNo IN ({','.join(['?'] * len(cartons))})
"""
df = pd.read_sql(sql, conn, params=cartons)
# 清空旧数据
self.tree.delete(*self.tree.get_children())
# 插入新数据
if not df.empty:
for _, row in df.iterrows():
self.tree.insert('', 'end', values=tuple(row))
msg = f"找到 {len(df)} 条记录"
else:
msg = "未找到匹配数据"
# 自动调整列宽
self.auto_resize_columns()
messagebox.showinfo("查询完成", msg)
except Exception as e:
messagebox.showerror("查询错误", str(e))
finally:
conn.close()
def auto_resize_columns(self):
"""自动调整列宽"""
for col in self.tree['columns']:
max_width = max(
[len(str(self.tree.set(item, col))) * 10 for item in self.tree.get_children()] or [100]
)
self.tree.column(col, width=max_width)
def export_excel(self):
"""导出到Excel"""
if not self.tree.get_children():
messagebox.showwarning("导出错误", "没有可导出的数据")
return
# 获取保存路径
filepath = filedialog.asksaveasfilename(
defaultextension='.xlsx',
filetypes=[("Excel Files", "*.xlsx"), ("All Files", "*.*")]
)
if not filepath: return
# 提取数据
data = []
for item in self.tree.get_children():
data.append(self.tree.item(item)['values'])
# 创建DataFrame并保存
df = pd.DataFrame(data, columns=['箱号', '工单条码', '客户条码'])
try:
df.to_excel(filepath, index=False, engine='openpyxl')
messagebox.showinfo("导出成功", f"文件已保存至:\n{filepath}")
except Exception as e:
messagebox.showerror("导出失败", str(e))
if __name__ == '__main__':
root = tk.Tk()
app = CartonQueryApp(root)
root.mainloop()
python开发箱号批量查询关联SN号码的程序的更多相关文章
- python 写一个生成大乐透号码的程序
""" 写一个生成大乐透号码的程序 生成随机号码:大乐透分前区号码和后区号码, 前区号码是从01-35中无重复地取5个号码, 后区号码是从01-12中无重复地取2个号码, ...
- Python开发qq批量登陆
操作步骤: 1.打开qq软件 2.移动鼠标到qq输入处 3.在输入处,点击鼠标,输入帐号 4.模拟按下tab键,输入密码,模拟点回车登录 #coding=utf-8 import os import ...
- 用Python开发小学二年级口算自动出题程序
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 武汉光谷一小二年级要求家长每天要给小孩出口算题目,让孩子练习. 根据老师出题要求编写了Python程序 ...
- python开发_tkinter_自己做的猜数字小程序
读到这篇文章[python 3.3下结合tkinter做的猜数字程序]的时候,就复制了代码,在自己机器上面跑了一下 源程序存在一个缺陷: 即当用户答对了以后,用户再点击'猜'按钮,最上面的提示标签还会 ...
- TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具
怀着鸡动的心情跟大家介绍一款国产开源运维软件TriAquae,轻松帮你搞定大部分运维工作!TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具,可以允许用户通过一台控制端管理上千 ...
- 【Python】批量查询-提取站长之家IP批量查询的结果v1.0
0 前言 写报告的时候为了细致性,要把IP地址对应的地区给整理出来.500多条IP地址找出对应地区复制粘贴到报告里整了一个上午. 为了下次更好的完成这项重复性很高的工作,所以写了这个小的脚本. 1 使 ...
- Python + MySQL 批量查询百度收录
做SEO的同学,经常会遇到几百或几千个站点,然后对于收录情况去做分析的情况 那么多余常用的一些工具在面对几千个站点需要去做收录分析的时候,那么就显得不是很合适. 在此特意分享给大家一个批量查询百度收录 ...
- 【Python】批量查询-提取站长之家IP批量查询的结果加强版本v3.0
1.工具说明 写报告的时候为了细致性,要把IP地址对应的地区给整理出来.500多条IP地址找出对应地区复制粘贴到报告里整了一个上午. 为了下次更好的完成这项重复性很高的工作,所以写了这个小的脚本. 某 ...
- Python开发【十二章】:ORM sqlalchemy
一.对象映射关系(ORM) orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却 ...
- 【JAVAEE学习笔记】hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示
一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...
随机推荐
- 密码学报如何正确Latex投稿?
记录一下<密码学报>投稿遇到的坑,要不研究一下,投稿都不会投!(死在第一步) 模版地址 http://www.jcr.cacrnet.org.cn/CN/column/column13.s ...
- 使用Python的一维卷积
学习&转载文章:使用Python的一维卷积 背景 在开发机器学习算法时,最重要的事情之一(如果不是最重要的话)是提取最相关的特征,这是在项目的特征工程部分中完成的. 在CNNs中,此过程由网络 ...
- 面向对象(下)的阶段性复习:关键字abstract、模板方法的设计模式、关键字interface、代理模式、工厂的设计模式、类的结构内部类
关键字:abstract abstract: 抽象的1.可以用来修饰:类.方法2.具体的:abstract修饰类:抽象类 * > 此类不能实例化 * > 抽象类中一定有构造器,便于子类实例 ...
- C# WebAPI 插件热插拔
背景 WebAPI 插件热插拔是指在不重启应用程序的情况下,能够动态地加载.更新或卸载功能模块(即插件)的能力.这种设计模式在软件开发中非常有用,尤其是在需要频繁更新或扩展功能的大型系统中.通过实现插 ...
- 1. Docker 的简介概述
1. Docker 的简介概述 @ 目录 1. Docker 的简介概述 2. Docker 的理念: 3. 容器与虚拟机比较 4. Docker应用场景 5. 最后: 为什么会有 Docker 出现 ...
- Flink同步kafka到iceberg数据延迟,两个checkpoint后才可查询
一.问题描述 用户配置了高级参数很多,观察kafka增量数据不多,flink负载不高情况下两个checkpoint后才可查询到数据. 排查时hdfs有数据文件产生,但是mainfast文件中最新快 ...
- FreeSql学习笔记——1.入门
前言 学习过程中,使用的是.Net 5 WebApi项目,数据库使用的是SQL Server,主要会整理下常用的api,现在就开始吧~ 初始化 先选择一个WebCoreApi项目进行创建,创建完项 ...
- C#实现文件的压缩和解压缩
原文链接:https://www.cnblogs.com/sunyaling/archive/2009/04/13/1434602.html 在C#中实现文件的压缩和解压缩,需要使用第三方的组建完成. ...
- 图解MySQL【日志】——Binlog
Binlog(Binary Log,归档日志) 为什么需要 Binlog? Binlog 是 MySQL 中的二进制日志,用于记录数据库的所有写操作(INSERT.UPDATE.DELETE 等) 1 ...
- Azkaban - [01] 概述
简单的任务调度使用crontab.复杂的任务调度使用oozie.azkaban等开发调度系统. 一.为什么学习Azkaban 一个完整的数据分析系统通常都是由大量任务单元(shell脚本.java ...