【问题标题】:create a qrcode using tkinter使用 tkinter 创建二维码
【发布时间】:2021-11-13 08:28:36
【问题描述】:

我试图用 tkinter 在 python 中创建一个二维码生成应用程序,你输入颜色,然后输入文本,它会生成一个二维码,但它会在启动时立即关闭。 (当我没有颜色部分时,问题没有发生),(将来我还计划添加一个保存QR为png按钮) 这是我所拥有的:

from tkinter import *
from tkinter import messagebox
import pyqrcode
from tkinter import colorchooser
import re

def choose_color():
    x = 0
    # variable to store hexadecimal code of color
    color_code = colorchooser.askcolor(title ="Choose color")
    print(color_code)
    x = 1
 
root = Tk()
button = Button(root, text = "Select color",
                   command = choose_color)
button.pack()

if 'x' == 1:
    str = 'color_code' # Your Hex

    match = re.search(r'^#(?:[0-9a-fA-F]{3}){1,2}$', str)

    if match:                      
        print('Hex is valid')
        ws = Tk()
        ws.title("PythonGuides")
        ws.config(bg='color_code')

        def generate_QR():
            if len(user_input.get())!=0 :
                global qr,img
                qr = pyqrcode.create(user_input.get())
                img = BitmapImage(data = qr.xbm(scale=8))
            else:
                messagebox.showwarning('warning', 'All Fields are Required!')
            try:
                display_code()
            except:
                pass

        def display_code():
            img_lbl.config(image = img)
            output.config(text="QR code of " + user_input.get())


        lbl = Label(
            ws,
            text="Enter message or URL",
            bg='color_code'
            )
        lbl.pack()

        user_input = StringVar()
        entry = Entry(
            ws,
            textvariable = user_input
            )
        entry.pack(padx=10)


        button = Button(
            ws,
            text = "generate_QR",
            width=15,
            command = generate_QR
            )
        button.pack(pady=10)

        img_lbl = Label(
            ws,
            bg='color_code')
        img_lbl.pack()
        output = Label(
            ws,
            text="",
            bg='color_code'
            )
        output.pack()
        
        ws.mainloop()

    else:
        print('Hex is not valid')

【问题讨论】:

    标签: python tkinter colors qr-code


    【解决方案1】:

    程序立即关闭的原因是因为没有root.mainloop()。即使有,还有很多其他错误会阻止程序运行。

    第一个问题是if 'x' == 1。在这里,您将文字字符串“x”与数字 1 进行比较。它们永远不会相等,因此另一个窗口将永远不会出现。我可以看到你想用x 做什么,但它不会像你期望的那样工作。最好完全摆脱x 并在用户选择颜色后调用函数。我已将此函数称为 show_qr_window

    第二个问题是如何获得十六进制代码。您使用colorchooser.askcolor 的输出,它是一个包含表示颜色的rgb 元组的元组,它是十六进制值。你只想要十六进制值,所以你想要color_code[1],因为十六进制值是第二项。我还添加了if 语句以确保color_code 不是None。如果用户没有选择颜色而只是关闭窗口,color_code 将为 None。如果用户选择了一种颜色,则将其传递给show_qr_window。因为我们检查了用户选择了一种颜色,所以您可以摆脱所有其他验证,因为colorchooser 将始终返回一个有效的十六进制值。您也不再需要导入 re

    第三个问题是您使用了两次Tk。这将导致您的程序无法正常运行。而是将ws = Tk() 更改为ws = Toplevel()

    下一个问题是str = 'color_code'。这不是您定义变量的方式。你想做color_code = 'a string'。在这种情况下,字符串作为变量color 传递给show_qr_window,因此您可以使用color_code = color。您还必须将所有bg = 'color_code' 更改为bg = color_code,因为color_code 是一个变量,而不是一个字符串。

    您的其余代码似乎可以工作(我没有测试 qr 代码生成,因为我没有安装该模块)。以下是所有修复的代码:

    from tkinter import *
    from tkinter import messagebox
    import pyqrcode
    from tkinter import colorchooser  
      
    def choose_color():
        # variable to store hexadecimal code of color
        color_code = colorchooser.askcolor(title ="Choose color")
        if color_code != None:
            show_qr_window(color_code[1])
     
    root = Tk()
    button = Button(root, text = "Select color",
                       command = choose_color)
    button.pack()
    root.mainloop()
    
    def show_qr_window(color):                    
        ws = Toplevel()
        color_code = color
        ws.config(bg = color_code)
        def generate_QR():
            if len(user_input.get())!=0 :
                global qr,img
                qr = pyqrcode.create(user_input.get())
                img = BitmapImage(data = qr.xbm(scale=8))
            else:
                messagebox.showwarning('warning', 'All Fields are Required!')
            try:
                display_code()
            except:
                pass
    
        def display_code():
            global img
            img_lbl.config(image = img)
            output.config(text="QR code of " + user_input.get())
    
    
        lbl = Label(
            ws,
            text="Enter message or URL",
            bg=color_code
            )
        lbl.pack()
    
        user_input = StringVar()
        entry = Entry(
            ws,
            textvariable = user_input
            )
        entry.pack(padx=10)
    
    
        button = Button(
            ws,
            text = "generate_QR",
            width=15,
            command = generate_QR
            )
        button.pack(pady=10)
    
        img_lbl = Label(
            ws,
            bg=color_code)
        img_lbl.pack()
        output = Label(
            ws,
            text="",
            bg=color_code
            )
        output.pack()
        
        ws.mainloop()
    

    假设 generate_QR()display_code() 可以正常工作(我还没有测试它们,但它们看起来不错),这段代码将按预期运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 2015-01-15
      • 2018-04-03
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多