制作二维码扫描器

本文介绍了如何使用Python和相关库如Tkinter、pyzbar、Pillow和pyperclip开发一个基本的二维码扫描器,包括界面设计、功能实现(扫描二维码并复制结果)、以及使用pyinstaller进行打包。作者分享了整个开发过程和最终的下载链接。
摘要由CSDN通过智能技术生成

目录

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


本文由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/3

import 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 os

def 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 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="已复制") #提示用户已复制

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值