QRCode在tkinter GUI python中的显示

2024-10-06 12:25:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在tkinter GUI中显示二维码,但是当我执行此代码时:

import tkinter as tk
from PIL import Image,ImageTk
import pyqrcode
from tkinter.font import Font
import random


root=tk.Tk()
root.title("QR Lottery")
root.config(bg="white")

# Defining Fonts
TitleFont = Font(family="HEX:gon Staggered 2", size="48")

def generateQR():
    num=random.randint(1,2)
    if num==1:
        QRCode=pyqrcode.create("You Win!")
        QRCode.png("QRCode.png",scale=8)
        img = Image.open('QRCode.png')
        QRCodeImg = ImageTk.PhotoImage(img)
        QRCodeLabel=tk.Label(image=QRCodeImg)
        QRCodeLabel.grid(row=2,column=1)
    else:
        QRCode=pyqrcode.create("You Lose!")
        QRCode.png("QRCode.png",scale=8)
        img = Image.open('QRCode.png')
        QRCodeImg = ImageTk.PhotoImage(img)
        QRCodeLabel=tk.Label(image=QRCodeImg)
        QRCodeLabel.grid(row=2,column=1)

#Labels
TitleLabel=tk.Label(text="qr lottery",bg="white",font=TitleFont)
TitleLabel.grid(row=1,column=1,columnspan=5)
ButtonQR=tk.Button(text="Generate!",bg="white",command=generateQR)
ButtonQR.grid(row=3,column=1)

root.mainloop()

产生的图像标签是一个空白正方形。我不知道为什么会这样,因为我把背景色留白了。在


Tags: imageimportimgpngtkintercolumnroottk
1条回答
网友
1楼 · 发布于 2024-10-06 12:25:44

Question: The Image Label produced is a blank square. I am unsure of why this is

A:You must keep a reference to the image object in your Python program, by attaching it to another object.

使用以下方法:


  1. 通过从^{继承来定义您自己的小部件QRCodeLabel
    仅使用参数parent初始化

    class QRCodeLabel(tk.Label):
        def __init__(self, parent, qr_data):
            super().__init__(parent)
            print('QRCodeLabel("{}")'.format(qr_data))
    
  2. 使用传递的QRCode和 另存为PNG文件。在

            qrcode = pyqrcode.create(qr_data)
            tmp_png_file = "QRCode.png"
            qrcode.png(tmp_png_file, scale=8)
    
  3. PNG文件创建图像对象。
    Tkinter可以自己处理PNG图像文件,不需要PIL。在

    NOTE: You have to use self.image to prevent garbage collection!

            self.image = tk.PhotoImage(file=tmp_png_file)
    
  4. 使用self.image配置此Label

            self.configure(image=self.image)
    

Usage:

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        buttonQR = tk.Button(text="Generate!", bg="white", command=self.generateQR)
        buttonQR.grid(row=2, column=0)
        self.qr_label = None

    def generateQR(self):
        if self.qr_label:
            self.qr_label.destroy()

        self.qr_label = QRCodeLabel(self, random.choice(["You Win!", "You Lose!"]))
        self.qr_label.grid(row=1, column=0)


if __name__ == "__main__":
    App().mainloop()

用Python:3.5测试

相关问题 更多 >