如何在现有销售库存系统中添加文本格式打印收据功能
Tkinter+SQLite简易销售库存系统 收据功能实现
功能覆盖
- 结算时自动生成标准化购物收据,包含交易编号、交易时间、商品明细、总金额信息
- 收据自动以UTF-8编码文本格式存储,按交易编号命名归档
- 支持一键调用系统默认打印机打印收据
- 完全兼容原有代码结构,无需重构现有业务逻辑
前置依赖
在原有代码导入块中新增以下导入内容:
import os from datetime import datetime import tempfile # Windows系统打印依赖,可执行 pip install pywin32 安装 try: import win32api import win32print WIN_PLATFORM = True except ImportError: WIN_PLATFORM = False import subprocess
核心功能代码
把以下函数直接添加到原有代码的变量定义块之后即可:
# 初始化收据存储目录 def init_receipt_folder(): if not os.path.exists("sale_receipts"): os.makedirs("sale_receipts") # 生成收据文本内容 def build_receipt(cart_list, total_pay, custom_trade_no=None): """ 参数说明: cart_list: 购物车商品列表,单个元素格式为 (商品名, 单价, 购买数量, 小计) total_pay: 订单实付总金额 custom_trade_no: 可选自定义交易编号,不传则自动按时间生成 """ trade_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") trade_no = custom_trade_no if custom_trade_no else datetime.now().strftime("%Y%m%d%H%M%S%f")[:-3] content = [ "="*42, " 简易库存系统销售收据", "="*42, f"交易编号: {trade_no}", f"交易时间: {trade_time}", "-"*42, f"{'商品名称':<14}{'单价':>8}{'数量':>6}{'小计':>10}", "-"*42 ] for p_name, price, qty, sub_total in cart_list: content.append(f"{p_name:<14}{price:>8.2f}{qty:>6}{sub_total:>10.2f}") content += [ "-"*42, f"{'应付总金额':<28}{total_pay:>10.2f}", "="*42, " 感谢惠顾 欢迎下次光临", "="*42 ] return "\n".join(content), trade_no # 保存收据为本地txt文件 def save_receipt(content, trade_no): file_path = os.path.join("sale_receipts", f"收据_{trade_no}.txt") with open(file_path, "w", encoding="utf-8") as f: f.write(content) return file_path # 调用系统打印机打印收据 def send_print(content): # 生成临时打印文件 with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", suffix=".txt", delete=False) as tmp_file: tmp_file.write(content) tmp_path = tmp_file.name try: if WIN_PLATFORM: default_printer = win32print.GetDefaultPrinter() win32api.ShellExecute(0, "print", tmp_path, f'/d:"{default_printer}"', ".", 0) else: # Mac/Linux系统调用系统打印命令 subprocess.run(["lp", tmp_path], check=True) tkMessageBox.showinfo("打印提示", "打印任务已发送至默认打印机") except Exception as e: tkMessageBox.showerror("打印失败", f"打印任务发送失败:{str(e)}\n收据已保存至本地,可手动打开文件打印") finally: # 延迟10秒删除临时文件,避免打印程序未读取完文件就被删除 def clear_tmp(): if os.path.exists(tmp_path): os.remove(tmp_path) root.after(10000, clear_tmp)
原有代码修改点
- 在窗口初始化配置完成后,调用目录初始化函数,位置参考:
root.config(bg="#6666ff") # 新增:初始化收据存储目录 init_receipt_folder()
- 在结算按钮绑定的业务逻辑末尾(即完成库存扣减、销售记录入库之后),添加收据生成逻辑,参考示例:
# === 以下为结算逻辑末尾新增内容 === # 假设cart为当前结算的购物车数据,total为订单总金额 receipt_content, tid = build_receipt(cart, total) saved_path = save_receipt(receipt_content, tid) # 询问用户是否需要即时打印 if tkMessageBox.askyesno("收据生成", f"收据已保存至路径:{saved_path}\n是否现在打印?"): send_print(receipt_content)
使用说明
- 所有生成的收据文件统一存放在程序运行目录下的
sale_receipts文件夹中,可随时调取查看、补打 - Windows系统若需使用打印功能,先执行
pip install pywin32安装依赖;未安装依赖不影响收据生成、保存功能 - 可自行修改
build_receipt函数内的文本内容,调整收据抬头、排版、添加门店信息等
内容的提问来源于stack exchange,提问作者Ramanujan
相关产品推荐
相关产品推荐

