【问题标题】:How to create an image displayer using Python Tkinter more efficiently? [duplicate]如何更有效地使用 Python Tkinter 创建图像显示器? [复制]
【发布时间】:2020-09-05 11:37:35
【问题描述】:
import tkinter as tk
from PIL import ImageTk, Image
root = tk.Tk()

def photogetter():
    ###global photo

    photo= ImageTk.PhotoImage(Image.open("smiley.png").resize((320,240)))
    label =tk.Label(root,image=photo)
    canv.create_window((320,240),window=label)
    

canv = tk.Canvas(root,width=640,height=480)
canv.grid(row=0,column=0)

button = tk.Button(root,text="Button",command=photogetter)
button.grid(row=1,column=0)

root.mainloop()

除非我在函数中将 photo 变量声明为全局变量,否则此代码不起作用。有人可以解释一下为什么我必须将 photo 变量声明为全局变量吗?使用局部变量对我来说看起来更有效,但它不起作用。

【问题讨论】:

    标签: python python-3.x image tkinter tkinter-canvas


    【解决方案1】:

    这是因为当photo 不是global 时,它是由python 垃圾收集器收集的垃圾,因此您需要保持对图像的引用,这可以通过说global imagelabel.image = photo 来完成。无论哪种方式,您只需要保留一个引用,这样它就不会被垃圾收集。

    global 使用 OOP 可能效率不高,因为它可能会在以后产生一些问题,这是我听说的,所以您可以通过 label.image = photo 保留参考。

    来自 effbot.org:

    问题在于 Tkinter/Tk 接口没有正确处理对 Image 对象的引用; Tk 小部件将持有对内部对象的引用,但 Tkinter 没有。当 Python 的垃圾收集器丢弃 Tkinter 对象时,Tkinter 告诉 Tk 释放图像。但是由于图像正在被小部件使用,Tk 不会破坏它。不完全的。它只是使图像空白,使其完全透明。

    希望这能解决您的疑虑。

    干杯

    【讨论】:

      猜你喜欢
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多