以下是代码。
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类的一个实例。那么,我们是否尝试为该特定实例设置属性?那么,这是否意味着我们可以在类之外设置属性?
答案 0 :(得分:3)
第一个窗口由Tk()
创建(如果您忘记了,这显然是为您自动完成的); 其他窗口由Toplevel()
创建。是的,这看起来很傻 - 我不知道为什么这样做。如果你想拥有多个窗口,所有窗口都处理相同,我看到的一种方法是立即在初始Tk()窗口上调用.withdraw()
使其不可见,然后完全忘记它 - 全部你的实际窗口是由Toplevel()创建的。
一般来说,您可以自由地在类实例中存储任意属性,只要它们不会与任何类的实际属性发生冲突。一般来说,这是一个坏主意,因为你不一定知道所有类的实际属性是什么。但是,你在这里看到的是一种惯用的Tkinter用法,它通过垃圾收集与Tk图像交互的奇怪方式变得必要。如果将图像存储在局部变量中,它几乎会立即消失。如果将它存储在全局变量中,即使在关闭使用图像的窗口后,它也会永远存在。将图像存储为显示它的窗口小部件或窗口的属性可以使其具有完全正确的生命周期。
答案 1 :(得分:1)
来自tKinter文档:
顶级窗口是窗口管理器下独立存在的窗口。
这有点令人困惑,但它似乎意味着因为顶级窗口是额外的窗口,必须有一个真正的主窗口。所以顶级似乎自动创建一个(我不会声称知道为什么或这里发生了什么)。这是一个简单的解决方法:
变化:
root = Toplevel()
为:
root = Tk()