如何在Tkinter中为包含组件的Frame固定尺寸?
问题描述
我想在Grid布局中放置两个尺寸完全相同的Frame,空Frame时能正常控制尺寸,但向Frame内添加组件后,Frame会自动适配组件尺寸,导致无法再控制Frame本身的尺寸。请问有没有办法在Frame包含组件时仍能控制其尺寸?
原代码示例:
from tkinter import * import random as rn def value_change(choice): global user_choice user_choice=choice return(user_choice) user_choice=4 hlavni=Tk() jmeno=Label(hlavni,text='Kámen, nůžky,papír',font=("arial","20","bold"),justify='center') jmeno.grid(row=0,column=0,columnspan=2) hrac_name=Label(hlavni,text='Hráč',justify="left") hrac_name.grid(row=1,column=0) pc_name=Label(hlavni,text="Počítač") pc_name.grid(row=1,column=1) hrac_f=Frame(hlavni,relief="ridge",borderwidth=4,width=400,height=400,padx=10,pady=10) hrac_f.grid(row=2,column=0,padx=10,pady=10) """ stuff inside the frame Volba=Label(hrac_f,text="Zadej svou volbu",font=("arial",10,"bold")).grid(row=0,column=0) values=Label(hrac_f,text="Vyber: Kámen, Nůžky, Papír",font=("arial",10)).grid(row=1,column=0) choice_f=Frame(hrac_f) choice_f.grid(row=3,column=0) stone=Button(choice_f,text="kámen",relief="ridge",command=lambda: value_change(0)) stone.grid(row=0,column=0) scissors=Button(choice_f,text="nůžky",relief="ridge",command=lambda: value_change(1)) scissors.grid(row=0,column=1) paper=Button(choice_f,text="papír",relief="ridge",command=lambda: value_change(2)) paper.grid(row=0,column=2) """ hlavni.mainloop()
解决方案
要让Frame在包含组件时仍保持指定尺寸,只需调用Frame的grid_propagate(False)方法,它会阻止Frame根据子组件的大小自动调整自身尺寸。
修改后的代码示例:
from tkinter import * import random as rn def value_change(choice): global user_choice user_choice=choice return(user_choice) user_choice=4 hlavni=Tk() jmeno=Label(hlavni,text='Kámen, nůžky,papír',font=("arial","20","bold"),justify='center') jmeno.grid(row=0,column=0,columnspan=2) hrac_name=Label(hlavni,text='Hráč',justify="left") hrac_name.grid(row=1,column=0) pc_name=Label(hlavni,text="Počítač") pc_name.grid(row=1,column=1) hrac_f=Frame(hlavni,relief="ridge",borderwidth=4,width=400,height=400,padx=10,pady=10) hrac_f.grid(row=2,column=0,padx=10,pady=10) # 阻止Frame自适应子组件尺寸 hrac_f.grid_propagate(False) Volba=Label(hrac_f,text="Zadej svou volbu",font=("arial",10,"bold")).grid(row=0,column=0) values=Label(hrac_f,text="Vyber: Kámen, Nůžky, Papír",font=("arial",10)).grid(row=1,column=0) choice_f=Frame(hrac_f) choice_f.grid(row=3,column=0) stone=Button(choice_f,text="kámen",relief="ridge",command=lambda: value_change(0)) stone.grid(row=0,column=0) scissors=Button(choice_f,text="nůžky",relief="ridge",command=lambda: value_change(1)) scissors.grid(row=0,column=1) paper=Button(choice_f,text="papír",relief="ridge",command=lambda: value_change(2)) paper.grid(row=0,column=2) hlavni.mainloop()
补充说明
grid_propagate(False)仅对使用Grid布局管理子组件的Frame生效;如果Frame内用Pack布局,需改用pack_propagate(False);用Place布局则无需额外设置,因为Place不会自动调整父组件尺寸。- 启用该设置后,子组件可能会超出Frame范围,可通过调整子组件的Grid参数(如
padx、pady、sticky)或在Frame内部嵌套可滚动容器来处理。
内容的提问来源于stack exchange,提问作者Naj Litarvan
相关产品推荐
相关产品推荐

