为什么我有两个tkinter窗口



以下是代码。

from tkinter import *
def schedule_log():  
    root = Toplevel()
    root.title("My Schedule")
    canvas = Canvas(root, width=675, height=260)
    root.schedule = schedule = PhotoImage(file="my_image.gif")
    canvas.create_image(0, 0, anchor=NW, image=schedule)
    canvas.pack()
schedule_log()

当我运行它时,我有两个窗口。一个是带有标题TK的TKINTER窗口,另一个是标题为"我的时间表"的窗口。谁能向我解释为什么这是吗?非常感谢您的时间和关注。此外,root.schedule的功能是什么?我的意思是,如果正确理解它,root是Toplevel类的实例。那么,我们是否试图将属性设置为该特定实例?那么,这是否意味着我们可以在班级之外设置属性?

第一个窗口是由 Tk()创建的(如果您忘记了,这显然是为您自动完成的);其他 Windows由Toplevel()创建。是的,这似乎很愚蠢 - 我不知道为什么这样做。如果您想拥有多个窗口,所有处理都相同,我看到的一种方法是立即在初始TK()窗口上调用.withdraw()以使其变得不可见,然后完全忘记它 - 所有实际窗口都会由您创建。toplevel()。

一般而言,您可以自由地将任意属性存储在类实例中,只要它们不与任何类的实际属性相撞。同样一般来说,这是一个坏主意,因为您不一定会知道班级所有实际属性是什么。但是,您在这里看到的是一种惯用的TKINTER用法,这是通过垃圾收集与TK图像相互作用的奇怪方式所必需的。如果将图像存储在局部变量中,它将几乎立即消失。如果将其存储在全局变量中,即使使用图像的窗口关闭后,它也会永远存在。将图像存储为显示的窗口小部件或窗口的属性,使其完全正确地寿命。

来自tkinter文档:

顶级窗口是一个在窗口管理器下具有独立存在的窗口。

这有点令人困惑,但这似乎意味着因为顶级窗口是额外的窗口,所以必须有一个真正的主窗口。因此,顶级似乎是为您的自动创建一个(我不会声称知道为什么或发生了什么)。但是,这是一个简单的修复:

更改:

root = Toplevel()

to:

root = Tk()

最新更新