【发布时间】:2016-07-30 02:29:43
【问题描述】:
我正在为软件构建 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,我也必须删除状态栏,因为添加后左侧的菜单又消失了。
使用 pack layout manager 我得到了这个:
######################################
# | some title #
# |----------------------#
# menu upper | #
# | CANVAS #
# | #
# menu lower | #
# |----------------------#
# | statusbar #
######################################
由于我希望左侧的菜单框占用整个 y 空间,因此我使用 pack(side="left", expand=True, fill="both") 使其增长,但此设置始终拒绝状态栏占用整个宽度。
此外,纯包管理器代码看起来“丑陋”。我认为带有网格管理器的设计“更清晰”。因此我认为网格布局中的网格或包布局会很好?
有人可以帮忙吗?我被困在 GUI 地狱中:/
【问题讨论】:
-
您是在寻求使用 grid 的帮助,还是寻求使用 pack 的帮助,或者您不在乎使用什么,只要它提供所需的外观?
pack代码怎么看起来很难看?这只是代码。 -
我不在乎正在使用什么,只要它在工作。但是,我更喜欢网格管理器,因为网格布局对我来说更有意义。它易于理解和扩展,而使用大量具有不同
side=...属性的pack()让我感到困惑。 -
你想让“menu upper”和“menu lower”各占50%的面积吗?
-
最好是。我尝试使用
weight=...属性,但在我的尝试中这也不起作用。