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)设置导致两个关键问题:
- Tkinter窗口默认尺寸远小于2000x2000,Canvas被定位到窗口可视区域之外,完全无法看到
- 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
相关产品推荐
相关产品推荐

