简体   繁体   English

Python二维码和TKinter

[英]Python QRCode and TKinter

This is a Python program that creates a GUI with Tkinter and generates a QR code that contains contact information.这是一个 Python 程序,它使用 Tkinter 创建一个 GUI,并生成一个包含联系信息的二维码。 In the function "generate_qr_code" the values are read from the GUI input fields and checked if "Name", "Surname" and "Tel" are present.在 function“generate_qr_code”中,从 GUI 输入字段读取值并检查“姓名”、“姓氏”和“电话”是否存在。 Then a QR code object is created with certain settings (version, error correction, box size, border).Contact data in VCARD format is compiled and added to the QR code object. Finally, the QR code is generated, saved to a PNG image and confirmed in the GUI with a message.然后创建一个QR码object,并进行一定的设置(版本、纠错、框大小、边框)。将VCARD格式的联系人数据编译并添加到QR码object中。最后生成QR码,保存为PNG图像并在 GUI 中通过一条消息进行确认。 The GUI is created by placing input fields, labels and buttons. GUI 是通过放置输入字段、标签和按钮创建的。 With "root.mainloop()" the GUI is started and runs until it is closed:使用“root.mainloop()”启动 GUI 并运行直到关闭:

import tkinter as tk
import qrcode

def generate_qr_code():
    name =  name_entry.get()
    lastname = lastname_entry.get()
    tel = tel_entry.get()
    org = org_entry.get()
    email = email_entry.get()
    url = url_entry.get()
    street = street_entry.get()
    postal_code = postal_code_entry.get()
    city = city_entry.get()
    country = country_entry.get()
    
    if not (name and lastname and tel):
        result_label.config(text="Name, Surname, and Tel are mandatory.")
        return
    
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_M,
        box_size=10,
        border=4,
    )
    
    data = f'''BEGIN:VCARD
    VERSION:3.0
    N:{lastname};{name}
    FN:Displayname
    ORG:{org}
    URL:{url}
    EMAIL:{email}
    TEL;TYPE=voice,work,pref:{tel}
    ADR;TYPE=intl,work,postal,parcel:;;{street};{city};;{postal_code};{country}
    END:VCARD'''
    qr.add_data(data)
    qr.make(fit=True)
    img = qr.make_image(fill_color=(118, 150, 162), back_color=(255, 255, 255))
    img.save("test.png")
    
    result_label.config(text="QR code saved as test.png")

root = tk.Tk()
root.title("QR Code Generator")

name_label = tk.Label(root, text="Name:")
name_entry = tk.Entry(root)

lastname_label = tk.Label(root, text="Surname:")
lastname_entry = tk.Entry(root)

tel_label = tk.Label(root, text="Tel:")
tel_entry = tk.Entry(root)

org_label = tk.Label(root, text="Company:")
org_entry = tk.Entry(root)

email_label = tk.Label(root, text="eMail:")
email_entry = tk.Entry(root)

url_label = tk.Label(root, text="Webseite:")
url_entry = tk.Entry(root)

street_label = tk.Label(root, text="Street:")
street_entry = tk.Entry(root)

postal_code_label = tk.Label(root, text="Postalcode:")
postal_code_entry = tk.Entry(root)

city_label = tk.Label(root, text="City:")
city_entry = tk.Entry(root)

country_label = tk.Label(root, text="Country:")
country_entry = tk.Entry(root)

generate_button = tk.Button(root, text="Generate QR Code", command=generate_qr_code)
result_label = tk.Label(root, text="")

name_label.pack()
name_entry.pack()

lastname_label.pack()
lastname_entry.pack()

tel_label.pack()
tel_entry.pack()

org_label.pack()
org_entry.pack()

email_label.pack()
email_entry.pack()

url_label.pack()
url_entry.pack()

street_label.pack()
street_entry.pack()

postal_code_label.pack()
postal_code_entry.pack()

city_label.pack()
city_entry.pack()

country_label.pack()
country_entry.pack()

generate_button.pack()
result_label.pack()

root.mainloop()

The issue is, a QRCode is been generated, but it doesn't contain any data.问题是,生成了一个 QRCode,但它不包含任何数据。

I tried to put in static values to the data variables, but it also generates a QRCode without any data:我试图将 static 值放入数据变量,但它也生成了一个没有任何数据的 QRCode:

import tkinter as tk
import qrcode

def generate_qr_code():
    name =  "John"
    lastname = "Deer"
    tel = "0125454"
    org = "JOHN DEER TRAKTORS"
    email = "John.deer@mail.com"
    url = "Johndeer.com"
    street = "Deer Street 1"
    postal_code = "54368"
    city = "Mannheim"
    country = "Germany"
    
    if not (name and lastname and tel):
        result_label.config(text="Name, Surname, and Tel are mandatory.")
        return
    
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_M,
        box_size=10,
        border=4,
    )
    
    data = f'''BEGIN:VCARD
    VERSION:3.0
    N:{lastname};{name}
    FN:Displayname
    ORG:{org}
    URL:{url}
    EMAIL:{email}
    TEL;TYPE=voice,work,pref:{tel}
    ADR;TYPE=intl,work,postal,parcel:;;{street};{city};;{postal_code};{country}
    END:VCARD'''
    qr.add_data(data)
    qr.make(fit=True)
    img = qr.make_image(fill_color=(118, 150, 162), back_color=(255, 255, 255))
    img.save("test.png")
    
    result_label.config(text="QR code saved as test.png")

root = tk.Tk()
root.title("QR Code Generator")

name_label = tk.Label(root, text="Name:")
name_entry = tk.Entry(root)

lastname_label = tk.Label(root, text="Surname:")
lastname_entry = tk.Entry(root)

tel_label = tk.Label(root, text="Tel:")
tel_entry = tk.Entry(root)

org_label = tk.Label(root, text="Company:")
org_entry = tk.Entry(root)

email_label = tk.Label(root, text="eMail:")
email_entry = tk.Entry(root)

url_label = tk.Label(root, text="Webseite:")
url_entry = tk.Entry(root)

street_label = tk.Label(root, text="Street:")
street_entry = tk.Entry(root)

postal_code_label = tk.Label(root, text="Postalcode:")
postal_code_entry = tk.Entry(root)

city_label = tk.Label(root, text="City:")
city_entry = tk.Entry(root)

country_label = tk.Label(root, text="Country:")
country_entry = tk.Entry(root)

generate_button = tk.Button(root, text="Generate QR Code", command=generate_qr_code)
result_label = tk.Label(root, text="")

name_label.pack()
name_entry.pack()

lastname_label.pack()
lastname_entry.pack()

tel_label.pack()
tel_entry.pack()

org_label.pack()
org_entry.pack()

email_label.pack()
email_entry.pack()

url_label.pack()
url_entry.pack()

street_label.pack()
street_entry.pack()

postal_code_label.pack()
postal_code_entry.pack()

city_label.pack()
city_entry.pack()

country_label.pack()
country_entry.pack()

generate_button.pack()
result_label.pack()

root.mainloop()

But the following script does generate a QRCode with data:但是下面的脚本确实生成了一个带有数据的二维码:

import qrcode


qr = qrcode.QRCode(
    version = 1,
    error_correction = qrcode.constants.ERROR_CORRECT_M,
    box_size = 10,
    border = 4,
)

name = input("Name: ")
lastname = input("Surname: ")
tel = input("Tel: ")
org = input("Company: ")
email = input("eMail: ")
url = input("Webseite: ")
street = input("Street: ")
postal_code = input("Postalcode: ")
city = input("City: ")
country = input("Country: ")

print(name + " " + lastname + ", " + tel + ", " + street + ", " + postal_code + " " + city + ", " + country)


data = data = f'''BEGIN:VCARD

VERSION:3.0

N:{lastname};{name}

FN:Displayname

ORG:{org}

URL:{url}

EMAIL:{email}

TEL;TYPE=voice,work,pref:{tel}

ADR;TYPE=intl,work,postal,parcel:;;{street};{city};;{postal_code};{country}

END:VCARD'''
qr.add_data(data)
qr.make(fit=True)

img = qr.make_image(fill_color=(118, 150, 162), back_color=(255, 255, 255))

img.save("test.png")

It is found that qrcode module version 7.4 has issue when the message length is greater than certain size.发现qrcode模块7.4版本在消息长度大于一定大小时出现问题 It works fine when using version 7.3.1.使用 7.3.1 版时它工作正常。

The issue in the tkinter version is that there are indentations after the first line of the message which make it not a valid VCARD format. tkinter 版本中的问题是消息的第一行后有缩进,这使其不是有效的 VCARD 格式。 Remove the leading spaces like below:删除前导空格,如下所示:

    data = f"""\
BEGIN:VCARD
VERSION:3.0
N:{lastname};{name}
FN:Displayname
ORG:{org}
URL:{url}
EMAIL:{email}
TEL;TYPE=voice,work,pref:{tel}
ADR;TYPE=intl,work,postal,parcel:;;{street};{city};;{postal_code};{country}
END:VCARD"""

or using textwrap module:或者使用textwrap模块:

import textwrap
...
    data = textwrap.dedent(f'''\
    BEGIN:VCARD
    VERSION:3.0
    N:{lastname};{name}
    FN:Displayname
    ORG:{org}
    URL:{url}
    EMAIL:{email}
    TEL;TYPE=voice,work,pref:{tel}
    ADR;TYPE=intl,work,postal,parcel:;;{street};{city};;{postal_code};{country}
    END:VCARD''')
...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM