前一篇,我们用 SQLite 从零搭好了进销存的数据库结构——商品、供应商、客户、采购、销售、库存几张表一建,再配一条“查库存全貌”的 SQL,完整的数据库已经成形。
可是只一个数据库,还无法直接落地使用,无法形成生产力。

场景:

一个小超市,如何来使用?

天天在工具里敲 SQL?那不是干活的节奏,是折腾人的节奏。
就算你愿意敲,你老婆、你店员、你库管,他们更不会。

真正能落地的进销存,必须是一个界面:打开就能用,点几下就记账,不用记任何 SQL。

今天这一篇,我们就站在前一篇的基础上,用Python + tkinter + SQLite给数据库“穿上一件衣服”,让它变成一个真正能干活的工具。

打开网易新闻 查看精彩图片

直接可以使用

从数据库到界面:五步搭起进销存系统第一步:环境准备,安装python

(可以找一下,我的文章 一键配置python环境)

第二步:数据库已经在前一篇建好了,直接用第三步:用 Python 连接数据库,做一个简单操作界面

import sqlite3class 进销存数据库:def __init__(self, db_file):self.db_file = db_filedef 查询商品列表:"""查所有商品,顺便看库存"""conn = sqlite3.connect(self.db_file)cursor = conn.cursor()cursor.execute('''SELECT g.goods_name, g.spec, g.unit, g.sale_price, s.balanceFROM goods gLEFT JOIN stock s ON g.goods_id = s.goods_idresults = cursor.fetchall()conn.close()return resultsdef 添加采购记录(self, 日期, 供应商ID, 商品ID, 数量, 单价):"""采购入库,同时更新库存"""conn = sqlite3.connect(self.db_file)cursor = conn.cursor()金额 = 数量 * 单价# 开启事务:要么全成功,要么全失败try:cursor.execute("BEGIN")# 1. 插入采购记录cursor.execute('''INSERT INTO purchase (purchase_date, supplier_id, goods_id, quantity, unit_price, amount)VALUES (?, ?, ?, ?, ?, ?)''', (日期, 供应商ID, 商品ID, 数量, 单价, 金额))# 2. 更新库存(入库)cursor.execute('''UPDATE stockSET in_qty = in_qty + ?, balance = balance + ?WHERE goods_id = ?''', (数量, 数量, 商品ID))conn.commit()return True, f"采购入库成功,金额:{金额:.2f} 元"except:conn.rollback()return False, "入库失败,请检查数据"finally:conn.close()# ... 其他方法:销售出库、库存查询、统计报表等
第四步:用 tkinter 搭一个“商品管理”界面(最简单的例子)

先从最简单的开始:一个窗口,一个表格,显示所有商品和库存

import tkinter as tkfrom tkinter import ttk# 创建主窗口root = tk.Tk()root.title("我的进销存")root.geometry("900x500")# 创建表格tree = ttk.Treeview(root, columns=('商品名', '规格', '单位', '售价', '库存'), show='headings')tree.heading('商品名', text='商品名')tree.heading('规格', text='规格')tree.heading('单位', text='单位')tree.heading('售价', text='售价')tree.heading('库存', text='库存')# 从数据库加载数据db = 进销存数据库('进销存.db')商品列表 = db.查询商品列表()for 商品 in 商品列表:tree.insert('', 'end', values=商品)tree.pack(fill='both', expand=True, padx=10, pady=10)root.mainloop()
第五步:再加几个按钮,真正开始干活

光看不够,还要能记账。
我们再加几个按钮:“新增商品”、“采购入库”、“销售出库”、“库存查询”,每个按钮打开一个小窗口,填表提交。

def 新增商品窗口():"""点一下,弹出一个小窗口,填商品名、售价,保存"""win = tk.Toplevel()win.title("新增商品")tk.Label(win, text="商品名:").grid(row=0, column=0)名称 = tk.Entry(win)名称.grid(row=0, column=1)tk.Label(win, text="售价:").grid(row=1, column=0)售价 = tk.Entry(win)售价.grid(row=1, column=1)def 保存:# 这里调用数据库的添加商品方法db.添加商品(名称.get(), 售价.get())win.destroy() # 关闭窗口messagebox.showinfo("成功", "商品已添加")tk.Button(win, text="保存", command=保存).grid(row=2, column=1)# 在主窗口加按钮btn_frame = tk.Frame(root)btn_frame.pack(fill='x', padx=10, pady=5)tk.Button(btn_frame, text="新增商品", command=新增商品窗口).pack(side='left', padx=5)tk.Button(btn_frame, text="采购入库", command=采购入库窗口).pack(side='left', padx=5)tk.Button(btn_frame, text="销售出库", command=销售出库窗口).pack(side='left', padx=5)tk.Button(btn_frame, text="库存查询", command=刷新库存表).pack(side='left', padx=5)

到这里,你的进销存就已经能用了:

  • 点击“新增商品”,填表保存,数据库里就多了一个商品。
  • 点击“采购入库”,选供应商、选商品、填数量单价,库存自动加。
  • 点击“销售出库”,填数量,库存自动减(还能先查库存够不够)。
  • 点击“库存查询”,表里实时显示所有商品的当前库存。
三、落地效果:个体老板的日常工作流场景一:每天开店前,先看库存

打开软件 → 点“库存查询” → 一眼看到哪些商品库存不足(比如库存小于 10 的,可以标红)。
立刻打电话补货,不用等到客户上门才想起来。

场景二:供应商送货上门,直接扫码入库(此功能还未完成)

如果有扫码枪(几十块钱那种 USB 扫码枪),界面里光标停到“商品条码”输入框,对着商品条码一扫,条码自动填进去,数量默认是 1,改一下数量,点“保存”,采购记录就进了,库存也跟着变。

场景三:客户来买东西,快速开单

在“销售出库”窗口,选商品、填数量,系统先查库存够不够,够了就扣库存、生成销售记录。
如果客户要多件,可以连续扫几个条码,一笔订单里包好几样商品,最后一起算钱。

场景四:月底打表,看赚了多少钱

点“统计报表”,选个日期范围,立刻出一张表:

  • 本月采购总额:XX 元。
  • 本月销售总额:XX 元。
  • 毛利润:XX 元(销售减采购)。

甚至可以按商品看:哪些商品卖得多,哪些几乎不动,下次进货心里有数。

最后一句

前一篇,我们用 SQLite 搭好了进销存的“骨架”;这一篇,我们用 Python + tkinter 给它穿上了“衣服”。

从数据库到界面,从技术到生产力,个体老板的进销存落地,其实就这么几步:

  1. 数据库建表(前一篇)。
  2. Python 写几个方法操作数据库。
  3. tkinter 搭几个窗口做界面。
  4. 打开就能用,扫码就能记账。

如果你现在就想动手,我可以把完整的 Python 代码发你,你只需要改一下数据库文件名,就能跑起来。

关注我,下一期我们继续讲:如何给这个系统加上“导出 Excel 报表”和“数据备份”功能,让它真正成为你经营生意的“数字助手”。