Python Tkinter grid布局:实现4行数字旁放5个符号按钮且两区等高
布局问题根因
- 你写在两个Frame上的
rowspan=4属于无效配置:根窗口的grid从未定义过4个独立行,两个Frame的高度完全由内部按钮的自然尺寸决定。数字区排了4行按钮、符号区排了5行按钮,本身自然高度就存在差值,自然会出现符号区偏高的情况。 - 缺少grid拉伸约束:默认grid布局的组件只会按自身自然大小占位,不会主动撑满分配到的布局空间,两个Frame没有强制等高的布局约束。
- 缺少内部行权重配置:Frame内部的按钮没有绑定行权重,无法均分Frame的可用高度,所有按钮会堆叠在Frame顶部,下方留大片空白,视觉上高度更不协调。
调整方案
- 修正根窗口层的grid配置
删掉无效的rowspan参数,将两个Frame放在同一行,通过sticky="nsew"强制两个Frame完全撑满所在单元格的全部空间,从布局层面锁定两个Frame高度完全一致。同时给根窗口的grid行、列设置权重,让布局可随窗口拉伸自适应调整。 - 配置Frame内部的grid权重
给两个Frame内部的每一行设置等权重,让按钮可以均匀分配Frame的总高度,避免按钮堆叠留白的问题。
修正后可直接运行的代码
import tkinter as tk class calculate: def __init__(self): self.window = tk.Tk() self.numbers = tk.Frame(master = self.window) self.signs = tk.Frame(master = self.window) self.lst, self.lst2 = (1,2,3,4,5,6,7,8,9,0,".","="),("C","+","-","*","/") def buttons(self): val = 0 for i in range(4): for j in range(3): self.numbutton = tk.Button(master = self.numbers,text = self.lst[val]) self.numbutton.grid(row = i,column = j, sticky="nsew") val += 1 # 数字区内部4行3列,等权重分配空间 for row in range(4): self.numbers.grid_rowconfigure(row, weight=1) for col in range(3): self.numbers.grid_columnconfigure(col, weight=1) for i in range(5): self.signbutton = tk.Button(master = self.signs,text = self.lst2[i]) self.signbutton.grid(row = i, sticky="nsew") # 符号区内部5行,等权重分配空间 for row in range(5): self.signs.grid_rowconfigure(row, weight=1) self.signs.grid_columnconfigure(0, weight=1) def packing(self): # 根窗口grid权重配置:第一行占满垂直空间,数字区占3份宽度、符号区占1份宽度 self.window.grid_rowconfigure(0, weight=1) self.window.grid_columnconfigure(0, weight=3) self.window.grid_columnconfigure(1, weight=1) # 两个Frame同放第一行,强制拉伸至单元格大小,保证等高 self.numbers.grid(column= 0,row = 0, sticky="nsew") self.signs.grid(column = 1,row = 0, sticky="nsew") self.window.mainloop() calculator = calculate() calculator.buttons() calculator.packing()
调整后效果
- 数字区与符号区整体高度完全一致,不会出现符号区偏高的问题
- 两个区域的按钮会均匀分配各自Frame的空间,不会挤在顶部留空白
- 支持窗口拉伸自适应,布局不会变形错位
内容的提问来源于stack exchange,提问作者user15151760
相关产品推荐
相关产品推荐

