应网友和粉丝留言要求,特用 Python + Flet 实现一个常用的简单扫码功能。Flet当前才0.24.0 版本,还没有内置的扫码控件模块,但是可以结合第三方模块 pyzbar 来实现这个功能。Python之所以强劲有生命力,很大程度上在于有“无数个”第三方模块可以直接调用。

第一,要安装一下第三方模块。为了提高按照效率,提议从国内镜像源进行安置,要用到 参数 -i 国内url
pip install pyzbar opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
关键代码 -i
https://pypi.tuna.tsinghua.edu.cn/simple 表明从 清华大学的镜像站 下载安装 pyzbar 和 opencv-python 两个模块。
其次,用VScode建立Py文档,引入数据包。
import time
import cv2
import flet as ft
from threading import Thread
from pyzbar.pyzbar import decode
关键代码 import cv2 和 from pyzbar.pyzbar import decode
再次,编写一个扫码类 Scanner。编写类是 python 基本编程技术,为了防止UI卡顿,要用到python的多线程。相关代码含义,可以结合注释看,都挺简单的 —— 人生苦短,我用python
class Scanner:
def __init__(self):
self.cap = cv2.VideoCapture(0)
self.last_code = None
self.running = True
def scan(self):
while self.running:
ret, frame = self.cap.read() # 用cv2读取摄像头帧
if not ret:
break
codes = decode(frame) # 解码模块
for code in codes:
if code.data.decode('utf-8') != self.last_code:
self.last_code = code.data.decode('utf-8')
print(f"Scanned: {self.last_code}")
time.sleep(0.5) # 减少CPU占用率
def start(self):
# 启动线程,开始扫码(看到摄像头亮,就成功了的)
Thread(target=self.scan).start()
def stop(self):
self.running = False # 停止标志
self.cap.release() # 释放资源
最后,编写 Flet 的主函数,调用Scanner类。这里要用到 Flet 的 警告对话框控件 AlertDialog,所有的控件使用,和前面分享的 文本控件、按钮控件 等等 都差不多,无非就是 显示的文本、绑定点击事件,等等,信任你一看就秒懂。还是那句话,Flet 主导一个简单、通吃,不然为啥要学 Flet 呢?主函数 也很简单,结合注释看即可啦。
def main(page: ft.Page):
scanner = Scanner() # 实例化 Scanner 类
scanner.start() # 开机便启动摄像头扫码
def on_stop(e): # 处理点击事件的响应函数
scanner.stop() # 停止扫码
page.dialog.open = False # 关闭对话框
page.update() # 跟新页面UI
# 定义一个 Flet 对话框控件
dialog = ft.AlertDialog(
title=ft.Text("Scanner"),
actions=[
ft.TextButton("Stop", on_click=on_stop),
],
on_dismiss=lambda e: on_stop(None)
)
# 启动即显示对话框控件
page.dialog = dialog
dialog.open = True
page.update()
# 启动/运行程序
ft.app(target=main)
按vscode的F5运行如下:

摄像头亮,就是成功啦
您可以试试添加一个功能:停止后,再次启动摄像头扫码。挑战一下哦。
#python# #Flet #扫码# #cv#
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
您必须登录才能参与评论!
立即登录



一直好奇这个怎么设计复杂页面呢?
专门有各种布局控件,后面专门上几篇“布局”的文章,做出实用,甚至复杂的界面。
这个可以在手机上运行吗?是app
可以。正因为可以在手机、pc`web上通用,又简单,所以才值得学习。不然,有有那么多GUI框架,为何要推介Flet呢?
也可以用js实现,这样的话手机直接打开一个网页就可以扫码了,也不用安装啥
收藏学习了
好酷,想试试呢
收藏了,感谢分享
实用,感谢分享
厉害,简单易懂
这个厉害了👏