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

内容分享4天前发布
0 11 0

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

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

第一,要安装一下第三方模块。为了提高按照效率,提议从国内镜像源进行安置,要用到 参数 -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 实现简单的“扫码功能”,举一反三即可更实用

摄像头亮,就是成功啦

您可以试试添加一个功能:停止后,再次启动摄像头扫码。挑战一下哦。

#python# #Flet #扫码# #cv#

© 版权声明

相关文章

11 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    那是我的白萝卜 读者

    一直好奇这个怎么设计复杂页面呢?

    无记录
  • 头像
    橘子你个欧瑞芝 读者

    专门有各种布局控件,后面专门上几篇“布局”的文章,做出实用,甚至复杂的界面。

    无记录
  • 头像
    云洙云秀 读者

    这个可以在手机上运行吗?是app

    无记录
  • 头像
    凌曦儿儿 投稿者

    可以。正因为可以在手机、pc`web上通用,又简单,所以才值得学习。不然,有有那么多GUI框架,为何要推介Flet呢?

    无记录
  • 头像
    二十岁优雅后妈 读者

    也可以用js实现,这样的话手机直接打开一个网页就可以扫码了,也不用安装啥

    无记录
  • 头像
    Ahywon 投稿者

    收藏学习了

    无记录
  • 头像
    平淡归真 读者

    好酷,想试试呢

    无记录
  • 头像
    空白 读者

    收藏了,感谢分享

    无记录
  • 头像
    是向弥吖 投稿者

    实用,感谢分享

    无记录
  • 头像
    情感伴享 读者

    厉害,简单易懂

    无记录
  • 头像
    郑河豚Janice 读者

    这个厉害了👏

    无记录