我如何继续将小部件放置在处于缩放状态的框架上,使用.grid()
时无法调整大小?
我希望能够将按钮放在屏幕的最右边,同时在屏幕左侧放置一个树视图,中间有一个“空白”实例。我不确定它是否可以亲自完成,而且根据我使用tkinter的经验,我只使用了较小的窗口,这些窗口不是'Zoomed'或'全屏',使得.grid()
放置非常容易使用而没有这个问题。我已经在网上寻找解决方案但尚未找到解决方案。
我希望能够在下面提供的布局中布置我的tkinter窗口。
答案 0 :(得分:3)
关于这样的问题令人沮丧的是a)至少有六种方法可以实现你想要的东西,而b)最好的方法取决于你还没有定义的变量。例如,你如何决定每个部分的比例 - 你是否对它们进行了硬编码,你是否希望tkinter根据里面的内容来计算它们?如果用户调整窗口大小,您想要什么行为?等等。
让我们从import语句和根窗口开始。我讨厌全屏幕窗户,所以我会选择较小的固定尺寸。无论大小如何,布局都可以使用,您可以根据需要调整大小。
import tkinter as tk
root = tk.Tk()
root.geometry("900x600")
接下来,让我们为每个部分创建一个框架。每个框架都将使用图像中的颜色,以便更容易可视化。我可以使用任何小部件,但框架是最常用的小部件,用作其他小部件的容器(例如,带有滚动条的树视图或文本小部件,可能带有按钮的图形等)
treeview_frame = tk.Frame(root, background="#FFF0C1", bd=1, relief="sunken")
graph_frame = tk.Frame(root, background="#D2E2FB", bd=1, relief="sunken")
text_frame = tk.Frame(root, background="#CCE4CA", bd=1, relief="sunken")
button_frame = tk.Frame(root, background="#F5C2C1", bd=1, relief="sunken")
有了这个,我们可以把小部件放在外面。我们可以非常轻松地使用pack
,但在您学习时grid
可以更容易理解。
当我查看您的图片时,我很清楚您有两行三列。看起来第一列(第0列)比其他列更宽松。类似地,第一行(第0行)看起来比另一行更高。我们会稍微使用这些信息。
首先,让我们将所有内容放在各自的行和列中。它应该很明显,所以我会让代码做解释。
treeview_frame.grid(row=0, column=0, sticky="nsew", padx=2, pady=2)
graph_frame.grid(row=1, column=0, sticky="nsew", padx=2, pady=2)
text_frame.grid(row=0, column=1, rowspan=2, sticky="nsew", padx=2, pady=2)
button_frame.grid(row=0, column=2, rowspan=2, sticky="nsew", padx=2, pady=2)
接下来是一个非常重要的步骤,几乎所有初学者都忘记了:你需要为每一行和每列赋予一个重量。权重确定grid
如何分配额外空间。既然你说你想要一个缩放的窗口,你可能在添加实际的小部件之后会有一堆额外的空间。
这里是相对宽度和高度的来源。weight
属性是一个指定额外空间分配方式的值。例如,如果您的列的权重为1(一),另一个的权重为2,则权重为2的列将获得另一个的额外空间的两倍。例如,如果tkinter计算出需要填充的100个额外像素,它将为一个提供66或67个像素,为另一个提供33或34个像素。
要记住的是行和列的权重为0(零)。这意味着他们没有任何额外的空间。
经验法则说,大部分的重量应该给予主要的"屏幕上的小部件。对于作为文本小部件的文本编辑器,对于绘图应用程序,它可能是画布。对于报告应用,它可能是树视图。既然你拥有所有这些,我就不知道你想要如何分配空间。
我要猜测,并说树视图所在的第0行应该占据高度的一半多一点。我要给它一个3的权重,另一个给它2的权重。如果你想要树视图和图形都是相同的大小你会给它们每个权重为1.如果图是一个固定的大小,但树视图应尽可能大,给图表的权重为0(零),树的权重为1.
root.grid_rowconfigure(0, weight=3)
root.grid_rowconfigure(1, weight=2)
现在我们需要对列进行相同的练习。它看起来像第一列,第零列,占用的空间比其他列多一点。因此,我要给它一个3的重量,其他的重量为2.与行一样,你可以将所有重量放在一列中,平均分配,或按照你的意愿去做。 / p>
root.grid_columnconfigure(0, weight=3)
root.grid_columnconfigure(1, weight=2)
root.grid_columnconfigure(2, weight=2)
对于基本布局而言。
如果您在所有代码的末尾拨打root.mainloop()
来电话,那么您的窗口看起来几乎与您提供的图片完全相同。请注意,在调整窗口大小时,它都会很好地缩放。
现在您可以开始向每个框架添加小部件,而不必过多担心它们如何影响窗口的其余部分。不仅如此,您可以对某些人使用pack
,对其他人使用grid
或place
。例如,如果您希望树视图具有滚动条,则可以像这样创建它:
tree = ttk.Treeview(treeview_frame)
sb = ttk.Scrollbar(treeview_frame)
sb.pack(side="right", fill="y")
tree.pack(side="left", fill="both", expand=True)
唯一可能让你感到惊讶的是,如果你放入一个非常大的小部件,它可能会弄乱比例。最简单的解决方案通常是将宽度和高度设置为较小的值,然后让它变得合适。如果你把它变大,它会想要变大,推动其他小部件。