You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在现有销售库存系统中添加文本格式打印收据功能

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)

原有代码修改点

  1. 在窗口初始化配置完成后,调用目录初始化函数,位置参考:
root.config(bg="#6666ff")
# 新增:初始化收据存储目录
init_receipt_folder()
  1. 在结算按钮绑定的业务逻辑末尾(即完成库存扣减、销售记录入库之后),添加收据生成逻辑,参考示例:
# === 以下为结算逻辑末尾新增内容 ===
# 假设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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:48:14