什么'重量'在tkinter做什么?

Fre*_*red 23 python tkinter

我一直在寻找不同的网站,试图找出tkinter的重量.我从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()
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 39

在最简单的术语中,如果有额外的空间,非零权重会导致行或列增长.默认值是权重为零,这意味着如果有额外的空间,列将不会增长.

请考虑以下代码,该代码创建一个比内部小部件更大的窗口,并且没有列具有权重:

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()
Run Code Online (Sandbox Code Playgroud)

这就是窗口的样子:

窗口没有应用权重

它看起来那样的原因是因为tkinter被告知不要给任何列任何额外的空间,所以额外的空间在右边没用.

现在,更改代码,以便我们只为一列提供权重:

root.grid_columnconfigure(0, weight=1)
Run Code Online (Sandbox Code Playgroud)

当我们重新启动时,我们现在有一个如下所示的窗口:

只有第一列重量的窗口

发生了什么?因为列零的权重为1,所以tkinter为此列提供了额外的空间.你可以将权重设置为1,100,100000,你会得到相同的结果.在这种情况下,所有额外空间都转到这一列.

如果你给两个栏重量会怎么样?重量在与其重量成比例的列之间分配.例如,假设您希望左侧的导航区域占据屏幕的1/4,主区域占据屏幕的3/4.

将权重更改为如下所示:

root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=3)
Run Code Online (Sandbox Code Playgroud)

由于两个柱都具有重量,因此两个柱都有额外的空间.对于额外空间的每四个像素,列0将获得1,列1将获得另外3个.

窗口的重量给两列

更重要的是,如果您以交互方式调整窗口大小,则会尽可能保留比例.这是我手动调整大小的窗口:

调整大小后的窗口

  • @Korzak:正确。`weight` 是`rowconfigure` 和`columnconfigure` 的一个选项,但不是`grid` 的选项。根据错误消息,您尝试将它与 `grid`(或 `grid_configure`)一起使用 (3认同)
  • 使用“权重”给我一个错误,内容如下:“TclError:错误选项“-weight”:必须是-column,-columnspan,-in,-ipadx,-ipady,-padx,-pady,-row,-rowspan,或 - 粘性” (2认同)