Tkinter - 文本和滚动条小部件不填充和适合框架

Tkinter - Text and Scrolled bar widgets don't fill and fit the frame

我创建了一个自定义框架,其中已经放置了两个小部件(文本和滚动条)。当我使用它时,对象可以工作,但内部小部件不遵循“网格”规则。

下面是我的代码:

import tkinter as tk
from tkinter import ttk

class TextFrame(tk.Frame):
    def __init__(self, container):
        super().__init__(container)

        # main frame:
        self.F1=tk.Frame(self, background="white", highlightbackground="#7a7a7a", highlightthickness=1)
        self.F1.pack(expand=True, fill=tk.BOTH)
        
        # text widget:
        self.T1=tk.Text(self.F1, wrap=tk.WORD, font=("Segoe UI", 9), border=0)
        self.T1.grid(padx=(0, 16), row=1, column=1, sticky="nsw")
        
        # scrolling bar:
        self.SB1=ttk.Scrollbar(self.F1, orient="vertical", command=self.T1.yview)
        self.SB1.grid(padx=(0, 1), pady=(1, 1), row=1, column=1, sticky="nse")
        self.T1.configure(yscrollcommand=self.SB1.set)

# main window:
class MainWindow:
    def __init__(self):

        self.parent=tk.Tk()
        self.parent.geometry("500x300+370+100")
        self.parent.title("Test")
        self.parent.configure(background="#f0f0f0")
        self.parent.minsize(400, 200)
        
        obj=TextFrame(self.parent)
        obj.pack(padx=(10,10), pady=(10,10), expand=True, fill=tk.BOTH)

        self.parent.mainloop()

if __name__=="__main__":
    app=MainWindow()

我只想让小部件填充并适合框架,当我展开它时,它们都必须展开,但它没有发生!为什么?我该如何解决这个问题?

更新:

我按照您的建议修改了代码:

import tkinter as tk
from tkinter import ttk

class TextFrame(tk.Frame):
    def __init__(self, container):
        super().__init__(container)

        # main frame:
        self.F1=tk.Frame(self, background="white", highlightbackground="#7a7a7a", highlightthickness=1)
        self.F1.pack(expand=True, fill=tk.BOTH)
        
        self.F1.grid_rowconfigure(0, weight=1)
        self.F1.grid_columnconfigure(0, weight=1)

        # text widget:
        self.T1=tk.Text(self.F1, wrap=tk.WORD, font=("Segoe UI", 9), border=0)
        self.T1.grid(row=0, column=0, sticky="nsew")
        
        # scrolling bar:
        self.SB1=ttk.Scrollbar(self.F1, orient="vertical", command=self.T1.yview)
        self.T1.configure(yscrollcommand=self.SB1.set)
        self.SB1.grid(row=0, column=1, sticky="nsew")

        self.F1.grid_rowconfigure(0, weight=1)
        self.F1.grid_columnconfigure(0, weight=1)

# main window:
class MainWindow:
    def __init__(self):

        self.parent=tk.Tk()
        self.parent.geometry("500x300+370+100")
        self.parent.title("Test")
        self.parent.configure(background="#f0f0f0")
        self.parent.minsize(400, 200)
        
        ttk.Label(self.parent, text="Test:").pack(anchor="w")
        
        obj=TextFrame(self.parent)
        obj.pack(padx=(10,10), pady=(10,10), expand=True, fill=tk.BOTH)
        
        ttk.Label(self.parent, text="Test:").pack(anchor="w")
        self.Entry=ttk.Entry(self.parent)
        self.Entry.pack(fill=tk.BOTH, anchor="w", padx=(10,10), pady=(10,10))
        
        self.parent.mainloop()

if __name__=="__main__":
    app=MainWindow()

但现在我有另一个问题。如果我将其他小部件放在主 window 中,它们将被自定义框架覆盖。查看底部的两个小部件,标签和条目:

所有小部件都应该可见,但自定义框架似乎想要所有 space 为他自己。我该如何解决这种不良行为?

我认为您需要为行和列添加类似这样的内容。这样,当缩放 window 变大或变小时,它们会被同等对待。

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

默认情况下,网格行和列会扩大或缩小以适应其内容的大小。如果您希望扩展一个或多个行或列以填充 window,您必须通过适当地设置这些行或列的 weight 属性来明确声明。

在具体的情况下,希望一行一列展开,需要将该行和该列的权重设置为正整数。由于这是您要展开的唯一行或列,因此任何正整数都可以。

self.F1.grid_rowconfigure(0, weight=1)
self.F1.grid_columnconfigure(0, weight=1)

您还需要 sticky 属性类似于 nsew(北、南、东、西),以便 row/column 的内容扩展以填充 space四面都给。

您还遇到了将滚动条和文本小部件放在同一列中的问题。它们需要在单独的列中。此外,虽然从 1 开始计算行和列是无害的,但第一行和第一列是 0。

self.T1.grid(row=0, column=0, sticky="nsew")
self.SB1.grid(row=0, column=1, sticky="nsew")

有关 weight 参数的详细信息,请参阅