Tkinter中在画布c1的框架f1b添加Entry输入框遇问题求助
解决Tkinter画布框架中Entry不显示的问题
嘿,我来帮你搞定这个Tkinter的问题!你遇到的情况是因为把框架放到画布上时,框架的大小设置和内部控件的布局没配合好,导致框架看起来没显示出来。下面给你详细分析和解决方案:
问题根源
- 你给框架
f1b设置了固定的width=150和height=300,但Tkinter的框架默认会根据内部控件的布局自动调整大小,这个固定尺寸可能没按预期生效; - 你给Entry用了
grid(row=3, column=4),这个位置离框架左上角太远,框架需要被撑得很大才能容纳它,但框架本身没有被正确撑开,所以看起来框架和Entry都没显示。
解决方案
方案1:让框架自适应内部控件大小
去掉框架的固定宽高,调整Entry的布局位置,让框架自动被内部Entry撑开:
from Tkinter import * root = Tk() f1 = Frame(root, bg="cyan") f1.pack(side=LEFT, fill=BOTH, expand=YES) f1a = Frame(f1, bg="gold", height=100, width=100) f1a.grid(row=0, column=0, rowspan=2, columnspan=2, padx=10, pady=10) c1 = Canvas(f1, height=400, width=800, bg="snow") c1.create_rectangle(50,50,750,100) c1.create_rectangle(50,130,750,200) c1.create_rectangle(50,220,750,300) c1.create_text(100,70,text="Sensor1", font=40) c1.create_text(100,170,text="Sensor2", font=40) c1.create_text(100,260,text="Sensor3", font=40) c1.grid(row=3, column=3) # 移除框架的固定宽高,让它自适应内容 f1b = Frame(c1, bd=3, highlightcolor="black", highlightthickness=1, highlightbackground="black", relief=RAISED) # 将Entry放在框架的左上角位置 e1 = Entry(f1b, width=10) e1.grid(row=0, column=0, padx=10, pady=10) # 将框架添加到画布,设置anchor确保居中显示 c1.create_window(420, 160, window=f1b, anchor=CENTER) root.mainloop()
方案2:保持框架固定大小
如果你需要框架保持150x300的固定尺寸,可以阻止框架根据内容调整大小,同时确保Entry在框架内的可见位置:
from Tkinter import * root = Tk() f1 = Frame(root, bg="cyan") f1.pack(side=LEFT, fill=BOTH, expand=YES) f1a = Frame(f1, bg="gold", height=100, width=100) f1a.grid(row=0, column=0, rowspan=2, columnspan=2, padx=10, pady=10) c1 = Canvas(f1, height=400, width=800, bg="snow") c1.create_rectangle(50,50,750,100) c1.create_rectangle(50,130,750,200) c1.create_rectangle(50,220,750,300) c1.create_text(100,70,text="Sensor1", font=40) c1.create_text(100,170,text="Sensor2", font=40) c1.create_text(100,260,text="Sensor3", font=40) c1.grid(row=3, column=3) # 设置框架固定大小 f1b = Frame(c1, width=150, height=300, bd=3, highlightcolor="black", highlightthickness=1, highlightbackground="black", relief=RAISED) # 阻止框架根据内容调整大小 f1b.grid_propagate(0) # 将Entry放在框架内合理的位置 e1 = Entry(f1b, width=10) e1.grid(row=0, column=0, padx=10, pady=10) c1.create_window(420, 160, window=f1b, anchor=CENTER) root.mainloop()
关键修改点说明
- 移除或调整框架的固定宽高,让框架能正确适配内部控件;
- 调整Entry的
grid行列位置到框架内的可见区域(比如row=0, column=0); - 使用
grid_propagate(0)可以强制框架保持固定大小,适合需要固定布局的场景。
内容的提问来源于stack exchange,提问作者Aniket
相关产品推荐
相关产品推荐

