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

如何在多Frame的Tkinter应用中按比例独立设置Status标签宽度

问题:如何让Tkinter中两个状态标签按2/3和1/3比例分配窗口宽度?

我想创建一个GUI,底部包含两个状态标签(Status 0和Status 1),上方区域为主应用功能内容。预期布局如下:

┏━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━┓
┃ @ ┃ hello world                ┃ ╳ ┃
┣━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━┫
┃                                    ┃   <- Frame 0
┃                MAIN                ┃   <- Frame 0
┃                                    ┃   <- Frame 0
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃                OTHER               ┃   <- Frame 1
┣━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┫   <- Frame 1
┃ Status 0            ┃ Status 1     ┃   <- Frame 1
┗━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┛

但当前代码生成的布局不符合预期,窗口调整大小时问题更严重。我需要让Status 0占当前窗口宽度的2/3,Status 1占1/3。

当前代码:

import tkinter as tk

class MyApp(tk.Tk):
    def __init__(self):
        super().__init__()

        self.frame0 = tk.Frame(self, background="green")
        self.title('hello world')
        self.frame0.pack(fill=tk.X)
        self.frame0_label0 = tk.Label(self.frame0, text='MAIN', border=10)
        self.frame0_label0.grid(row=0, column=0)

        self.frame1 = tk.Frame(self, background="blue")
        self.frame1.pack(fill=tk.X)
        self.frame1_label0 = tk.Label(self.frame1, text='OTHER', border=10)
        self.frame1_label0.grid(row=0, column=0)
        self.var0 = tk.StringVar()
        self.var0.set("S0")
        self.var1 = tk.StringVar()
        self.var1.set("S1")
        sbar0 = tk.Label(self.frame1, textvariable=self.var0, relief=tk.SUNKEN, anchor="w")
        sbar1 = tk.Label(self.frame1, textvariable=self.var1, relief=tk.SUNKEN, anchor="w")
        sbar0.grid(row=1, column=0)
        sbar1.grid(row=1, column=1)

def main():
    MyApp().mainloop()

if __name__ == "__main__":
    main()

解决方案

要实现两个标签按比例分配宽度,核心是利用Tkinter的grid_columnconfigure设置列权重,同时让标签填充列空间:

修改后的代码:

import tkinter as tk

class MyApp(tk.Tk):
    def __init__(self):
        super().__init__()

        self.frame0 = tk.Frame(self, background="green")
        self.title('hello world')
        # 让主区域随窗口拉伸
        self.frame0.pack(fill=tk.BOTH, expand=True)
        self.frame0_label0 = tk.Label(self.frame0, text='MAIN', border=10)
        self.frame0_label0.pack(fill=tk.BOTH, expand=True)

        self.frame1 = tk.Frame(self, background="blue")
        self.frame1.pack(fill=tk.X)
        self.frame1_label0 = tk.Label(self.frame1, text='OTHER', border=10)
        # 让OTHER标签填充水平空间
        self.frame1_label0.pack(fill=tk.X)
        
        self.var0 = tk.StringVar()
        self.var0.set("Status 0")
        self.var1 = tk.StringVar()
        self.var1.set("Status 1")
        sbar0 = tk.Label(self.frame1, textvariable=self.var0, relief=tk.SUNKEN, anchor="w")
        sbar1 = tk.Label(self.frame1, textvariable=self.var1, relief=tk.SUNKEN, anchor="w")
        
        # 设置列权重,比例2:1
        self.frame1.grid_columnconfigure(0, weight=2)
        self.frame1.grid_columnconfigure(1, weight=1)
        
        # 让标签填充列的水平空间
        sbar0.grid(row=1, column=0, sticky="ew")
        sbar1.grid(row=1, column=1, sticky="ew")

def main():
    MyApp().mainloop()

if __name__ == "__main__":
    main()

关键修改说明:

  • grid_columnconfigure:给frame1的两列设置权重2和1,窗口调整大小时,列会按此比例分配额外宽度
  • sticky="ew":让标签在水平方向(东-西)填充整个列的宽度,确保标签随列宽变化拉伸
  • 优化了主区域布局,让frame0能随窗口垂直/水平拉伸,更贴合预期布局

内容的提问来源于stack exchange,提问作者user69453

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:00:42