「Python3」基于qrcode和tkinter库实现二维码生成器(及Python3中少量避坑指南)

qrcode库与tkinter库部分解析

这里只列举了此次二维码生成器所用到的库函数的部分解析,主要针对其安装和避坑点进行讲解。详细参数作用将在后面给出。

qrcode库

前期准备

进入命令行窗口,执行以下命令:

  • pip install qrcode

若是python不在C盘当中,可以在前面加上python所在地址,执行命令:

  • 地址 -m pip install qrcode

简易二维码生成方法如下:

import qrcode	#导入qrcode库
img = qrcode.make("http://baidu.com")	#括号里为二维码的内容,这里生成的二维码可以打开百度页面
img.save("path")	#path为二维码保存路径

因为需要用到嵌入图片的操作,因此需要定义一个qrcode库中的QRcode类对象,使用make_image(),与make()相比,参数更加复杂,之后会详细说明。

tkinter库

前期了解

tkinter是Pyhton的标准GUI库,为Python内置的一个库,因此不需要再次进行安装。

#导入tkinter库
#方法一
import tkinter
#方法二
from tkinter import *
#方法三
from Tkinter import *

在Python3中已经没有Tkinter模块了,这是需要避坑的一个点。

这里对于后面所用到的tkMessageBox也进行一定的讲明:
在Python3中使用tkMessageBox

from tkinter import *
from tkinter import message
#或者直接用tkinter.messagebox也可以

Tkinter构造二维码生成器框架

import tkinter as tk

top = tk.Tk()
top.title('二维码生成器')	#框架名称
top.geometry('512x512')	#生成的框架大小

#Frame框架可以删去,直接用Entry输入文本替代
f1 = tk.Frame(top,bg="white",takefocus="True",width=290,height=28,bd=1)
f1.place(x=100,y=11)

f2 = tk.Frame(top,bg="white",takefocus="True",width=290,height=28,bd=1)
f2.place(x=100,y=51)

f3 = tk.Frame(top,bg="white",takefocus="True",width=330,height=330,bd=1)
f3.place(x=60,y=120)

e1 = tk.Entry(f1,bd=1,width=41,textvariable=())
e1.pack()

e2 = tk.Entry(f2,bd=1,width=41,textvariable=())
e2.pack()

b1 = tk.Button(top,bg="white",text="生成二维码",justify="center",width=10,height=1,command=create)
b1.place(x=400,y=50)

b2 = tk.Button(top,bg="white",text="选择图片",justify="center",width=10,height=1,command=picture)
b2.place(x=400,y=10)

b3 = tk.Button(top,bg="white",text="保存二维码",justify="center",width=10,height=1,command=save)
b3.place(x=400,y=250)

l1 = tk.Label(top,text="选择内嵌图片")
l1.place(x=15,y=12)

l2 = tk.Label(top,text="输入二维码信息")
l2.place(x=5,y=53)

l3 = tk.Label(top,text="二维码")
l3.place(x=208,y=95)

top.mainloop()

这里说明一下tkinter中的几个控件。

Frame框架控件

语法格式:

  • w = Frame(master,option,…)

master:框架的父容器。
option:可选项,即该框架的可设置属性。
具体内容可见:https://www.runoob.com/python/python-tk-frame.html

Entry输入文本控件

语法格式:

  • w = Entry(master,option,…)

master:框架的父容器。
option:可选项,即该文本框的可设置属性。
具体内容可见:https://www.runoob.com/python/python-tkinter-entry.html

Button按钮控件

语法格式:

  • w = Button(master,option = value,…)

master:按钮的父容器。
option:可选项,即该按钮的可设置属性。
具体内容可见:https://www.runoob.com/python/python-tk-button.html

Label标签控件

语法格式:

  • w = Label(master,option,…)

master:标签的父容器。
option:可选项,即该标签的可设置属性。
具体内容可见:https://www.runoob.com/python/python-tk-label.html

按钮关联函数

选择图片函数

#选择图片,使用tkinter库中filedialog来达到选择图片返回文件地址的目的
def picture():
    global e3   #将e3设为全局变量,以便create()函数中可以使用
    global flag #设一个flag作为标志,判断是否有插入图片
    picname = tk.StringVar()
    picpath = filedialog.askopenfilename()
    picname.set(picpath)
    e3 = tk.Entry(e1, bd=1, width=41, textvariable=(picname))
    e3.pack()
    flag = flag + 1

关联按钮b2

生成二维码函数

def create():
    global b    #全局变量b用来刷新二维码,因本人实力有限,所以只能用笨办法
    global label1   #作用同上
    global pr2  #用来保存二维码,不知道为什么不嵌入图片的二维码,保存后会消失
    qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H)   #纠缠能力设定为高,否则qrcode可能识别不到图片
    pr1 = e2.get()
    qr.add_data(pr1)
    pr3 = ".//qrcode.png"
    if flag == 0:
        pr2 = qr.make_image(image_factory=StyledPilImage)
    else:
        pr2 = qr.make_image(image_factory=StyledPilImage,embeded_image_path=e3.get())   #嵌入图片操作
    pr2.save(pr3)
    qrpicture = tk.PhotoImage(file=pr3)
    if b == 0:
        label1 = tk.Label(f3, bd=1, width=330, height=330, image=qrpicture)
        label1.pack()
    else:
        label1.pack_forget()
        label1 = tk.Label(f3, bd=1, width=330, height=330, image=qrpicture)
        label1.pack()
    b = b + 1

关联按钮b1

  • QRCode类对象:
qr = qrcode.QRCode(vision = 1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size = 10,
border = 4)
#version控制二维码大小(1~40),也可用box_size表示
#error_correction为二维码的纠错能力,嵌入图片时需要设置最高,否则二维码可能无法识别图片
#设定QRCode类对象后,需要调用add_data()方法将二维码信息添加给对象qr

生成二维码图像对象会比make()参数更为复杂:

image_factory	#用来设定使用的图片工厂,需要用到StyledPillmage类
module_drawer	#用来设定构成二维码元素的形状,默认为方形尖角,若需设为圆角则要用到RoundedModuleDrawer类
color_mask	#用来设置颜色遮罩,用色阶式遮罩
embeded_image_path	#表示插入图片的路径,用来嵌入图片

【注】:前面的纠错能力需要设定为高。

二维码保存函数

def save():
    if b==0:
        tkMessageBox.showinfo("Error","无二维码图片可保存")
    else:
        sname = tk.StringVar()
        spath = filedialog.asksaveasfilename(defaultextension='.png')   #设置保存的图片为.png文件
        sname.set(spath)
        pr2.save(str(sname.get()))

关联按钮b3

完整代码

import qrcode
import tkinter as tk
import tkinter.messagebox as tkMessageBox
from tkinter import filedialog
from qrcode.image.styledpil import StyledPilImage

top = tk.Tk()
top.title('二维码生成器')
top.geometry('512x512')

b = 0
def create():
    global b    #全局变量b用来刷新二维码
    global label1   #作用同上
    global pr2  #用来保存二维码
    qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H)   #纠缠能力设定为高,否则qrcode可能识别不到图片
    pr1 = e2.get()
    qr.add_data(pr1)
    pr3 = ".//qrcode.png"
    if flag == 0:
        pr2 = qr.make_image(image_factory=StyledPilImage)
    else:
        pr2 = qr.make_image(image_factory=StyledPilImage,embeded_image_path=e3.get())   #嵌入图片操作
    pr2.save(pr3)
    qrpicture = tk.PhotoImage(file=pr3)
    if b == 0:
        label1 = tk.Label(f3, bd=1, width=330, height=330, image=qrpicture)
        label1.pack()
    else:
        label1.pack_forget()
        label1 = tk.Label(f3, bd=1, width=330, height=330, image=qrpicture)
        label1.pack()
    b = b + 1
flag = 0

#选择图片,使用tkinter库中filedialog来达到选择图片返回文件地址的目的
def picture():
    global e3   #将e3设为全局变量,以便create()函数中可以使用
    global flag #设一个flag作为标志,判断是否有插入图片
    picname = tk.StringVar()
    picpath = filedialog.askopenfilename()
    picname.set(picpath)
    e3 = tk.Entry(e1, bd=1, width=41, textvariable=(picname))
    e3.pack()
    flag = flag + 1

def save():
    if b==0:
        tkMessageBox.showinfo("Error","无二维码图片可保存")
    else:
        sname = tk.StringVar()
        spath = filedialog.asksaveasfilename(defaultextension='.png')   #设置保存的图片为.png文件
        sname.set(spath)
        pr2.save(str(sname.get()))

#Frame框架可以删去,用Entry输入文本替代
f1 = tk.Frame(top,bg="white",takefocus="True",width=290,height=28,bd=1)
f1.place(x=100,y=11)

f2 = tk.Frame(top,bg="white",takefocus="True",width=290,height=28,bd=1)
f2.place(x=100,y=51)

f3 = tk.Frame(top,bg="white",takefocus="True",width=330,height=330,bd=1)
f3.place(x=60,y=120)

e1 = tk.Entry(f1,bd=1,width=41,textvariable=())
e1.pack()

e2 = tk.Entry(f2,bd=1,width=41,textvariable=())
e2.pack()

b1 = tk.Button(top,bg="white",text="生成二维码",justify="center",width=10,height=1,command=create)
b1.place(x=400,y=50)

b2 = tk.Button(top,bg="white",text="选择图片",justify="center",width=10,height=1,command=picture)
b2.place(x=400,y=10)

b3 = tk.Button(top,bg="white",text="保存二维码",justify="center",width=10,height=1,command=save)
b3.place(x=400,y=250)

l1 = tk.Label(top,text="选择内嵌图片")
l1.place(x=15,y=12)

l2 = tk.Label(top,text="输入二维码信息")
l2.place(x=5,y=53)

l3 = tk.Label(top,text="二维码")
l3.place(x=208,y=95)

top.mainloop()

代码问题

  • 目前只能通过选择图片按钮选择插入图片,并没有实现输入框输入路径从而选择插入图片
  • 通过测试发现若是不选择插入图片而直接生成的普通二维码,在进行保存操作时原本框架内的二维码会消失不见,二次生成时却不会出现此问题。若是有嵌入操作,则不会出现这类问题
  • 若是二维码内容输入过多,会导致二维码过大,从而超出Frame框架的大小,导致二维码无法被识别

目前只发现上述问题,若有其他还请指出,万分感谢。

以上便是二维码生成器的全部内容,针对以上问题,本人才疏学浅,无法彻底解决,但会继续学习,提升能力,再次感谢!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值