尝试在 Tkinter 网格上定位两个 TFrame 时出错

问题描述 投票:0回答:1

当尝试在主 TFrame 网格上放置 2 个 TFrame 时,最终在两个 TFrame 之间出现了不应存在的间隙

这是代码:

import tkinter as tk
from tkinter import ttk

class App(tk.Tk):
    def __init__(self, title, size):
        super().__init__()

        self.title(title)
        self.geometry(f"{size[0]}x{size[1]}")
        self.minsize(size[0], size[1])

        s = ttk.Style()
        s.configure("Header.TLabel", font=("Arial", 18, "bold"))

        self.main = Main(self)
        self.main.grid(row=0, column=0, sticky="nsew")

        self.columnconfigure((0), weight=1)
        self.rowconfigure((0), weight=1)


class Header(ttk.Frame):
    def __init__(self, parent):
        super().__init__(parent, padding="10 50 10 50")
        self.create_widgets()

    def create_widgets(self):
        button = ttk.Button(self, text="Voltar")
        button.grid(row=0, column=0, sticky="ew")

        label = ttk.Label(
            self, text="Cadastro de Pessoa", anchor="center", style="Header.TLabel"
        )
        label.grid(row=0, column=1, sticky="ew")

        button = ttk.Button(self, text="Salvar")
        button.grid(row=0, column=2, sticky="ew")

        self.columnconfigure((0, 1, 2), weight=1)
        self.rowconfigure((0), weight=1)


class Body(ttk.Frame):
    def __init__(self, parent):
        super().__init__(parent, padding="10 5 10 5")
        
        self.create_widgets()

    def create_widgets(self):
        nome = ttk.Label(self, text="Nome: ", background="red")
        nome.grid(row=0, column=0, sticky="nsew")

        self.columnconfigure((0), weight=1)
        self.rowconfigure((0), weight=1)


class Main(ttk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        
        self.create_widgets()

    def create_widgets(self):
        self.header = Header(self)
        self.header.grid(row=0, column=0, sticky="new")

        self.body = Body(self)
        self.body.grid(row=1, column=0, sticky="nsew")

        self.columnconfigure((0), weight=1)
        self.rowconfigure((0,1), weight=1)


app = App("Cadastro de Pessoa", (600, 600))
app.mainloop()

以下是使用代码获得的结果: https://i.stack.imgur.com/ZFTdV.png

我预料到了这一点: https://i.stack.imgur.com/oBeh4.png

我已经尝试过仅输入 0 或仅输入 1 来更改行配置。

我已经尝试过更改 TFrame 的行编号,但没有帮助。

我已经尝试更改行配置,但它不起作用,如果有人可以帮助我,我将不胜感激。

python user-interface tkinter grid-layout tkinter-layout
1个回答
0
投票

这是因为您在

weight=1
框架内为第0行和第1行都设置了
Main
。您只需将其设置为第 1 行即可获得所需的结果:

class Main(ttk.Frame):
    ...

    def create_widgets(self):
        ...
        self.rowconfigure(1, weight=1)
© www.soinside.com 2019 - 2024. All rights reserved.