程序员的知识教程库

网站首页 > 教程分享 正文

Python+Flet 实现简单的“扫码功能”,举一反三即可更实用

henian88 2025-05-14 13:38:26 教程分享 3 ℃ 0 评论

应网友和粉丝留言要求,特用 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#

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表