网站首页 > 教程分享 正文
应网友和粉丝留言要求,特用 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运行如下:
您可以试试添加一个功能:停止后,再次启动摄像头扫码。挑战一下哦。
猜你喜欢
- 2025-05-14 鸿蒙开发:实现popup弹窗
- 2025-05-14 阿里大牛又一波骚操作,安卓UI开发新技能-Jetpack Compose,绝了
- 2025-05-14 程序员防崩溃指南:7个必杀技让应用稳如泰山(附实战案例)
- 2025-05-14 Android开发技巧、常见的坑和解决方案(二)
- 2025-05-14 android实现消息提示框
- 2025-05-14 深入探索 Playwright:高级功能和用法
- 2025-05-14 解锁弹框:Python 下的 Playwright 弹框处理完全指南
- 2025-05-14 Android Tips之自定义菜单
- 2025-05-14 一文带你搞懂Android多线程Handler
你 发表评论:
欢迎- 05-14C#开发串口通信实例及串口基础
- 05-14C#窗体多线程启动,暂停,继续,取消
- 05-14DotNet 入门:(一)环境安装
- 05-14C#中使用命名管道进行进程通信的实例
- 05-14使用C#编程判断某一年是否为闰年
- 05-14C#学习随笔—自定义控件(线,箭头等图形)
- 05-14UE4基础知识总结(三)
- 05-14C#使用 WinForms 实现打印基础操作
- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)