我正在为软件构建 GUI 并希望实现此目的:
######################################
# | some title #
# menu upper |----------------------#
# | #
# | CANVAS #
# menu lower | #
# | #
#------------------------------------#
# statusbar #
######################################
上层菜单 具有一些高级功能, 下层菜单 根据用户输入而变化。状态栏经常更改其内容。
不幸的是,Tkinter 拒绝工作。
使用 网格布局管理器,我无法创建稳定的设计并向左侧菜单添加标签和按钮等内容:
self.root = tk.Tk()
self.root.resizable(width=0, height=0)
self.root.title("some application")
# menu left
self.menu_left = tk.Frame(self.root, width=150, bg="#ababab")
self.menu_left.grid(row=0, column=0, rowspan=2, sticky="ns")
self.menu_left_upper = tk.Frame(self.menu_left, width=150, height=150, bg="red")
self.menu_left_upper.grid(row=0, column=0)
# this label breaks the design
#self.test = tk.Label(self.menu_left_upper, text="test")
#self.test.pack()
self.menu_left_lower = tk.Frame(self.menu_left, width=150, bg="blue")
self.menu_left_lower.grid(row=1, column=0)
# right area
self.some_title_frame = tk.Frame(self.root, bg="#dfdfdf")
self.some_title_frame.grid(row=0, column=1, sticky="we")
self.some_title = tk.Label(self.some_title_frame, text="some title", bg="#dfdfdf")
self.some_title.pack()
self.canvas_area = tk.Canvas(self.root, width=500, height=400, background="#ffffff")
self.canvas_area.grid(row=1, column=1)
self.root.mainloop()
此设计 在左侧菜单中没有内容的情况下工作。每当我在 self.menu_left_upper
或 self.menu_left_lower
添加一些东西时,比如 test
标签,我的设计就坏了:菜单框架消失了。此外,即使使用 columnspan ,我也必须删除状态栏,因为当添加它时,左侧的菜单再次消失。
使用 包布局管理器 我得到了这个:
######################################
# | some title #
# |----------------------#
# menu upper | #
# | CANVAS #
# | #
# menu lower | #
# |----------------------#
# | statusbar #
######################################
由于我希望左侧的菜单框架占用完整的 y 空间,因此我使用 pack(side="left", expand=True, fill="both")
使其增长,但此设置始终拒绝状态栏达到全宽。
此外,纯包管理器代码看起来“丑陋” 。我认为带有网格管理器的设计“更清晰”。因此我认为 网格布局或网格布局内的包布局会很好 吗?
谁能帮忙?我陷入了 GUI 地狱:/
原文由 daniel451 发布,翻译遵循 CC BY-SA 4.0 许可协议
进行布局的关键是要有条不紊,并使用正确的工具来完成工作。这也意味着有时您需要发挥创造力。这意味着在
grid
中布局时使用grid
pack
,在从上到下或从左到右布局时使用 --- 。另一个关键是将布局代码组合在一起。当所有内容都在一个代码块中时,可视化和修改布局要容易得多。
在您的情况下,您似乎有三个或四个不同的区域,具体取决于您的计数方式。如果您想使用
grid
,最简单的方法是将“菜单上部”和“菜单下部”组合成一个框架,并将整个框架视为一个表格单元格。看起来你已经在这样做了,这很好。那么,让我们从这些主要领域开始:
任何时候你使用
grid
,你需要至少给一行和一列一个正权重,这样 tkinter 就知道在哪里使用任何未分配的空间。通常有一个小部件是“主要”小部件。在这种情况下,它是画布。您要确保画布的行和列的权重为 1(一):note: using
pack
instead ofgrid
would save you two lines of code, sincepack
doesn’t require you to set weights the waygrid
确实如此。接下来,我们需要解决菜单区域的问题。默认情况下,框架会缩小以适合其内容,这就是添加标签会破坏布局的原因。你没有告诉 tkinter 如何处理额外的空间,因此框架缩小以适合,额外的空间未被使用。
由于您希望“menu_upper”和“menu_lower”各占该区域的 50%,
pack
是最简单的解决方案。您可以使用grid
,但它需要更多代码行来添加行和列权重。这是一个功能版本,带有状态栏。请注意当您调整窗口大小时它的行为与应有的完全一致:
与此无关:我强烈建议您 不要 删除用户调整窗口大小的功能。他们比你更清楚他们的要求是什么。如果您正确使用
grid
和pack
,GUI将完美调整大小。