[英]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.