2

我是 Tkinter 的新手,在获得所需的布局时遇到了一些问题。这是代码:

import tkinter as tk

class MainFrame(tk.Frame):
    def __init__(self, master, w, h):
        tk.Frame.__init__(self, master, width=w, height=h)
        self.toolpanel = ToolPanel(self, 200, h)
        self.toolpanel.pack(side=tk.LEFT, fill=tk.Y)

class ToolPanel(tk.Frame):
    def __init__(self, master, w, h):
        tk.Frame.__init__(self, master, width=w, height=h, background='#000')

def main():
    root = tk.Tk()
    root.geometry('640x480')

    mainframe = MainFrame(root, 640, 480)
    mainframe.pack()

    root.mainloop()

下面是预期布局(右)和实际布局(左)。如果我让root工具面板的主人而不是主框架,那么我将得到预期的输出。但这不是我想要的,我认为让主机成为工具面板的主人更有意义。

self.toolpanel = ToolPanel(self, 200, h)   # Actual result
self.toolpanel = ToolPanel(master, 200, h) # Expected (desired) result

实际与预期结果

我注意到,当我构造主框架时,即使我将宽度和高度传递给它,它的大小仍然是1x1直到我调用pack(). 我应该如何更好地组织我的 Tkinter 应用程序以及如何获得所需的结果?

class MainFrame(tk.Frame):
    def __init__(self, master, w, h):
        tk.Frame.__init__(self, master, width=w, height=h)

        # At this point, the size is still 1x1
        # ...
4

1 回答 1

2

问题不在于工具面板在错误的位置,而在于它在主机内部,而主机在错误的位置。

当你这样做时:

mainframe.pack()

... Tkinter 默认为side=TOP, fill=NONE,大致意味着它将在其容器中居中并粘在顶部。相反,您希望大型机位于左边缘或填满整个容器。

尝试将该语句更改为以下两个之一,并观察 GUI 启动和调整大小时的行为:

mainframe.pack(fill="both", expand=True)
-or-
mainframe.pack(side="left", fill="y")

为了额外的启发,暂时改变主机的背景,然后尝试上面的两个例子,看看有什么变化。当遇到布局问题时,这是一种强大的技术,因为它可以帮助您可视化小部件是否正在填充您认为它们应该填充的区域

于 2012-05-12T12:01:04.807 回答