制作二维码扫描器

目录

  • 前言
  • 原料
    • 主要的库
    • 资源
    • 其它
  • 制作
    • 准备工作
    • 界面
    • 功能
      • 封装扫描二维码
      • 扫描
      • 复制扫描结果
    • 成果
  • 打包
  • 结尾
  • 下载链接


本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。
因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。
违者必究,谢谢配合。
个人主页:blog.csdn.net/jzwalliser

前言

最近,想到用Python制作一个二维码扫描器,于是花了一会儿写了一个。一起看看吧!文末附下载链接哦~
在这里插入图片描述

原料

主要的库

  1. tkinter——界面
  2. pyzbar——识别
  3. pillow——加载图片
  4. pyperclip——方便复制

资源

  1. 图标

其它

  1. pyinstaller——打包

制作

准备工作

由于pyzbar、pyperclip、pillow都不是python的标准库,所以需要额外安装。运行下面几行命令:

pip install pyzbar
pip install pyperclip
pip install pillow

界面

首先,制作一个漂亮的界面。
在这里插入图片描述

import tkinter
import tkinter.ttk
import tkinter.filedialog
import tkinter.messagebox
import tkinter.scrolledtext
root = tkinter.Tk() #创建窗口
root.title("二维码扫描器")
textpad = tkinter.scrolledtext.ScrolledText(root)
textpad.pack()
textpad.configure(state=tkinter.DISABLED) #用户不应该写入文本框
openqrcode = tkinter.ttk.Button(root,text="打开图片",width=80)
openqrcode.pack()
copycontent = tkinter.ttk.Button(root,text="复制内容",width=80)
copycontent.pack()
root.mainloop()

功能

接着,需要实现各种功能。

封装扫描二维码

由于扫描二维码的过程比较复杂,因此为了代码简洁易懂,可以将整个过程封装为一个单独的函数。

def readqr(pic): #读取二维码content = [] #读取到的内容picture = PIL.Image.open(pic) #打开图片qrcode = pyzbar.pyzbar.decode(picture) #扫描二维码for qr in qrcode:url = qr.data.decode('utf-8') #解码content.append(url)return content

扫描

按下“打开图片”按钮,那就该扫描二维码了。这里需要考虑到一些情况:图片里没有二维码怎么办?图片打不开又该如何?

def showqr():filename = tkinter.filedialog.askopenfilename() #打开文件对话框copycontent.configure(text="复制内容")if filename != "": #如果有打开文件try:content = readqr(filename)except: #如果图片无法读取tkinter.messagebox.showerror("错误","无法读取图片\"" + filename + "\"。")else: #图片正常,可以读取if content != []: #如果这是个二维码for i in content:textpad.configure(state=tkinter.NORMAL) #解锁textpad.insert(tkinter.INSERT,i + '\n\n') #插入内容textpad.configure(state=tkinter.DISABLED) #上锁else:tkinter.messagebox.showinfo("无内容","该二维码中没有任何内容。(你确定这张图是二维码?)")

复制扫描结果

扫描完后,方便用户获取结果。

def copy(): #复制pyperclip.copy(textpad.get("0.0",tkinter.END)) #获取文本框中的扫描结果copycontent.configure(text="已复制") #提示用户已复制

成果

集齐刚才几个代码碎片,即可得到一个二维码扫描器!

#作者:Jzwalliser
#日期:2024/2/3import tkinter
import tkinter.ttk
import tkinter.filedialog
import tkinter.messagebox
import tkinter.scrolledtext
import pyzbar
import pyzbar.pyzbar
import PIL
import PIL.Image
import pyperclip
import sys
import osdef getpath(file): #获取当前目录if getattr(sys,'frozen',None): #是否打包了?return os.path.join(sys._MEIPASS,file) #打包了,那就返回临时的工作路径else: #还没打包return os.path.join(os.path.abspath("."),file) #返回当前路径def readqr(pic): #读取二维码content = [] #读取到的内容picture = PIL.Image.open(pic) #打开图片qrcode = pyzbar.pyzbar.decode(picture) #扫描二维码for qr in qrcode:url = qr.data.decode('utf-8') #解码content.append(url)return contentdef showqr():filename = tkinter.filedialog.askopenfilename() #打开文件对话框copycontent.configure(text="复制内容")if filename != "": #如果有打开文件try:content = readqr(filename)except: #如果图片无法读取tkinter.messagebox.showerror("错误","无法读取图片\"" + filename + "\"。")else: #图片正常,可以读取if content != []: #如果这是个二维码for i in content:textpad.configure(state=tkinter.NORMAL) #解锁textpad.insert(tkinter.INSERT,i + '\n\n') #插入内容textpad.configure(state=tkinter.DISABLED) #上锁else:tkinter.messagebox.showinfo("无内容","该二维码中没有任何内容。(你确定这张图是二维码?)")def copy(): #复制pyperclip.copy(textpad.get("0.0",tkinter.END)) #获取文本框中的扫描结果copycontent.configure(text="已复制") #提示用户已复制root = tkinter.Tk() #创建窗口
root.title("二维码扫描器")
root.iconbitmap(getpath("icon_clear.ico"))
textpad = tkinter.scrolledtext.ScrolledText(root)
textpad.pack()
textpad.configure(state=tkinter.DISABLED) #用户不应该写入文本框
openqrcode = tkinter.ttk.Button(root,text="打开图片",command=showqr,width=80)
openqrcode.pack()
copycontent = tkinter.ttk.Button(root,text="复制内容",command=copy,width=80)
copycontent.pack()
root.mainloop()

打包

直接打包会出问题。需要将两个dll文件添加进去才能打包成功,像这样:
在这里插入图片描述
因此,打包命令:

pyinstaller -F -w --hidden-import PIL --hidden-import tkinter --hidden-import pyperclip --hidden-import pyzbar -i icon.ico --add-data=icon_clear.ico:. --add-data=libiconv.dll:./pyzbar/ --add-data=libzbar-64.dll:./pyzbar/ QRCodeReader.py

pyinstaller一顿输出,最后在dist文件夹下生成了我需要的exe。大功告成!

结尾

大家还能想到什么功能呢?欢迎评论!我们下期再见,记得点赞收藏哦~~


下载链接

二维码扫描器 下载
文件:QRCodeReader.zip
百度网盘:https://pan.baidu.com/s/1FjUXIa-INvpZcOdNMfhLdA?pwd=0000
CSDN:https://download.csdn.net/download/jzwalliser/88809272

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云卷云舒:论超级数据库、算网数据库、智算数据库

笔者大胆提出一种“超级数据库”的概念设想。 一、超级能力 就像当初提出“超级计算机”一样,我们是否同样可以提出“超级数据库”的概念呢?当然不是不可以。 二、超级计算机 我们回忆一下“超级计算机”的发展之路,大致经过了如下几个环…

ChatGPT 变懒最新解释!或和系统Prompt太长有关

大家好我是二狗。 ChatGPT变懒这件事又有了最新解释了。 这两天,推特用户Dylan Patel发文表示: 你想知道为什么 ChatGPT 和 6 个月前相比会如此糟糕吗? 那是因为ChatGPT系统Prompt是竟然包含1700 tokens,看看这个prompt里面有多…

RabbitMQ-2.SpringAMQP

SpringAMQP 2.SpringAMQP2.1.创建Demo工程2.2.快速入门2.1.1.消息发送2.1.2.消息接收2.1.3.测试 2.3.WorkQueues模型2.2.1.消息发送2.2.2.消息接收2.2.3.测试2.2.4.能者多劳2.2.5.总结 2.4.交换机类型2.5.Fanout交换机2.5.1.声明队列和交换机2.5.2.消息发送2.5.3.消息接收2.5.4…

【Java IO】同步异步和阻塞非阻塞真正的区别!!!

先上结论: 同步异步和阻塞非阻塞真正的区别!!! 假设某个进程正在运行下面这段代码: ...... operatorA......; read(); operatorB......; operatorC......;当进程执行完operatorA后开始进行read系统调用,…

代码随想录 Leetcode376. 摆动序列

题目&#xff1a; 代码&#xff08;首刷看解析 2024年2月9日&#xff09;&#xff1a; class Solution { public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 1) return nums.size();int direction 0;//1上升&#xff0c;0下降int res 0;//res…

【Linux】Shell编程

Shell编程 目录 Shell编程1.shell基础1.输入重定向 & 输出重定向2.管道3.特殊字符(3.1)通配符(3.2)引号(3.3)注释符(#) 4.别名5.命令历史history 2.Shell脚本Shell脚本的执行方式(1)为脚本文件加上可执行权限,然后在命令行直接输入shell脚本文件名执行。(2)sh shell脚本名(…

STM32控制JQ8400语音播报模块

时间记录&#xff1a;2024/2/7 一、JQ8400引脚介绍 标示说明ONE LINE一线操作引脚BUSY忙信号引脚&#xff0c;正在播放语音时输出高电平RX串口两线操作接收引脚TX串口两线操作发送引脚GND电源地引脚DC-5V电源引脚&#xff0c;3.3-5VDAC-RDAC输出右声道引脚DAC-LDAC输出左声道…

机器学习:分类决策树(Python)

一、各种熵的计算 entropy_utils.py import numpy as np # 数值计算 import math # 标量数据的计算class EntropyUtils:"""决策树中各种熵的计算&#xff0c;包括信息熵、信息增益、信息增益率、基尼指数。统一要求&#xff1a;按照信息增益最大、信息增益率…

mysql8.0 正值表达式Regular expressions (sample database classicmodels _No.5)

mysql8.0 正值表达式Regular expressions 准备工作&#xff0c;可以去下载 classicmodels 数据库资源如下 [ 点击&#xff1a;classicmodels] (https://download.csdn.net/download/tomxjc/88685970) 也可以去我的博客资源下载 https://download.csdn.net/download/tomxjc/8…

第二十六回 母夜叉孟州道卖人肉 武都头十字坡遇张青-Ubuntu 防火墙ufw配置

武松到县里投案&#xff0c;县官看武松是个汉子&#xff0c;就把诉状改成&#xff1a;武松与嫂一时斗殴杀死&#xff0c;后西门庆前来&#xff0c;两人互殴&#xff0c;打死西门庆。上报东平府。东平府尹也可怜武松&#xff0c;从轻发落&#xff0c;最后判了个&#xff1a;脊杖…

一条 SQL 更新语句是如何执行的?

之前你可能经常听 DBA 同事说&#xff0c;MySQL 可以恢复到半个月内任意一秒的状态&#xff0c;惊叹的同时&#xff0c;你是不是心中也会不免会好奇&#xff0c;这是怎样做到的呢&#xff1f; 我们先从一条更新语句讲起&#xff0c;首先创建一个表&#xff0c;这个表有一个主键…

百卓Smart管理平台 uploadfile.php 文件上传漏洞(CVE-2024-0939)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

零基础学Python(9)— 流程控制语句(下)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。流程控制语句是编程语言中用于控制程序执行流程的语句&#xff0c;本节课就带大家认识下Python语言中常见的流程控制语句&#xff01;~&#x1f308; 目录 &#x1f680;1.while循环 &#x1f680;2.for循环 &#x1…

RCE(命令执行)知识点总结最详细

description: 这里是CTF做题时常见的会遇见的RCE的漏洞知识点总结。 如果你觉得写得好并且想看更多web知识的话可以去gitbook.22kaka.fun去看&#xff0c;上面是我写的一本关于web学习的一个gitbook&#xff0c;当然如果你能去我的github为我的这个项目点亮星星我会感激不尽htt…

STM32之定时器

一、简介 STM32F4xx系列共有14个定时器&#xff0c;其中2个高级定时器、10个通用定时器、2个基本定时器。下图 为各定时器及其功能。 图1.各定时器及其功能 二、定时器的计数模式 向上计数模式&#xff1a;计数器从0计数到自动加载值(TIMx_ARR)&#xff0c;然后重新从0开始…

17:定时器编程实战

1、实验目的 (1)使用定时器来完成LED闪烁 (2)原来实现闪烁时中间的延迟是用delay函数实现的&#xff0c;在delay的过程中CPU要一直耗在这里不能去做别的事情。这是之前的缺点 (3)本节用定时器来定一个时间&#xff08;譬如0.3s&#xff09;&#xff0c;在这个定时器定时时间内…

抽象springBoot报错

Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured. 中文翻译&#xff1a;无法配置DataSource&#xff1a;未指定“url”属性&#xff0c;并且无法配置嵌入数据源。 DataSource 翻译&#xff1a;数据源 得…

The Back-And-Forth Method (BFM) for Wasserstein Gradient Flows windows安装

本文记录了BFM算法代码在windows上的安装过程。 算法原网站&#xff1a;https://wasserstein-gradient-flows.netlify.app/ github&#xff1a;https://github.com/wonjunee/wgfBFMcodes 文章目录 FFTWwgfBFMcodesMATLABpython注 FFTW 官网/下载路径&#xff1a;https://ww…

警惕钓鱼邮件,保护您的开发者账号

请警惕钓鱼邮件 钓鱼邮件经常冒充官方 Google Play 通信&#xff0c;以窃取敏感信息&#xff0c;并最终为了经济利益盗取开发者账号。 保护开发者免受钓鱼邮件侵害的提示&#xff1a; Google.com 是用于联系开发者的唯一合法电子邮件域名。我们不会通过电子邮件或实时聊天要求您…

【Linux系统学习】 4.Linux实用操作 上

Linux实用操作 1.各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键ctrl c 命令输入错误&#xff0c;也可以通过快捷键ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1…