该文档建议我应该能够在一个Canvas中放置一个Frame对象,并且该Frame对象本身可以包含一个Canvas。我想知道为什么以下玩具代码不起作用。我在任何地方都看不到字符串“ hello”,只有蓝色的“ outercanvas”。我究竟做错了什么?

from tkinter import *
class MainWindow(Frame):
def __init__(self):
    super().__init__()
    self.pack(fill=Y, side = LEFT)
    inframe = Frame(self)
    innercanvas = Canvas(inframe, width=20, height=20)
    innercanvas.create_text(10, 10, anchor=NW, text="Hello")

    outercanvas = Canvas(self, width=100, height=100, bg='#00ffff')
    outercanvas.create_window(0, 0, anchor=NW, window=inframe)
    outercanvas.pack(side=LEFT)

root = MainWindow()
root.mainloop()

最佳答案

看不到innercanvas的主要原因是您从未在其上调用.pack()(或其他几何图形管理器),因此包含inframe的对象不知道如何显示它。

修复并没有真正使代码正常工作,我发现这很令人惊讶-显然,由于您创建的inframeoutercanvas早,因为同一Frame的子代,inframe仍保留在画布下面,因此不可见。 (这是在Python 2.7中进行的,也许已在您使用的版本中进行了修复。)将outercanvas的创建向上移动几行即可解决此问题;您可能希望将inframe用作outercanvas的子级,而不是同级,以更好地反映小部件的层次结构。

请注意,实际上根本不需要inframe-您可以使用create_window()直接将innercanvas添加到outercanvas

10-08 04:06