我是 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
# ...
最佳答案
问题不在于工具面板位于错误的位置,而在于它位于大型机内部,而大型机位于错误的位置。
当你这样做时:
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/