二维码生成器
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框架的大小,导致二维码无法被识别
目前只发现上述问题,若有其他还请指出,万分感谢。
以上便是二维码生成器的全部内容,针对以上问题,本人才疏学浅,无法彻底解决,但会继续学习,提升能力,再次感谢!