网站首页 > 技术文章 正文
应网友和粉丝留言要求,特用 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运行如下:

摄像头亮,就是成功啦
您可以试试添加一个功能:停止后,再次启动摄像头扫码。挑战一下哦。
猜你喜欢
- 2024-12-17 Python 中双冒号“::”是什么运算符,有什么功能
- 2024-12-17 一文了解 Python 中的新功能:match-case 多分支选择语句
- 2024-12-17 Python中实现线程和多线程开发以及线程安全功能示例
- 2024-12-17 Python3.6-3.10发布时间及主要新增功能
- 2024-12-17 用Python实现Wake On Lan远程开机功能
- 2024-12-17 python pillow图像处理功能及应用
- 2024-12-17 Python range() 函数的功能增强版 arange()、linspace()
- 2024-12-17 python每天学习一点点(模拟10086查询功能简易版)
- 2024-12-17 Python 3.13 中5 个新增的功能将改变您的编码方式
- 2024-12-17 用python实现图像查找功能
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)