如何使用tkinter中的网格几何管理器在两个帧之间均匀划分空间?

时间:2017-03-30 16:44:53

标签: python python-3.x graphics tkinter grid-layout

我有一个tkinter应用程序我试图创建。我已经定意使用网格几何管理器而不是打包。到目前为止它一直运作良好,但我遇到了一个奇怪的问题。

我想在我的应用程序中使用的基本布局是在窗口的顶部有一个工具栏框架,它将展开以水平填充窗口,并占据屏幕空间的1/5高度。另一个框架将填充铰孔4/5屏幕空间(同样在高度方面),并且还将水平填充屏幕。另外第三帧将在第二帧之下,我将使用frame.tkraise()在两者之间切换。

以下是我尝试完成的一个最小例子:

import tkinter as tk


class Toolbar(tk.Frame):
    def __init__(self, parent, root, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.root = root

        self.lbl = tk.Label(self, text='Toolbar')
        self.lbl.pack()


class PageOne(tk.Frame):
    def __init__(self, parent, root, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.root = root

        self.lbl = tk.Label(self, text='PageOne')
        self.lbl.pack()

        self.btn = tk.Button(self, text='MainPage', command=lambda: self.root.show_frame(MainPage))
        self.btn.pack()


class MainPage(tk.Frame):
    def __init__(self, parent, root, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.root = root

        self.lbl = tk.Label(self, text='MainPage')
        self.lbl.pack()

        self.btn = tk.Button(self, text='PageOne', command=lambda: self.root.show_frame(PageOne))
        self.btn.pack()


class App(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._setup_window()
        self.frames = {}

        container = tk.Frame(self, bg='yellow')
        container.pack(side='top', fill='both', expand=True)

        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        container.grid_rowconfigure(1, weight=3)

        self.toolbar = Toolbar(container, self, bg='red')
        self.toolbar.grid(row=0, column=0, sticky='new')

        for page in (MainPage, PageOne):
            frame = page(container, self, bg='blue')
            self.frames[page] = frame
            frame.grid(row=1, column=0, sticky='nsew')

        self.show_frame(MainPage)

    def _setup_window(self):
        self.geometry('420x280')
        self.title('backup')

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()


if __name__ == '__main__':
    app = App()
    app.mainloop()

上面的代码显示以下框架:

enter image description here

黄色框是保持工具栏和另外两个框架的窗口。红框是工具栏。蓝色框架是两个主窗口,可以使用" MainPage"和" PageOne"按钮分别。

正如您可能知道的那样,我的问题是工具栏框架(红色部分)没有完全展开以填充铰孔黄色空间。无论我为工具栏框架分配多少空间,它都不会扩展。

我的理解是,如果我将工具栏框架放在第0列,并且 第一个是两个主窗口,我做了container.grid_rowconfigure(0, weight=1)container.grid_rowconfigure(1, weight=4)来满足我的需求。我根据here的摘录做出了这个假设:

  

要使列或行可伸缩,请使用此选项并提供一个值,该值在分配额外空间时给出此列或行的相对权重。例如,如果窗口小部件w包含网格布局,则这些行将分配额外空间的四分之三到第一列,四分之一到第二列:

   w.columnconfigure(0, weight=3)
   w.columnconfigure(1, weight=1)
     

如果未使用此选项,则列或行不会拉伸。

假设这个我错了吗?有什么我想念的吗?如何使工具栏框架扩展以填充额外空间?

1 个答案:

答案 0 :(得分:1)

您只需要告诉您的工具栏也可以粘贴到可用空间的南侧:

self.toolbar.grid(row=0, column=0, sticky='nesw')