tkinter 中的“weight”起什么作用?
- 2025-01-21 09:01:00
- admin 原创
- 82
问题描述:
我一直在搜索不同的网站,试图找出 tkinter 中的 weight 是什么。我从TkDocs中得到了这个:
每列和每行都有一个与之关联的“权重”网格选项,该选项告诉它如果主表中有多余的空间需要填充,它应该增长多少。默认情况下,每列或每行的权重为 0,表示不会扩展以填充空间。
有人能帮我解释一下这个吗,因为我很难理解它的作用。我试验了以下代码,它似乎只是在我更改值时在页面上移动内容。
try:
import tkinter
except ImportError: # python 2
import Tkinter as tkinter
import os
mainWindow = tkinter.Tk()
mainWindow.title("Grid demo")
mainWindow.geometry('640x480-8-200')
label = tkinter.Label(mainWindow, text="tkinter grid demo")
label.grid(row=0, column=0, columnspan=3)
mainWindow.columnconfigure(0, weight=1)
mainWindow.columnconfigure(1, weight=1)
mainWindow.columnconfigure(2, weight=3)
mainWindow.columnconfigure(3, weight=3)
mainWindow.columnconfigure(4, weight=3)
mainWindow.rowconfigure(0, weight=1)
mainWindow.rowconfigure(1, weight=10)
mainWindow.rowconfigure(2, weight=1)
mainWindow.rowconfigure(3, weight=3)
mainWindow.rowconfigure(4, weight=3)
fileList = tkinter.Listbox(mainWindow)
fileList.grid(row=1, column=0, sticky='nsew', rowspan=2)
fileList.config(border=2, relief='sunken')
for zone in os.listdir('/Windows/System32'):
fileList.insert(tkinter.END, zone)
mainWindow.mainloop()
解决方案 1:
用最简单的术语来说,非零权重会导致行或列在有额外空间时增长。默认值为零权重,这意味着如果有额外空间,列将不会增长。
考虑以下代码,它创建一个比里面的小部件更大的窗口,并且其中没有任何列具有权重:
import tkinter as tk
root = tk.Tk()
root.geometry("200x100")
f1 = tk.Frame(root, background="bisque", width=10, height=100)
f2 = tk.Frame(root, background="pink", width=10, height=100)
f1.grid(row=0, column=0, sticky="nsew")
f2.grid(row=0, column=1, sticky="nsew")
root.grid_columnconfigure(0, weight=0)
root.grid_columnconfigure(1, weight=0)
root.mainloop()
注意:
columnconfigure
是 的别名grid_columnconfigure
。我在这里使用了较长的形式,因为我认为它更清楚。
窗口如下所示:
之所以看起来是这样,是因为 tkinter 被告知不要给任何列提供任何额外的空间,因此额外的空间在右侧未被使用。
现在,更改代码,以便我们只为一个列赋予权重:
root.grid_columnconfigure(0, weight=1)
当我们重新启动时,我们现在有一个如下所示的窗口:
发生了什么?因为第 0 列的权重为 1,所以 tkinter 将额外的空间分配给了这一列。您可以将权重设置为 1、100、100000,结果相同。在这种情况下,所有额外的空间都分配给了这一列。
如果为两列赋予权重,会发生什么情况?额外的空间将根据其权重在两列之间进行分配。例如,假设您希望左侧的导航区域占据屏幕的 1/4,主区域应占据屏幕的 3/4(1:3 的比例)。
我们将权重改成如下形式:
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=3)
由于两列都有权重,因此会为两列分配额外的空间。每增加 4 个像素的额外空间,第 0 列将获得 1 个像素,第 1 列将获得另外 3 个像素。
此外,如果您以交互方式调整窗口大小,则比例会尽可能保持。以下是我手动调整为更宽的同一窗口:
解决方案 2:
这只是比例。如果您有两列,例如column1
和column2
,并且您将权重设置column1
为3
和column2
,5
则column1
占用3 / (3 + 5)
和column2
占用5 / (3 + 5)
可用空间。如果您将它们设置为零,它们将根本不会扩展以填充空间,这是默认设置。
提示:权重参数必须是整数类型。