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

时间:2015-07-20 02:07:37

标签: python tkinter resize

我在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()

为什么?

另外,I've tried to use grid_columnconfigure and grid_rowconfigure just like in this answer, and it fails miserably

1 个答案:

答案 0 :(得分:3)

您的代码中有几个问题正在协同工作以防止小部件扩展(以及“小部件”,我认为您的意思是文本小部件)。

首先,您使用gridApp的实例放在根窗口中。但是,您尚未设置sticky属性,因此应用不会增长和缩小。如果它不增长和缩小,它的内容也不会。

另外,因为你正在使用网格,你需要给第0行和第0列一个正权重,这样tkinter就会为它分配额外的空间。但是,由于这是根窗口中唯一的窗口小部件,因此您可以使用pack并通过调用grid来调用pack来解决问题:

self.pack(fill="both", expand=True)

接下来,使用grid将文本小部件添加到画布。您尚未使用sticky选项,因此即使分配给它的空间增大,窗口小部件也会在空间中居中。您需要使用sticky属性来告诉它“粘住”它所给区域的所有边:

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

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

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

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