python - 为什么我需要在 tkinter 函数内部使用全局语句?

标签 python tkinter

大家好,我想在顶层使用图片。但是如果我不使用全局语句,我就无法在顶层看到我的图片,这就是我真正感到困惑的原因。有谁知道原因吗?

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/

相关文章:

python - Python 中的 AES 128

python - TensorFlow 服务与 TensorFlow 服务

php - Simpe Loop 平方整数值在 C 中比在 PHP 中慢

python - 在Python中匹配二维数组中的一维数组

python - 如何在 .local 中安装 tkinter

python - 用python模拟打印屏幕按键

python - 使用 Tkinter Canvas 小部件添加放大和缩小?

python - 如何将打印语句重定向到 Tkinter 文本小部件

python - Tkinter 使文本随时间变化

python - 使顶级窗口跟随根 Tk 窗口