簡體   English   中英

Python二維碼和TKinter

[英]Python QRCode and TKinter

這是一個 Python 程序,它使用 Tkinter 創建一個 GUI,並生成一個包含聯系信息的二維碼。 在 function“generate_qr_code”中,從 GUI 輸入字段讀取值並檢查“姓名”、“姓氏”和“電話”是否存在。 然后創建一個QR碼object,並進行一定的設置(版本、糾錯、框大小、邊框)。將VCARD格式的聯系人數據編譯並添加到QR碼object中。最后生成QR碼,保存為PNG圖像並在 GUI 中通過一條消息進行確認。 GUI 是通過放置輸入字段、標簽和按鈕創建的。 使用“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()

問題是,生成了一個 QRCode,但它不包含任何數據。

我試圖將 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()

但是下面的腳本確實生成了一個帶有數據的二維碼:

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")

發現qrcode模塊7.4版本在消息長度大於一定大小時出現問題 使用 7.3.1 版時它工作正常。

tkinter 版本中的問題是消息的第一行后有縮進,這使其不是有效的 VCARD 格式。 刪除前導空格,如下所示:

    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"""

或者使用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