admin管理员组文章数量:1794759
二维码生成器工具开发
1 前言
本文将使用 Python 的tkinter
库和qrcode
库创建一个简单的二维码生成器应用。这个应用允许用户输入文本或链接,然后生成相应的二维码,并可以设置二维码的颜色和保存路径。
2 所需库及工具
qrcode:用于生成二维码。
tkinter:Python 内置的 GUI 库,用于创建图形用户界面。
PIL(Pillow):用于处理图像。
os:用于操作文件系统。
requests:用于从网络获取图标。
3 程序结构与功能分析
3.1 常量定义
首先定义了一些常量,包括窗口标题、窗口尺寸、预览尺寸、默认文本、保存文件夹路径和窗口图标 URL。
代码语言:python代码运行次数:0运行复制WINDOW_TITLE = "QR生成器 - Flec" # 窗口标题
WINDOW_WIDTH = 1000 # 窗口尺寸(宽)
WINDOW_HEIGHT = 650 # 窗口尺寸(高)
PREVIEW_SIZE = 400 # 二维码预览尺寸
DEFAULT_TEXT = "/" # 输入框默认文本
SAVE_FOLDER = "qrcode/" # 保存文件夹路径
WINDOW_ICON = "/1716712986.ico" # 窗口图标
3.2 生成二维码函数
generate_qr_code
函数用于生成二维码。它首先获取用户在输入框中输入的内容,如果内容为空或超过 200 个字符,则显示相应的错误信息。
data = text_entry.get()
if not data.strip():
status_label.config(text="输入内容不能为空!")
return
if len(data) > 200:
status_label.config(text="输入内容不能超过200个字符!")
return
然后,使用 qrcode 库创建一个二维码对象,并设置其版本、错误纠正级别、像素大小和边框宽度。
代码语言:python代码运行次数:0运行复制qr = qrcode.QRCode(
version=1, # 版本
error_correction=qrcode.constants.ERROR_CORRECT_Q, # 错误纠正级别
box_size=10, # 像素大小
border=2, # 边框宽度
)
接着,根据用户选择的填充颜色和背景颜色生成二维码图像,并将其调整为预览尺寸。
代码语言:python代码运行次数:0运行复制# 添加数据到二维码
qr.add_data(data)
# 生成二维码
qr.make(fit=True)
# 获取填充颜色和背景颜色
fill_color = fill_color_var.get()
back_color = back_color_var.get()
# 声明img为全局变量
global img
# 生成二维码图像
img = qr.make_image(fill_color=fill_color, back_color=back_color)
# 调整图像大小
img = img.resize((PREVIEW_SIZE, PREVIEW_SIZE))
最后,将生成的图像显示在预览标签中,并使保存按钮变为可用状态,同时显示生成成功的状态信息。
代码语言:python代码运行次数:0运行复制# 创建预览图像
img_preview = ImageTk.PhotoImage(img)
# 设置预览标签的图像
preview_label.config(image=img_preview)
# 设置预览标签的图像引用
preview_label.image = img_preview
# 启用保存按钮
save_button.config(state="normal")
# 设置状态标签的文本
status_label.config(text="二维码生成成功!")
3.3 保存二维码函数
save_qr_code
函数用于保存生成的二维码。它使用当前时间戳作为文件名,将二维码图像保存到指定的文件夹中。
timestamp = int(time.time())
filename = f"qrcode_{timestamp}.png"
full_path = f"{SAVE_FOLDER}{filename}"
如果保存成功,则显示相应的状态信息;如果保存失败,则显示错误信息。
代码语言:python代码运行次数:0运行复制try:
if not os.path.exists(SAVE_FOLDER):
os.makedirs(SAVE_FOLDER)
img.save(full_path)
status_label.config(text="二维码保存成功!")
except Exception as e:
status_label.config(text=f"保存失败!错误信息:{e}")
3.4 创建主窗口及相关组件
创建主窗口,设置窗口标题、尺寸和图标。此处图标使用网络文件,将使用 requests 库获取图标、使用 PIL 库处理图像。
代码语言:python代码运行次数:0运行复制root = tk.Tk()
root.title(WINDOW_TITLE)
root.geometry(f"{WINDOW_WIDTH}x{WINDOW_HEIGHT}")
icon_url = WINDOW_ICON
response = requests.get(icon_url)
icon_data = response.content
icon_image = Image.open(BytesIO(icon_data))
icon_photo = ImageTk.PhotoImage(icon_image)
root.iconphoto(False, icon_photo)
3.4.1 内容输入部分
创建输入提示标签和输入框。简单设置间距和外观样式。
代码语言:python代码运行次数:0运行复制# 创建输入提示
text_label = tk.Label(root, text="请输入文本或链接:", font=("微软雅黑", 12), fg="#333")
text_label.pack(pady=(10, 0))
# 创建输入框
text_entry = tk.Entry(root, width=70, font=("微软雅黑", 12), fg="#333", bd=2, relief="ridge")
text_entry.pack(pady=10)
text_entry.insert(0, DEFAULT_TEXT)
创建输入框焦点事件处理函数。由于输入框内含有一个默认值,当点击输入框后需要移除这个默认值。
代码语言:python代码运行次数:0运行复制def on_focusin(event):
if text_entry.get() == DEFAULT_TEXT:
text_entry.delete(0, tk.END)
text_entry.bind("<FocusIn>", on_focusin)
优化输入框焦点事件。当输入框失去焦点,即使用鼠标点击到输入框以外的区域,让默认值恢复显示。
代码语言:python代码运行次数:0运行复制def on_focusout(event):
if text_entry.get() == "":
text_entry.insert(0, DEFAULT_TEXT)
text_entry.bind("<FocusOut>", on_focusout)
# 鼠标点击事件处理函数
def on_click(event):
widget = root.winfo_containing(event.x_root, event.y_root)
if widget!= text_entry:
if text_entry == root.focus_get():
root.focus_set()
# 绑定鼠标点击事件
root.bind("<1>", on_click)
3.4.2 操作按钮部分
创建一个操作按钮容器,将主界面的操作按钮存放在这个容器中。
代码语言:python代码运行次数:0运行复制button_frame = tk.Frame(root)
button_frame.pack(pady=(0, 10))
创建生成二维码按钮和保存二维码按钮,简单设置间距和外观样式,并绑定相应函数。
代码语言:python代码运行次数:0运行复制# 生成二维码按钮
generate_button = tk.Button(button_frame, text="生成", command=generate_qr_code, font=("微软雅黑", 12), fg="#333", bg="#f0f0f0", bd=2, relief="ridge")
generate_button.pack(side=tk.LEFT, padx=10, pady=10)
# 保存二维码按钮
save_button = tk.Button(button_frame, text="保存", command=save_qr_code, state="disabled", font=("微软雅黑", 12), fg="#333", bg="#f0f0f0", bd=2, relief="ridge")
save_button.pack(side=tk.LEFT, padx=10, pady=10)
创建设置按钮,简单设置间距和外观样式,创建并绑定设置函数。
代码语言:python代码运行次数:0运行复制setting_button = tk.Button(button_frame, text="设置", command=open_setting_window, font=("微软雅黑", 12), fg="#333", bg="#f0f0f0", bd=2, relief="ridge")
setting_button.pack(side=tk.LEFT, padx=10, pady=10)
def open_setting_window():
# 设置按钮函数内容
创建设置窗口并修改基本样式。
setting_window = tk.Toplevel(root)
setting_window.title("设置") # 设置窗口标题
setting_window.geometry("400x300") # 设置窗口大小
setting_window.configure(bg="#f0f0f0") # 设置窗口背景颜色
setting_window.iconphoto(False, icon_photo) # 设置窗口图标
创建设置页按钮,应用设置与恢复默认,并且创建及绑定相应函数。
代码语言:python代码运行次数:0运行复制# 应用设置按钮函数
def confirm():
global SAVE_FOLDER
SAVE_FOLDER = save_folder_entry.get()
setting_window.destroy()
# 恢复默认按钮函数
def cancel():
fill_color_var.set("black")
back_color_var.set("white")
generate_qr_code()
setting_window.destroy()
button_frame = tk.Frame(setting_window, bg="#f0f0f0")
button_frame.pack(fill="x", padx=50, pady=20)
tk.Button(button_frame, text="应用设置", command=confirm, font=("微软雅黑", 12), fg="#333", bg="#f0f0f0", bd=2, relief="ridge").pack(side="left", expand=True, fill="x", padx=10)
tk.Button(button_frame, text="恢复默认", command=cancel, font=("微软雅黑", 12), fg="#333", bg="#f0f0f0", bd=2, relief="ridge").pack(side="left", expand=True, fill="x", padx=10)
创建二维码颜色框架和背景颜色框架,并定义选择颜色函数,由于颜色值需要应用到主页,所以要在全局添加颜色变量。
代码语言:python代码运行次数:0运行复制# 选择颜色函数
def choose_color(color_var, button):
"""选择颜色"""
color = colorchooser.askcolor()[1]
color_var.set(color)
button.config(bg=color)
generate_qr_code() # 生成新的二维码并更新预览
setting_window.focus_force()
# 创建颜色框架
color_frame = tk.Frame(setting_window, bg="#f0f0f0f0="#f0f0f0")
color_frame.pack(fill="x", padx=50, pady=20)
tk.Label(color_frame, text="颜色:", bg="#f0f0f0", font=("微软雅黑", 12)).pack(side="left")
color_button = tk.Button(color_frame, bg=fill_color_var.get(), width=5, command=lambda: choose_color(fill_color_var, color_button))
color_button.pack(side="left")
# 创建背景颜色框架
back_color_frame = tk.Frame(setting_window, bg="#f0f0f0f0="#f0f0f0")
back_color_frame.pack(fill="x", padx=50, pady=20)
tk.Label(back_color_frame, text="背景:", bg="#f0f0f0", font=("微软雅黑", 12)).pack(side="left")
back_color_button = tk.Button(back_color_frame, bg=back_color_var.get(), width=5, command=lambda: choose_color(back_color_var, back_color_button))
back_color_button.pack(side="left")
代码语言:python代码运行次数:0运行复制# 全局颜色变量
fill_color_var = tk.StringVar()
fill_color_var.set("black")
back_color_var = tk.StringVar()
back_color_var.set("white")
创建保存路径框架,路径初始显示默认值并使用默认值,修改方式为更改路径。
代码语言:python代码运行次数:0运行复制save_folder_frame = tk.Frame(setting_window, bg="#f0f0f0f0="#f0f0f0")
save_folder_frame.pack(fill="x", padx=50, pady=20)
tk.Label(save_folder_frame, text="默认保存路径:", bg="#f0f0f0", font=("微软雅黑", 12)).pack(side="left")
global save_folder_entry
save_folder_entry = tk.Entry(save_folder_frame, width=20, font=("微软雅黑", 12), fg="#333", bd=2, relief="ridge")
save_folder_entry.pack(side="left")
save_folder_entry.insert(0, SAVE_FOLDER)
3.4.3 创建预览及状态标签
将生成的二维码图片预览在主窗口,在进行一些操作后将提示状态。
代码语言:python代码运行次数:0运行复制# 创建预览
preview_label = tk.Label(root, font=("微软雅黑", 12), fg="#333")
preview_label.pack(pady=10)
# 创建状态标签
status_label = tk.Label(root, text="", font=("微软雅黑", 12), fg="#333")
status_label.pack(pady=10)
3.5 主循环
启动主循环,使应用程序开始并持续运行。
代码语言:python代码运行次数:0运行复制root.mainloop()
4 完整代码
完整源代码可以通过以下方式获取:
GitHub
Gitee
5 写在最后
通过本文逐步完成创建一个简单二维码生成器工具,欢迎对该项目贡献代码,提交 Pull Requests 或报告问题。
本文标签: 二维码生成器工具开发
版权声明:本文标题:二维码生成器工具开发 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754874023a1707602.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论