Что делает " вес " в 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()

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()

вот как выглядит окно:

window with no weights applied

причина похоже, это потому, что tkinter было сказано не давать ни одному из столбцов дополнительное пространство, поэтому дополнительное пространство не используется справа.

теперь измените код так, чтобы мы дали вес только одному столбцу:

root.grid_columnconfigure(0, weight=1)

когда мы вновь поехали, теперь у нас есть окно, которое выглядит так:

window with weight on first column only

Что случилось? Поскольку нулевой столбец имел вес единицы, tkinter дал дополнительное пространство для этого столбца. Вы могли бы установить вес 1, 100, 100000 и вы получите тот же результат. В этом случае все дополнительное пространство переходит в этот столбец.

что произойдет, если вы дадите обе колонки вес? Вес делится между столбцами пропорционально их весу. Например, предположим, вам нужна область навигации слева, которая занимает 1/4 экрана, а основная область должна занимать 3/4 экрана.

изменить вес, чтобы выглядеть так:

root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=3)

Так как столбцы имеют вес, дополнительное пространство предоставляется обоим столбцам. Для каждых четырех пикселей дополнительного пространства столбец 0 получит 1, а столбец 1 получит остальные 3.

window with weight given to both columns

более того, если вы интерактивно изменяете размер окна, пропорция сохраняется как можно больше. Вот то же самое окно, которое я вручную изменил, чтобы быть намного шире:

window after resizing