Распространение размера диспетчера геометрии сетки Tkinter (с липким)

StackOverflow https://stackoverflow.com/questions/1441134

  •  10-07-2019
  •  | 
  •  

Вопрос

Мне что-то не хватает о том, как размеры распространяются в Tk.Попробуй это:

from Tkinter import *

root = Tk()

frame1 = Frame(root, border=4, relief=RIDGE)
frame1.grid(sticky=E+W)
frame2 = Frame(root, border=4, relief=RIDGE)
frame2.grid(sticky=E+W)

label1 = Label(frame1, text='short', background='white')
label1.grid(sticky=E+W)
label2 = Label(frame2, text='quite a bit longer', background='white')
label2.grid(sticky=E+W)

root.mainloop()

label1 находится внутри фрейма1, а label2 — внутри фрейма2.label1 выглядит уже, чем label2, как видно по белому фону.Но фрейм1 и фрейм2 имеют одинаковую ширину, если судить по их границам.Я думал, что липкость расширит label1 до той же ширины, что и его родительский элемент.

Если я помещу label1 и label2 в один и тот же кадр, то label1 окажется такой же ширины, как и label2:

frame1 = Frame(root, border=4, relief=RIDGE)
frame1.grid(sticky=E+W)

label1 = Label(frame1, text='short', background='white')
label1.grid(sticky=E+W)
label2 = Label(frame1, text='quite a bit longer', background='white')
label2.grid(sticky=E+W)

Что мне не хватает?В реальной жизни у меня есть несколько вложенных друг в друга фреймов, которые не расширяются так, как мне хотелось бы.

Спасибо, Дэн

Это было полезно?

Решение

Строки и столбцы имеют «вес», который описывает, как они увеличиваются или уменьшаются, чтобы заполнить дополнительное пространство в мастере.По умолчанию строка или столбец имеют нулевой вес. Это означает, что вы указали метке заполнить столбец, но не указали столбцу заполнить главный фрейм.

Чтобы это исправить, присвойте столбцу вес.В этом конкретном случае подойдет любое положительное целое число:

frame1.columnconfigure(0, weight=1)
frame2.columnconfigure(0, weight=1)

Для получения дополнительной информации о grid, примеры на Ruby, TCL, Perl и Python см. страница сетки на tkdocs.com

Другие советы

Это решение со столбцами и фреймами работает, но чтобы метки имели одинаковую ширину в сетке, вам не нужны закрывающие фреймы.См. пример ниже

from tkinter import *

root = Tk()

label1 = Label(root, text='short', bg='light green', relief=RIDGE)
label1.grid(sticky=E+W)
label2 = Label(root, text='quite a bit longer', bg='light green', relief=RIDGE)
label2.grid(sticky=E+W)

root.mainloop()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top