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 个字符,则显示相应的错误信息。

代码语言:python代码运行次数:0运行复制
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函数用于保存生成的二维码。它使用当前时间戳作为文件名,将二维码图像保存到指定的文件夹中。

代码语言:python代码运行次数:0运行复制
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():
    # 设置按钮函数内容

创建设置窗口并修改基本样式。

代码语言:python代码运行次数:0运行复制
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 或报告问题。

本文标签: 二维码生成器工具开发