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.持久化 ...
随机推荐
- Assignment pg walkthrough Easy 通配符提权变种
nmap 扫描 ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.157.224 Starting Nmap 7.94SVN ( https://nmap.org ...
- unicode编码 asis_2019_unicorn_shop
这题就是让我们购买第四个商品 当我们输入price为1337.0的时候他会报错,显示要我们只输入一个字符 那么我们就要想怎样用一个字符来表示一个比1337还要大的数字 答案是unicode 编码 (题 ...
- ctfshow--web12 glob和show_source命令执行
查看源代码有提示 以为是cmd命令解过输入linux命令愣是没反应后来输入phpinfo()才有回显 原来是被误导了. 一开始想的是直接写入一句话木马 点击查看代码 @eval($_POST['att ...
- 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)
九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) @ 目录 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) 1. RDB 概述 ...
- (vm/vb)虚拟机复制或者拷贝之后连不上网络怎么处理?
(vm/vb)虚拟机复制或者拷贝之后连不上网络怎么处理? Linux虚拟机无论在VMware还是VirtualBox下面,只要复制拷贝到别的地方,开启网络服务都会出现报错的问题. 这里以CentOS ...
- 爬虫基础知识及scrapy框架使用和基本原理
爬虫 一.异步IO 线程:线程是计算机中工作的最小单元 IO请求(IO密集型)时多线程更好,计算密集型进程并发最好,IO请求不涉及CPU 自定义线程池 进程:进程默认有主线程,可以有多线程共存,并 ...
- 百思不得其解,DeepSeek怎么突然就比肩GPT了?
>关注公众号**回复1**>>获取**一线.总监.高管<管理秘籍>** 之前大家都认为中美在AI领域的差距很大,谁曾想春节期间**DeepSeek横空出世**,直接给Op ...
- Q:CRON表达式,Linux和Java的不同写法
CRON表达式是一个字符串,包含五个到七个由空格分隔的字段(每种软件不一样),表示一组时间,通常作为执行某个程序的时间表. 调度精度: Linux的cron调度精度为分钟级别,最小粒度为分钟,而Jav ...
- 1.6~THUWC 的总结
THUWC 虽然拿到了一等奖,但是其实不如预期的发挥. Day1 获得 260~300 分.快速地想出了 T1T2 然后在调试上花费了很多的时间,T3 没有想出来,T4 想出了 \(O(n\log^3 ...
- 利用纯JS导出到EXCEL
var tableToExcel = (function () { var uri = 'data:application/vnd.ms-excel;base64,', template = '< ...