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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:15:59