如果我使用 grid(),为什么当我调整窗口大小时小部件不会缩放?

Eri*_*ans 3 python resize tkinter

我在 Windows 7 中使用 tkinter 和 Python 3.4。

我以非绝对方式定位(我没有使用位置,我使用网格),因此,当我自动调整窗口大小时,小部件应该缩放。然而,这并没有发生,而且我没有抓住这一点。这是我的代码:

import tkinter as tk

class App(tk.Frame):

    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.config()
        self.grid()
        self.create_widgets()

    def config(self):
        self.master.title("Pykipedia Explorer")

    def create_widgets(self):
        self.search_label = tk.Label(self, text="Search: ")
        self.search_label.grid(row=0, column=0, sticky=tk.N+tk.SW)
        self.search_entry = tk.Entry(self)
        self.search_entry.grid(row=0, column=0, padx=60, sticky=tk.N+tk.SW)
        self.search_button = tk.Button(self, text="Explore!")
        self.search_button.grid(row=0, column=0, padx=232, sticky=tk.SW)
        self.content_area = tk.Text(self)
        self.content_area.grid(row=1, column=0)
        self.content_scroll_bar = tk.Scrollbar(self, command=self.content_area.yview)
        self.content_scroll_bar.grid(row=1, column=1, sticky=tk.NW+tk.S+tk.W)
        self.content_area["yscrollcommand"] = self.content_scroll_bar.set
        self.quit_button = tk.Button(self, text="Quit", command=self.quit)
        self.quit_button.grid(row=2, column=0, sticky=tk.SW)

def main():

    app = App()
    app.mainloop()

    return 0

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

为什么??

另外,我尝试使用 grid_columnconfigure 和 grid_rowconfigure 就像在这个答案中一样,但它失败了

Bry*_*ley 5

您的代码中存在几个问题,这些问题共同作用以防止小部件缩放(并且“小部件”,我假设您指的是文本小部件)。

首先,您可以grid将 的实例放入App根窗口中。但是,您还没有设置该sticky属性,因此应用程序不会增长和缩小。如果它不增长和收缩,它的内容也不会增长和收缩。

另外,因为您使用的是网格,所以需要为第 0 行和第 0 列赋予正权重,以便 tkinter 为其分配额外的空间。grid但是,由于这是根窗口中唯一的小部件,因此您可以使用 pack 并通过将调用替换为对 的调用来解决问题pack

self.pack(fill="both", expand=True)
Run Code Online (Sandbox Code Playgroud)

接下来,您可以grid将文本小部件添加到画布中。您还没有使用该sticky选项,因此即使分配给它的空间增加,小部件也会保持在空间的中心。您需要使用该sticky属性来告诉它“粘”到给定区域的所有侧面:

self.content_area.grid(row=1, column=0, sticky="nsew")
Run Code Online (Sandbox Code Playgroud)

最后,您没有给任何列任何“权重”,它告诉 tkinter 如何分配额外的空间。当通过调整大小管理窗口时grid,任何额外的空间都会根据行和列的权重分配给它们。默认情况下,行和列的权重为零,因此不会获得任何额外空间。

要使文本区域随着窗口的增长而增长,您需要为第 0 列和第 1 行赋予正权重:

self.grid_rowconfigure(1, weight=1)
self.grid_columnconfigure(0, weight=1)
Run Code Online (Sandbox Code Playgroud)