制作二维码扫描器

目录

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


本文由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,一经查实,立即删除!

相关文章

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

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

C语言之喝汽水问题

个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客 题目: 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实…

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脚本名(…

QT基础教程(全系列教程目录)

文章目录 前言一、QT基础教程二、QT进阶教程三、QT高级教程四、QT项目教程 前言 有了C语言全套教学文章和C全套教学文章后&#xff0c;我打算开始完成全套的QT教程文章了&#xff0c;为了方便大家更进一步的提高自己的水平和知识&#xff0c;将学习到的语言运用起来。 "…

接口测试:自动化脚本

接口测试:自动化脚本 接口自动化脚本 为什么要设计自动化脚本&#xff1f; 后台程序更新/发布新版之前需要验证下之前的功能是否能用 自动化脚本设计原则 每个测试用例都是独立的测试用例都是可重复运行的测试数据与业务相分离&#xff08;测试数据包括参数接口数据/ 测试…

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;这个表有一个主键…

设计模式(创建型模式)原型模式

目录 一、简介二、原型模式2.1、不使用原型模式2.2、使用原型模式&#xff08;浅拷贝&#xff09;2.3、使用原型模式&#xff08;深拷贝&#xff09; 三、原型模式 一、简介 原型模式&#xff08;Prototype Pattern&#xff09; 是一种创建型设计模式&#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…

re:从0开始的CSS学习之路 8. 浏览器默认样式

1. 默认样式 浏览器会有一个默认样式&#xff0c;body标签会有自带一个8px的margin属性。在布局的时候通常不想要浏览器的默认样式&#xff0c;因此可以先清除一下浏览器提供的默认样式 示例如下&#xff1a; <!DOCTYPE html> <html lang"en"><head…

代码随想录算法训练营第41天(动态规划03 ● 343. 整数拆分 ● 96.不同的二叉搜索树

动态规划part03 343. 整数拆分解题思路 96.不同的二叉搜索树解题思路 343. 整数拆分 题目链接&#xff1a; 343. 整数拆分 文章讲解&#xff1a; 343. 整数拆分 视频讲解&#xff1a; 343. 整数拆分 解题思路 动态规划五部曲 确定dp数组以及下标的含义 dp[i]&#xff1a;分…

VUE学习之路序章

前提&#xff1a; 检查是否安装node&#xff0c;要求版本在15及以上。 创建VUE项目 npm init vuelatest 执行完毕之后&#xff0c; cd vue-basenpm installnpm run dev这里可以使用cnpm&#xff0c;cnpm是npm的淘宝镜像&#xff0c;速度较快。 在这里我遇到了一个错误 No matc…