必须在其内容之前初始化Tkinter Canvas。它是一个功能还是一个bug?

时间:2013-06-15 13:41:23

标签: python tkinter tk

我在调试程序时遇到了Tkinter的奇怪行为。如果在Frame对象之前创建Canvas对象,然后将其插入Canvas,则无法显示该对象。但是,如果创建顺序被反转(首先Canvas然后Frame),则Frame中的内容会正确显示。

例如,以下代码效果很好:

from Tkinter import *

app = Frame()
canvas = Canvas(app)
frame = Frame(app)
Label(frame, text = 'aaaa').pack()
Label(frame, text = 'bbbb').pack()
canvas.create_window(0, 0, anchor = NW, window = frame)
canvas.grid()
app.grid()
app.mainloop()

但是如果初始化顺序被反转,例如:

frame = Frame(app)
canvas = Canvas(app)
除了一个空白的窗口,你什么也得不到。

这是故意设计的行为(如果是,为什么?),或者我刚刚在Tkinter中发现错误?

1 个答案:

答案 0 :(得分:1)

这是一个功能。窗口小部件具有默认为创建顺序的堆叠顺序。您可以使用liftlower方法调整此堆叠顺序。

例如,您可以先创建框架然后再创建画布,以便画布具有更高的堆叠顺序。如您所见,您看不到框架,因为它位于画布后面。为了使其可见,您可以lift

frame.lift(canvas)

这样做会产生与首先创建画布相同的视觉效果。

此技术可用于隐藏和显示小部件。例如,您可以通过将多个框架堆叠在一起来创建类似笔记本的小部件,然后使用lift将您想要显示的框架显示在订单的顶部。