我正在尝试使用Python和Tkinter在GUI设计中做一些非常标准的事情,我无法弄明白。我正在尝试制作以下内容:
+------+----------------------+
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
+------+----------------------+
使用侧边栏和主要内容区域进行非常简单的设置。我可以设置框架布局没有问题,但问题出现在我去调整窗口大小。我可以让侧边栏调整得很好,垂直但不是水平,并且粘在左侧,但主要内容区域拒绝水平填充其余空间。就像侧边栏仍占用相同的水平空间,即使它设置为仅在y
方向调整大小。
这里有一些非常简单的代码来证明我的意思:
from Tkinter import *
root = Tk()
# sidebar
sidebar = Frame(root, width=200, bg='white', height=500, relief='sunken', borderwidth=2)
sidebar.pack(expand=True, fill='y', side='left', anchor='nw')
# main content area
mainarea = Frame(root, bg='#CCC', width=500, height=500)
mainarea.pack(expand=True, fill='both', side='right')
root.mainloop()
以下是我尝试调整大小时会发生的事情:
有什么想法吗?我的意思是,这必须是可行的,对吧?它实际上是一个标准。
答案 0 :(得分:5)
TL; DR:使用fill="both"
作为侧边栏。
问题概述
您看到的额外空间属于侧边栏。因为您对两个小部件都使用expand=true
,所以当您调整窗口大小时,它们每个都会被赋予额外空间的一部分。由于你没有指定fill
在侧边栏的“x”方向,它会被给予一些额外的空间,但它没有填充它。正如你所问, 在“y”方向填充它,并且主区域完全填充其空间,因为它有fill="both"
。
您需要在侧边栏中填充“x”和“y”尺寸,或者将展开设置为固定尺寸。注意:当我说“固定大小”时,如果使用fill=both
,它仍会填充给定的区域,但是当您调整窗口大小时,所有额外的空间都将转到主窗口。
使用固定尺寸的侧边栏
要使用固定尺寸的侧边栏,请将关闭,但将填充设置为两者。您希望它填充分配给它的区域,但如果窗口变大,您不希望该区域增长:
import Tkinter as tk
root = tk.Tk()
# sidebar
sidebar = tk.Frame(root, width=200, bg='white', height=500, relief='sunken', borderwidth=2)
sidebar.pack(expand=False, fill='both', side='left', anchor='nw')
# main content area
mainarea = tk.Frame(root, bg='#CCC', width=500, height=500)
mainarea.pack(expand=True, fill='both', side='right')
root.mainloop()
使用展开式侧边栏
要使用灵活大小的侧边栏,请在上展开,以便在调整窗口大小时为其提供额外空间的一部分。你希望填充两者,以便它填充它给出的空间。
import Tkinter as tk
root = tk.Tk()
# sidebar
sidebar = tk.Frame(root, width=200, bg='white', height=500, relief='sunken', borderwidth=2)
sidebar.pack(expand=True, fill='both', side='left', anchor='nw')
# main content area
mainarea = tk.Frame(root, bg='#CCC', width=500, height=500)
mainarea.pack(expand=True, fill='both', side='right')
root.mainloop()
<强>摘要强>
这两个示例之间的唯一区别是使用expand=True
或expand=False
。扩展控制窗口调整大小时任何额外空间发生的变化。如果为true,则为窗口小部件分配额外的空间,以及将展开设置为true的任何其他窗口小部件。但是,在两个情况下,您希望侧边栏完全填充已给出的区域。因此,在这两种情况下,您都需要fill="both"
。 fill仅确定窗口小部件对其所给区域的影响(填充与否),但与窗口小部件是否获得或多或少的空间无关。