大家好,我想在顶层使用图片。但是如果我不使用全局语句,我就无法在顶层看到我的图片,这就是我真正感到困惑的原因。有谁知道原因吗?
from tkinter import *
from PIL import ImageTk, Image
root = Tk()
def open():
top = Toplevel()
my_image = ImageTk.PhotoImage(Image.open(
"C:\\Users\\86177\\Desktop\\python_source\\homo.jpeg"
))
Label(top, image = my_image).pack()
Button(root, text = "open second window", command = open).pack()
root.mainloop()
在这段代码中,当我点击按钮进入顶层时,我看不到任何图像和图片。但是当我在函数内添加全局语句时,我可以在顶层看到图像。
from tkinter import *
from PIL import ImageTk, Image
root = Tk()
def open():
global my_image
top = Toplevel()
my_image = ImageTk.PhotoImage(Image.open(
"C:\\Users\\86177\\Desktop\\python_source\\homo.jpeg"
))
Label(top, image = my_image).pack()
Button(root, text = "open second window", command = open).pack()
root.mainloop()
文件位置正确。在这段代码中,我可以看到我的图像。 其实我知道global语句,但我认为没有必要添加global语句 这里是因为洞顶层代码位于 open() 函数内部。有人可以解释原因吗?非常感谢。
最佳答案
But if I don't use global statement, I can't see my picture in toplevel ... . Does anyone know the reasons?
Python 有一个叫做 garbage collector 的东西。它监视对象和对象的引用,当它注意到某个对象不再有指向它的变量时,垃圾收集器将释放该对象使用的内存。这使我们摆脱了管理内存使用的繁琐任务。
在函数内部,当您未将图像变量标记为全局变量时,它将被视为局部变量。这意味着当函数返回时,python将释放函数中所有变量使用的内存。如果该变量指向一个图像,python 将释放该图像使用的内存,因为它认为它不再被使用,因为不再有任何对它的引用。
通过将图像的引用保存在全局变量(或实例变量)中,Python 发现存在对图像的持久引用,因此它需要保留在内存中。
关于python - 为什么我需要在 tkinter 函数内部使用全局语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71313276/