python - 如何在 Tkinter 中获得这个布局?

标签 python tkinter

我是 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

Actual vs. expected 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
        # ...

最佳答案

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

当你这样做时:

mainframe.pack()

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

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

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

为了获得额外的启发,请暂时更改大型机的背景,然后尝试上述两个示例以查看发生了什么变化。当遇到布局问题时,这是一种强大的技术,因为它可以帮助您可视化小部件是否填充了您认为应该填充的区域

关于python - 如何在 Tkinter 中获得这个布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10561967/

相关文章:

python - 在 Python 中获取数组作为 GET 查询参数

machine-learning - 在python numpy中实现Relu导数

python - 如何在没有路由的情况下在Python Flask中执行普通函数并使用路由返回该过程的结果?

python - 斐波那契向日葵 Tkinter

python - 在计算 Python 中的总列表计数时不计算空列表

python - Easy_install 不断将软件包安装到过时版本的 python

python - 文本小部件 tkinter

python - 在Tkinter中嵌入Matplotlib,显示问题

python - 如何刷新tkinter条目值?我遇到一键延迟

python - 如果刻度标签被修改,Matplotlib 将不会显示任何读数