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

如何用Tkinter标准方法实现指定的网格布局?

解决Tkinter网格布局中第5行5个按钮无法均等拉伸的问题

问题说明

目标UI布局:
目标UI布局

当前实现效果:
当前实现效果

尝试实现上述网格布局(暂不考虑Entry输入框),但第5行的5个列无法均等拉伸,现有代码如下,请告知实现该网格的标准方法:

import tkinter as tk

root = tk.Tk()

frame = tk.Frame(root)
frame.pack(expand=True, fill='both')

num = 1
for i in range(0, 3):
    for j in range(0, 3):
        tk.Button(frame, text=num).grid(row=i, column=j, sticky='nsew')
        num += 1
        frame.columnconfigure(i, weight=1)
        frame.rowconfigure(i, weight=1)

tk.Button(frame, text='-').grid(row=4, column=0, sticky='nsew')
tk.Button(frame, text=0).grid(row=4, column=1, sticky='nsew')
tk.Button(frame, text='.').grid(row=4, column=2, sticky='nsew')
frame.rowconfigure(4, weight=1)

frame2 = tk.Frame(frame)
frame2.grid(row=5, columnspan=3)

frame2.rowconfigure(0, weight=1)
frame2.rowconfigure(1, weight=1)
frame2.rowconfigure(2, weight=1)
frame2.rowconfigure(3, weight=1)
frame2.rowconfigure(4, weight=1)

tk.Button(frame2, text='+').grid(row=0, column=0, sticky='nsew')
tk.Button(frame2, text='-').grid(row=0, column=1, sticky='nsew')
tk.Button(frame2, text='*').grid(row=0, column=2, sticky='nsew')
tk.Button(frame2, text='/').grid(row=0, column=3, sticky='nsew')
tk.Button(frame2, text='=').grid(row=0, column=4, sticky='nsew')


root.mainloop()

问题分析与修复方案

核心问题点

  1. 主框架列配置索引错误:原代码用行索引i配置列权重,应该使用列索引j,且需确保主框架的3列都设置weight=1,保证列宽度均分。
  2. 子框架frame2未配置列权重:frame2内的5个按钮没有对应的列权重配置,导致无法均等拉伸;同时frame2未设置sticky='nsew',无法填充主框架第5行的全部空间。
  3. 冗余行配置:frame2仅使用第0行,多余的行权重配置可删除。

修改后的完整代码

import tkinter as tk

root = tk.Tk()

frame = tk.Frame(root)
frame.pack(expand=True, fill='both')

# 统一配置主框架的3列和前5行权重,确保空间均分
for col in range(3):
    frame.columnconfigure(col, weight=1)
for row in range(5):
    frame.rowconfigure(row, weight=1)

num = 1
# 创建数字按钮区域
for i in range(3):
    for j in range(3):
        tk.Button(frame, text=num).grid(row=i, column=j, sticky='nsew')
        num += 1

# 创建底部的-、0、.按钮
tk.Button(frame, text='-').grid(row=4, column=0, sticky='nsew')
tk.Button(frame, text=0).grid(row=4, column=1, sticky='nsew')
tk.Button(frame, text='.').grid(row=4, column=2, sticky='nsew')

# 创建操作按钮框架
frame2 = tk.Frame(frame)
# 让frame2占满主框架第5行的全部空间
frame2.grid(row=5, columnspan=3, sticky='nsew')
# 配置frame2的5列权重,保证按钮均等分配宽度
for col in range(5):
    frame2.columnconfigure(col, weight=1)
# 配置frame2的行权重,确保按钮垂直方向占满空间
frame2.rowconfigure(0, weight=1)

# 创建操作按钮
tk.Button(frame2, text='+').grid(row=0, column=0, sticky='nsew')
tk.Button(frame2, text='-').grid(row=0, column=1, sticky='nsew')
tk.Button(frame2, text='*').grid(row=0, column=2, sticky='nsew')
tk.Button(frame2, text='/').grid(row=0, column=3, sticky='nsew')
tk.Button(frame2, text='=').grid(row=0, column=4, sticky='nsew')

root.mainloop()

关键修改说明

  • 单独循环配置主框架的列和行权重,避免循环内的索引混淆
  • 给frame2添加sticky='nsew',确保它填充主框架对应行的全部空间
  • 为frame2的5列分别设置weight=1,让5个按钮均等分配宽度
  • 移除不必要的冗余配置,简化代码逻辑

内容的提问来源于stack exchange,提问作者محمد عبدالله

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:05:16