【问题标题】:QRCode displaying in tkinter GUI python二维码在 tkinter GUI python 中显示
【发布时间】:2019-07-20 20:19:37
【问题描述】:

我正在尝试在 tkinter GUI 中显示 QR 码,但是当我执行此代码时:

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

生成的图像标签是一个空白方块。我不确定为什么会这样,因为我将背景颜色留为空白。

【问题讨论】:

  • 又是PhotoImage 中的错误问题,它从内存中删除了图像,您只能看到空方块。阅读文档:PhotoImage
  • @norok2 不是骗子,因为我已按照您提供的答案进行操作,但没有产生预期的结果。
  • 对于您的情况,只需在 generateQR() 函数体的末尾添加 generateQR.img = QRCodeImg 以保留图像的引用。但是,不建议每次点击生成按钮时都重新创建二维码标签。

标签: python image tkinter qr-code


【解决方案1】:

问题:生成的图片标签是一个空白方块。我不确定这是为什么

A:您必须在 Python 程序中保留对图像对象的引用,方法是将其附加到另一个对象。

使用以下内容:


  1. 通过继承tk.Label 定义您自己的小部件QRCodeLabel
    只用参数parent初始化

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

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

    注意:您必须使用self.image 来防止垃圾收集!

            self.image = tk.PhotoImage(file=tmp_png_file)
    
  4. 将此Label 配置为self.image

            self.configure(image=self.image)
    

用法

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

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多