Lv.1
在 【Python作品分享】二维码2.1【教程贴】 中回复
# -*- coding: UTF-8 -*-
'''
----* 说明 *----
二维码内的数据要在[texts.txt]中编辑,编码格式为[UTF-8]
二维码的背景图片的名字必须是[bg.(png|jpg|jpge|bmp|gif)]
由于[MyQR]库不支持中文,所以就不要再[texts.txt]中写中文了
'''
import os
import re
import tkinter
import matplotlib.pyplot as plt
from MyQR import myqr
from PIL import Image
def EXIT():
os._exit(0)
def input_error_correction_level(): # 输入纠错等级
correction = {'1': 'L', '2': 'M', '3': 'Q', '4': 'H'}
def back_error_correction_level(): # 判断用户输入的纠错等级是否合法
global code, level, num_level
try: # 尝试判断用户的输入的纠错等级是否合法
num_level = str(input_level_entry.get())
level = correction[num_level]
except Exception: # 不合法
level = 'None' # 将纠错等级设置为['None']
code = -1 # 设置状态码[-1]
input_level.destroy() # 关闭[input_level]
else: # 合法
code = 0 # 设置状态码[0]
input_level.destroy() # 关闭[input_level]
input_level = tkinter.Tk() # 创建输入纠错等级的窗口[input_level]
input_level.geometry('326x183') # 设置[input_level]的大小
input_level.title('MyQR') # 设置[input_level]的标题
input_level.resizable(False, False) # 将 [input_level]的大小固定
input_level_label = tkinter.Label( # 设置[input_level]的文本信息为输入提示
input_level,
text='请输入纠错等级\n(1-4):',
font=('微软雅黑', 20),
fg='#000000')
input_level_label.grid(padx=40, pady=1)
input_level_entry = tkinter.Entry( # 为[input_level]创建用于输入纠错码的输入框
input_level,
font=('微软雅黑', 20),
width=15)
input_level_entry.grid(padx=40, pady=5)
input_level_button = tkinter.Button( # 为[input_level]创建确定按钮
input_level,
text='确定',
font=('微软雅黑', 10),
fg='#000000',
bg='#00da00',
activeforeground='#ffff00',
activebackground='#ff0000',
command=back_error_correction_level)
input_level_button.grid(padx=40, pady=20)
input_level.mainloop() # 展示窗口[input_level]
return code, level # 返回状态码和纠错等级
def make_qrcode(c, l): # [c]为的状态码,[l]为纠错等级
retuen_message = tkinter.Tk() # 创建输入纠错等级的窗口[retuen_message]
retuen_message.geometry('326x183') # 设置[retuen_message]的大小
retuen_message.title('MyQR') # 设置[retuen_message]的标题
retuen_message.resizable(False, False) # 将[retuen_message]的大小固定
try: # 尝试打开文件[texts.tst]
file = open('./texts.txt', 'r', encoding='UTF-8')
except Exception: # 如果失败,就创建这个名为[texts.tst]的文件
file = open('./texts.txt', 'w+', encoding='UTF-8')
data = file.read(1000) # 只读文件
file.close() # 关闭文件[texts.txt]
else: # 否则就只直接读取前1000个字符,防止生成二维码时出错
data = file.read(1000)
file.close() # 关闭文件[texts.txt]
if (c == 0): # 如果状态码为 [0]
files = os.listdir() # 读取当前目录的所以文喵ile(r'bg\.(png|jpg|jpge|bmp)', re.I) # 创建一个正则表达式对象[judgment]
try:
for file_name in files: # 循环判断文件名是否为[bg]
if (file_name == 'bg.gif'): # 如果文件类型为[gif]
myqr.run( # 生成动态图片二维码
words=data,
level=l,
picture=file_name,
colorized=True,
save_name='qrcode.gif')
picture_type = 'gif' # 将[picture_type]设为[gif]
break # 退出循环
elif (judgment.search(file_name) != None): # 如果文件类型为[(png|jpg|jpge)]中的任意一个
myqr.run( # 生成静态图片二维码
words=data,
level=l,
picture=file_name,
colorized=True,
save_name='qrcode.png')
picture_type = 'png' # 将[picture_type]设为[png]
break # 退出循环
else: # 当没有搜索出文件名是为[bg]的图片文件时
myqr.run( # 生成普通二维码
words=data,
level=l,
save_name='qrcode.png')
picture_type = 'png' # 将[picture_type]设为[png]
except ValueError:
retuen_message_label = tkinter.Label( # 设置[retuen_message]的文本信息为字符错误
retuen_message,
bg='#f0f0f0',
fg='#ff0000',
text='字符错误,请检查[texts.txt]\n中是否有不支持的字符!',
font=('微软雅黑', 20),
width=20,
height=4)
retuen_message_label.grid()
c = -2
else:
retuen_message_label = tkinter.Label( # 设置[retuen_message]的文本信息为二维码的生成信息
retuen_message,
bg='#f0f0f0',
fg='#000000',
text=('二维码已生成\n纠错等级:%c' % num_level),
font=('微软雅黑', 20),
width=20,
height=4)
retuen_message_label.grid()
else: # 如果状态码不为 [0]
retuen_message_label = tkinter.Label( # 设置[retuen_message]的文本信息为纠错等级错误
retuen_message,
bg='#f0f0f0',
fg='#ff0000',
text='纠错等级错误!',
font=('微软雅黑', 20),
width=20,
height=4)
retuen_message_label.grid()
retuen_message_button = tkinter.Button( # 为[input_level]创建关闭按钮
retuen_message,
text='关闭',
fg='#000000',
bg='#00da00',
activeforeground='#ffff00',
activebackground='#ff0000',
command=EXIT)
retuen_message_button.grid()
if (c == 0): # 状态码为[0]时
if (picture_type == 'png'): # 如果[picture_type]为[png]
img = Image.open('./qrcode.png') # 打开[qrcode.png]
plt.figure('MyQR') # 打开窗口标题
plt.imshow(img) # 将打开的[qrcode.png]放入窗口
plt.show() # 展示窗口
elif (picture_type == 'gif'): # 如果[picture_type]为[gif]
img = Image.open('./qrcode.gif') # 打开[qrcode.gif]
plt.figure('MyQR') # 设置窗口标题
plt.imshow(img) # 将打开的[qrcode.gif]放入窗口
plt.show() # 展示窗口
retuen_message.mainloop() # 展示窗口[retuen_message]
def main():
message = input_error_correction_level()
make_qrcode(c=message[0], l=message[1])
if (__name__ == '__main__'):
main()2023-05-13T14:40:06 点赞:0