Tkinter Canvas未显示求助:无报错但画布不可见
你的Canvas不显示的原因及修复方案
嘿,刚上手Tkinter遇到这种小问题太正常啦!我帮你瞅了下代码,问题其实出在Frame的布局逻辑上,咱们一步步来捋清楚~
核心问题:未布局的Frame导致Canvas“隐身”
你在drawFigure()方法里新建了一个self.frame,并且把Canvas放在了这个Frame里,但这个新建的Frame从来没有通过pack()/grid()/place()添加到主窗口中。Tkinter里的组件如果所在的容器没有被布局,那组件肯定是看不到的。
另外还有个小坑:你在__init__、window()、drawFigure()里重复创建了self.frame,这会覆盖之前的实例,不仅没必要,还容易让布局逻辑越搞越乱。
修复后的代码
咱们把重复创建Frame的代码去掉,确保主Frame被正确布局,Canvas自然就能显示了:
from Tkinter import * import Tkinter as tk class Application(Frame): def __init__(self, master): Frame.__init__(self, master) self.master = master # 只创建一次主Frame,并且布局它 self.frame = Frame(self.master) self.frame.pack(fill=BOTH, expand=True) # 关键:让Frame填满主窗口并随窗口缩放 self.window() self.drawFigure() # self.master.attributes('-fullscreen', True) self.master.bind("<Escape>", self.end_fullscreen) def window(self): screen_width = self.frame.winfo_screenwidth() / 2 screen_height = self.frame.winfo_screenheight() / 2 self.master.geometry('%dx%d' % (screen_width, screen_height)) def end_fullscreen(self, event=None): self.master.attributes("-fullscreen", False) def drawFigure(self): # 不再重复创建Frame,直接用已经布局好的self.frame作为Canvas的父容器 self.C = Canvas(self.frame, width=200, height=200, bg='red') self.C.pack() self.C.create_rectangle(50, 20, 150, 80, fill="#476042") if __name__ == '__main__': root = tk.Tk() w = Application(root) w.master.mainloop()
改动说明
- 删掉了
window()和drawFigure()里重复创建self.frame的代码,只在__init__里初始化一次主Frame,并且调用self.frame.pack(fill=BOTH, expand=True)让它填满主窗口,这样里面的组件才能正常显示。 drawFigure()里的Canvas直接以已布局的self.frame作为父容器,Canvas调用pack()后就能正常渲染出来了。
额外小提示
- Tkinter中,所有组件(包括Frame)都必须通过
pack()/grid()/place()这三个布局方法之一添加到父容器中,否则不会被渲染出来。 - 尽量不要重复给同一个实例属性赋值(比如多次创建
self.frame),这会导致之前的实例被覆盖,很容易出现布局逻辑混乱的问题。
内容的提问来源于stack exchange,提问作者user9777630




