tkinter 中的“重量”有啥作用?

Posted

技术标签:

【中文标题】tkinter 中的“重量”有啥作用?【英文标题】:What does 'weight' do in tkinter?tkinter 中的“重量”有什么作用? 【发布时间】:2018-02-01 11:48:24 【问题描述】:

我一直在搜索不同的网站,试图找出重量在 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()

【问题讨论】:

【参考方案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()

这是窗口的样子:

它看起来那样的原因是因为 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)

由于两列都有权重,因此两列都有额外的空间。每增加四个像素的空间,第 0 列将获得 1,第 1 列将获得另外 3。

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

【讨论】:

使用“weight”给我一个错误,上面写着:“TclError: bad option "-weight": must be -column, -columnspan, -in, -ipadx, -ipady, -padx, - pady、-row、-rowspan 或 -sticky" @Korzak:正确。 weightrowconfigurecolumnconfigure 的选项,但不适用于 grid。根据错误消息,您尝试将其与grid(或grid_configure)一起使用 谢谢!我正在使用“网格”。我正在尝试使标签跨越两行,但它不起作用。当我使用 'sticky=N + S' 时,它仍然不会跨越两行。我已经阅读了大约 30 篇文章和主题,但仍然无法解决它。我会继续寻找。谢谢!! @BryanOakley 如果默认权重为 0,您能否解释一下为什么明确设置 weight=0 会使列仍然展开? @ChristophFrings:明确将权重设置为零应该绝对没有效果。它将继续表现得好像它具有默认权重一样。

以上是关于tkinter 中的“重量”有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

Python中tkinter控件中的Listbox控件详解

为啥 tkinter 不能很好地处理多处理?

在单独的线程中运行 Tkinter 表单

Tkinter GUI 未显示,但功能收到响应

pythy标准库之Tkinter(hello world窗口显示)

Python连载60-Tkinter布局按钮以及属性详解