You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter中Canvas绘制图形不显示问题求助

问题:Tkinter中Canvas绘制的图形无法显示,Frame组件运行正常

用户提供的代码如下:

import tkinter as tk
from tkinter import ttk

class gift_wrapping_tool(tk.Tk):
    def __init__ (self,*args,**kwargs):
        tk.Tk.__init__(self,*args,**kwargs)
        container = tk.Frame(self,bg="#222448")
        container.rowconfigure(0, weight=1) 
        container.columnconfigure(0, weight=1)
        container.place(width=2000, height=2000)

        self.frames = {}
        
        for F in (FirstPage, PageOne,PageTwo,PageThree):
            frame = F(container, self)
            self.frames[F] = frame
            frame.place(width=2000, height=2000)
        
        self.show_frame(FirstPage)
    
    def show_frame(self,cont):
        frame = self.frames[cont]
        frame.tkraise()
        
class FirstPage (tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent,bg="#222448")
        label = ttk.Label(self,text=" Enter dimensions page:",foreground="light cyan", background="#222448")
        label.place(x=10,y=10)
        
        var1 = tk.StringVar(self) 
        radiobtn1= tk.Radiobutton(self, text="Cuboid", variable=var1, value="Cuboid",bg='light cyan',width=10)
        radiobtn1.place(x=10,y=340)
        
        radiobtn2= tk.Radiobutton(self, text="Cube", variable=var1, value="Cube",bg='light cyan',width=10)
        radiobtn2.place(x=10,y=370) 
        
        radiobtn3= tk.Radiobutton(self, text="Cylinder", variable=var1, value="Cylinder",bg='light cyan',width=10)
        radiobtn3.place(x=10,y=400)
        
        labela= ttk.Label(self, text="Select shape:",background='light cyan',width=13)
        labela.place(x=10,y=300)
        
        button1= tk.Button(self,text="Next", bg="#54527E", fg='light cyan',command= lambda: controller.show_frame(PageOne))
        button1.place(x=500,y=600)
        
        design_label = tk.Label(self,text="Enter height and width(cm):",bg='light cyan')
        design_label.place(x=5,y=500,height=25,width=220)
        
        design_entry = tk.Entry(self,bg='light cyan')
        design_entry.place(x=5,y=540,height=25,width=150)
        
        choice_label = tk.Label(self,bg='light cyan')
        choice_label= tk.Label(self)
        
        canvas = tk.Canvas(self,bg="#54527E")
        canvas.place(x=2000,y=2000)
        
        canvas.create_oval(10,10,80,50, outline='red')
        canvas.create_rectangle(100,100,250,250,outline='light cyan')
        canvas.create_rectangle(40,70,10,100,outline='light cyan')
        canvas.create_line(400,0,400,750,fill='light cyan')
        canvas.create_line(600,0,600,750,fill='light cyan')
        canvas.create_rectangle(350,15,100,40,outline='light cyan')
        canvas.create_line(0,750,600,750,fill='light cyan')
        
        def button_clicked():
            design_entered = design_entry.get()
            choice_string = "Width + Height = " + design_entered
            choice_label.config(text=choice_string,bg="light cyan")
            choice_label.place(x=402,y=30,width=190)
        
        click_button = tk.Button(self, text="Enter", command=button_clicked,bg='light cyan')
        click_button.place(x=170,y=540,height=25,width=100)
        
class PageOne(tk.Frame):
        def __init__ (self, parent, controller):
            tk.Frame.__init__(self,parent,bg="#222448")
            label = ttk.Label(self,text="Select pattern page:",foreground="light cyan", background="#222448")
            label.place(x=10,y=10)
            
            button2= tk.Button(self,text="Back",bg="#54527E", fg='light cyan',command= lambda: controller.show_frame(FirstPage))
            button2.place(x=10,y=600)
            
            button2a= tk.Button(self,text="Next to booking",bg="#54527E", fg='light cyan',command= lambda: controller.show_frame(PageTwo))
            button2a.place(x=500,y=600)
            
            canvas = tk.Canvas(self,bg="#222448")
            canvas.place(x=2000,y=2000)
            
class PageTwo(tk.Frame):
        def __init__ (self, parent, controller):
            tk.Frame.__init__(self,parent,bg="#222448")
            label = ttk.Label(self,text="Select booking slots page:",foreground="light cyan", background="#222448")
            label.place(x=10,y=10)
            
            button3= tk.Button(self,text="Back to first page" ,bg="#54527E", fg='light cyan',command= lambda: controller.show_frame(FirstPage))
            button3.place(x=10,y=640)
            
            button4= tk.Button(self,text="Back to pattern",bg="#54527E", fg='light cyan',command= lambda: controller.show_frame(PageOne))
            button4.place(x=10,y=600)
            
            button4a= tk.Button(self,text="Next to cost",bg="#54527E", fg='light cyan',command= lambda: controller.show_frame(PageThree))
            button4a.place(x=500,y=600)
            
            canvas = tk.Canvas(self,bg="#222448")
            canvas.place(x=2000,y=2000)

class PageThree(tk.Frame):
        def __init__ (self, parent, controller):
            tk.Frame.__init__(self,parent,bg="#222448")
            label = ttk.Label(self,text="Cost calculation:",foreground="light cyan", background="#222448")
            label.place(x=10,y=10)
            
            button5= tk.Button(self,text="Back to booking",bg="#54527E", fg='light cyan',command= lambda: controller.show_frame(PageTwo))
            button5.place(x=10,y=600)
            
            canvas = tk.Canvas(self,bg="#222448")
            canvas.place(x=2000,y=2000)
            
app= gift_wrapping_tool()
app.mainloop()

问题原因

所有Canvas的place(x=2000,y=2000)设置导致两个关键问题:

  1. Tkinter窗口默认尺寸远小于2000x2000,Canvas被定位到窗口可视区域之外,完全无法看到
  2. Canvas未指定宽高,默认尺寸极小,即使位置正确也可能无法容纳绘制的图形

修复方法

方法1:调整Canvas的位置和尺寸

修改place参数,将Canvas放到窗口可视区域内,并指定足够容纳图形的宽高:

# 以FirstPage中的Canvas为例,替换原place语句
canvas.place(x=200, y=50, width=600, height=750)

这个参数能完全覆盖你绘制的所有图形(比如线条到600x750的位置)。

方法2:使用更灵活的布局管理器

推荐用pack或grid替代place,让Canvas自动填充所在Frame的空间:

# 替换原place语句
canvas.pack(fill="both", expand=True)

这种方式无需手动调整位置和尺寸,Canvas会自适应Frame的大小,后续添加的图形也能正常显示。

注意事项

PageOne、PageTwo、PageThree中的Canvas也存在同样的问题,需要按照上述方式逐一修改。

内容的提问来源于stack exchange,提问作者user25207541

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:25:56