网易首页 > 网易号 > 正文 申请入驻

python进销存__落地实战(二):扫码枪“智能匹配”

0
分享至

接上篇,我们已经用Python+SQLite搭好了进销存的骨架。今天给它装上“眼睛”——扫码枪。重点解决一个真实痛点:

扫码枪扫了,系统怎么知道是什么东西?新商品第一次扫怎么办?

一、先要明白扫码得到数字 如何知道是什么商品

扫码枪扫到的只是一串数字,它本身不知道这串数字代表什么。知道含义的是你的程序。

整个过程就是三步:

  1. 扫码枪把条码数字传给程序
  2. 程序拿着数字去数据库里查“这串数字对应哪个商品”
  3. 查到了就调出商品信息,执行入库或销售;没查到就让老板选一下,然后记住这个对应关系

用一句大白话总结:扫码枪报了串“身份证号”,程序去“户籍系统”里查这个人是谁。

二、数据库升级:增加两张“户籍表”

很多新手会把条码直接存到商品表里,但现实中会遇到两个问题:

  • 一个商品可能有多个条码(换了包装、换了供应商,条码就变了)
  • 同一个条码可能对应不同商品

所以最稳妥的做法是:单独建一张“条码映射表”,记录“条码↔商品ID”的对应关系。

新增表结构

-- 给商品表增加条码字段ALTER TABLE goods ADD COLUMN barcode TEXT;-- 创建条码映射表CREATE TABLE IF NOT EXISTS barcode_mapping (map_id INTEGER PRIMARY KEY AUTOINCREMENT,barcode TEXT UNIQUE NOT NULL,goods_id INTEGER NOT NULL,first_scan_time DATETIME DEFAULT (datetime('now','localtime')),last_scan_time DATETIME,scan_count INTEGER DEFAULT 1,FOREIGN KEY (goods_id) REFERENCES goods(goods_id));
三、界面改造:增加扫码工具栏

在软件界面顶部增加一个持久存在的扫码输入框,光标默认就在那里:


扫码区

def create_scan_toolbar(self, parent):"""在界面顶部创建全局扫码工具栏"""toolbar = ttk.LabelFrame(parent, text=" 扫码快捷录入", padding=5)toolbar.pack(fill=tk.X, padx=2, pady=5)self.scan_entry = ttk.Entry(frame, width=35, font=('Arial', 14))self.scan_entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)self.scan_entry.focus_set()self.scan_entry.bind('', self.handle_barcode_scan)# F2快捷键回到扫码框self.root.bind('', lambda e: self.scan_entry.focus_set())
四、核心代码:扫码处理全流程 4.1 扫码主入口

def handle_barcode_scan(self, event):barcode = self.scan_entry.get().strip()if not barcode:return# 查条码映射表goods_id = self.db.find_goods_by_barcode_mapping(barcode)if goods_id:# 已知条码:直接处理self.db.update_barcode_scan_count(barcode)self.process_known_barcode(barcode, goods_id)else:# 未知条码:弹出商品选择窗口self.show_goods_selection_window(barcode)self.scan_entry.delete(0, tk.END)self.scan_entry.focus_set()
4.2 新条码弹窗选择商品(最核心的交互)

当扫到一个新条码时,自动弹窗让老板选择对应的商品:


扫到新条码 需要选择商品

def show_goods_selection_window(self, barcode):"""弹出商品选择窗口,让老板把条码和商品关联起来"""win = tk.Toplevel(self.root)win.title("新条码识别 - 请选择商品")win.geometry("600x500")win.transient(self.root)win.grab_set()# ... 创建商品列表Treeview,加载所有商品 ...def confirm_selection():selected = tree.selection()if not selected:returngoods_id = tree.item(selected[0])['values'][0]self.db.save_barcode_mapping(barcode, goods_id)win.destroy()self.process_known_barcode(barcode, goods_id)
4.3 智能联动:自动识别当前操作页

def process_known_barcode(self, barcode, goods_id):goods = self.db.get_goods_by_id(goods_id)current_tab = self.notebook.select()tab_text = self.notebook.tab(current_tab, 'text')if "采购" in tab_text:# 自动填充采购表单self.purchase_goods.set(f"{goods['goods_id']}-{goods['goods_name']}")self.purchase_price.insert(0, str(goods['cost_price']))self.purchase_qty.insert(0, "1")elif "销售" in tab_text:# 检查库存 + 自动填充销售表单stock = self.db.get_stock_balance(goods_id)if stock <= 0:messagebox.showerror("库存不足", f"库存为 0,无法销售!")returnself.sales_goods.set(f"{goods['goods_id']}-{goods['goods_name']} (库存:{stock})")self.sales_price.insert(0, str(goods['sale_price']))self.sales_qty.insert(0, "1")
五、完整操作演示 场景一:扫新条码 → 弹窗选商品 → 永久记住


第一次录入条码

场景二:采购入库

切换到「采购录入」页,扫码后自动填好商品和单价,确认数量后点击确认录入:


直接录入数量,金额自动计算

场景三:销售出库 + 自动验库存

切换到「销售录入」页,扫码后自动填好商品和售价:


销售出库

如果销售数量超过库存,系统自动拦截:


超出库存了

销售完成后,库存自动更新:


商品销售后的库存

七、小结

今天我们用 一张映射表 + 一个弹窗 + 四个核心函数,实现了扫码枪的“智能匹配”功能:

功能

效果

扫已知条码

自动识别,自动填表

扫未知条码

弹窗选商品,自动保存对应关系

切换标签页

自动判断是采购还是销售

一次匹配

永久使用,越用越快

扫码录入搞定了,下期讲:

一键导出Excel报表,月底对账不再愁。欢迎关注,我们下期见!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
49岁胡可带俩儿子拍杂志,安吉也太帅了吧,小鱼儿依然胖但长高了

49岁胡可带俩儿子拍杂志,安吉也太帅了吧,小鱼儿依然胖但长高了

东方不败然多多
2026-08-08 13:06:11
首任丈夫是祝延平,二嫁改嫁杜志国,半生辗转,晚年和儿子彼此依靠

首任丈夫是祝延平,二嫁改嫁杜志国,半生辗转,晚年和儿子彼此依靠

小椰的奶奶
2026-08-06 01:26:19
中央气象台最新研判:“白海豚”登陆后走向仍有变数,上海将有大到暴雨

中央气象台最新研判:“白海豚”登陆后走向仍有变数,上海将有大到暴雨

上观新闻
2026-08-08 13:00:20
湖人官微晒史上伟大双人组:东契奇+里夫斯在列,詹眉缺席

湖人官微晒史上伟大双人组:东契奇+里夫斯在列,詹眉缺席

懂球帝
2026-08-08 15:10:03
浙江温岭一家四口走在海边堤坝上,其中9岁男孩被海浪卷走,目前仍在搜救中

浙江温岭一家四口走在海边堤坝上,其中9岁男孩被海浪卷走,目前仍在搜救中

鲁中晨报
2026-08-08 16:06:12
阿森纳与阿联酋航空续下新长约,每年赞助费约7000万镑全球第3

阿森纳与阿联酋航空续下新长约,每年赞助费约7000万镑全球第3

智道足球
2026-08-08 16:59:20
“这面相能是善良的孩子?”男生和亲爹吵架,母亲发小作文维护,给人看麻了!

“这面相能是善良的孩子?”男生和亲爹吵架,母亲发小作文维护,给人看麻了!

林林先生
2026-08-07 09:20:03
土木堡之变中战死的重臣

土木堡之变中战死的重臣

小豫讲故事
2026-08-06 06:00:15
第聂伯河的未来,真如黑龙江的翻版?大弟:俄国至少得控制出海口

第聂伯河的未来,真如黑龙江的翻版?大弟:俄国至少得控制出海口

历史摆渡
2026-08-06 12:45:03
最新 | 168人遇难!原因公布!

最新 | 168人遇难!原因公布!

天津广播
2026-08-08 05:33:39
从民办教师到正厅级,来看看河南女局长春香姐的时装秀

从民办教师到正厅级,来看看河南女局长春香姐的时装秀

闻讯而谈
2026-08-07 17:42:02
乌克兰袭击俄两座炼油厂:年炼油1510万吨,5人受伤

乌克兰袭击俄两座炼油厂:年炼油1510万吨,5人受伤

桂系007
2026-08-08 19:52:46
6预警齐发:今晚至明晚,浙江、上海、江苏、安徽、福建、台湾、云南、重庆、贵州、湖北等地有大雨或暴雨

6预警齐发:今晚至明晚,浙江、上海、江苏、安徽、福建、台湾、云南、重庆、贵州、湖北等地有大雨或暴雨

台州交通广播
2026-08-08 19:09:43
大幅溢价45%!A股存储巨头定增37亿元,多家上市公司认购

大幅溢价45%!A股存储巨头定增37亿元,多家上市公司认购

21世纪经济报道
2026-08-08 19:16:37
15岁少年骑车自驾西藏,只有二百块,喝厕水睡地上,全靠摩友救济

15岁少年骑车自驾西藏,只有二百块,喝厕水睡地上,全靠摩友救济

历史点行
2026-08-08 20:25:31
中国男篮VS乌拉圭,央视确定直播,郭士强的字引热议,杨瀚森要归队

中国男篮VS乌拉圭,央视确定直播,郭士强的字引热议,杨瀚森要归队

体育大学僧
2026-08-08 09:30:11
大龄剩男的最后结局都咋样了?真实案例,真的扎心...

大龄剩男的最后结局都咋样了?真实案例,真的扎心...

慧翔百科
2026-08-07 08:29:27
苹果新机官宣:9月9日,即将发布登场!

苹果新机官宣:9月9日,即将发布登场!

科技堡垒
2026-08-07 11:37:35
只免费一年!武汉机场高速将再度收费,无数车主直呼太无奈

只免费一年!武汉机场高速将再度收费,无数车主直呼太无奈

辉哥说动漫
2026-08-08 13:52:37
阿足协不强迫梅西参加2028美洲杯

阿足协不强迫梅西参加2028美洲杯

体坛周报
2026-08-08 10:40:22
2026-08-08 21:31:00
侃故事的阿庆
侃故事的阿庆
几分钟看完一部影视剧,诙谐幽默的娓娓道来
766文章数 9143关注度
往期回顾 全部

科技要闻

SpaceX最快下周完成600亿美元收购Cursor

头条要闻

烟草公司职工婚内出轨 与2名异性多次发生不正当关系

头条要闻

烟草公司职工婚内出轨 与2名异性多次发生不正当关系

体育要闻

29岁克拉克死因公布:吸食海洛因与可卡因

娱乐要闻

萧敬腾坦白!与大14岁妻子选择丁克

财经要闻

一枚“回旋镖”,击中王思聪

汽车要闻

华为乾崑ADS 5/限时售21.99万起 阿维塔07L正式上市

态度原创

教育
数码
本地
手机
公开课

教育要闻

高中英语作文如何保持在20分以上?超纲词≠高级表达,关键在这里

数码要闻

内存越贵越要扔!100多台48GB内存MacBook Pro被销毁 网友:捐了不行吗

本地新闻

课本里的童年,绍兴正上演

手机要闻

真我realme 16x手机海外预热:天玑6300芯片,支持144Hz高刷

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版