You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动