Python Tkinter: поместите две метки на противоположные стороны одного и того же фрейма

в Tkinter у меня есть фрейм, который заполняет X-размер моего корневого окна. Внутри этой рамки я хочу разместить две метки: одну слева и одну справа. Однако, похоже, я все еще неправильно использую grid и sticky и нуждаюсь в вашем совете:

from Tkinter import *

root = Tk()
root.geometry("250x200")

myFrame = Frame(root, bd=1, relief="sunken")
myFrame.pack(fill=X, padx=10)

myLabel1 = Label(myFrame, text="left").grid(sticky=W)
myLabel2 = Label(myFrame, text="right").grid(sticky=E)

root.mainloop()

Этот код размещает две метки слева, но друг над другом. Если я помещу их обоих в одну строку

myLabel1 = Label(myFrame, text="left").grid(row=0, sticky=W)
myLabel2 = Label(myFrame, text="right").grid(row=0, sticky=E)

они находятся в одном и том же месте, так что myLabel2 закрывает myLabel1.

If I do

myLabel1 = Label(myFrame, text="left").grid(row=0, column=0, sticky=W)
myLabel2 = Label(myFrame, text="right").grid(row=0, column=1, sticky=E)

тогда myLabel2 действительно находится справа от myLabel1, но не с правой стороны фрейма (хотя размер фрейма не изменяется).

Я предполагаю, что фактический вопрос заключается в следующем: как мне заставить grid расширяться на весь кадр (в x-измерении), чтобы sticky=E действительно означало «правая сторона кадра», а не «правая сторона первого столбца, который такой же ширины, как myLabel1".


person offeltoffel    schedule 28.06.2017    source источник


Ответы (2)


Чтобы поместить myLabel2 в правую часть фрейма, вам нужно использовать myFrame.columnconfigure(1, weight=1), чтобы столбец 1 расширился, чтобы заполнить фрейм.

Если вы сделаете

myFrame.columnconfigure(0, weight=1)
myFrame.columnconfigure(1, weight=1)

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

Метод rowconfigure делает то же самое, но для строк.

person j_4321    schedule 28.06.2017
comment
Наконец-то я понял, для чего существует columnconfigure! - person offeltoffel; 28.06.2017

Я предполагаю, что фактический вопрос заключается в следующем: как мне заставить сетку расширяться на весь кадр (в x-измерении), чтобы sticky=E действительно означало «правая сторона кадра», а не «правая сторона первого столбца, который такой же ширины, как myLabel1"

Короткий ответ на этот вопрос — убедиться, что внутри фрейма хотя бы один столбец имеет ненулевой вес. Атрибут weight столбца сообщает tkinter, как распределять дополнительное пространство. Значение по умолчанию равно нулю, что означает, что столбец не получит дополнительного пространства. Дополнительное пространство остается неиспользованным справа и ниже последнего столбца и строки.

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

Как правило, вы всегда должны назначать по крайней мере одну строку и один столбец положительным весом. Обычно это «главный» виджет (как правило, виджет холста или текста), но он также может быть пустой строкой или столбцом, используемым в качестве разделителя.

Макет сильно зависит от всего, что находится в контейнере. Если вы собираетесь использовать только две метки, я рекомендую создать конфигурацию из трех столбцов. myLabel1 может находиться в столбце 0, myLabel2 может находиться в столбце 2, и вы можете настроить столбец 1 так, чтобы он был пустым и заполнял все пустое пространство.

myLabel1 = Label(...)
myLabel2 = Label(...)

myLabel1.grid(row=0, column=0, sticky="w")
myLabel2.grid(row=0, column=2, sticky="e")

myFrame.grid_columnconfigure(1, weight=1)
myFrame.grid_rowconfigure(0, weight=1)

Другим вариантом было бы использовать только два столбца, и пусть каждый столбец будет иметь одинаковый вес, чтобы все лишние пробелы были равномерно разделены между двумя столбцами.

person Bryan Oakley    schedule 28.06.2017
comment
Спасибо за это исчерпывающее объяснение! Я уже использую веса, но они были скопированы из другого кода, и теперь я понимаю, что они делают. Если вы начнете работать с Tkinter, у вас возникнет ощущение, что он никогда не делает то, что вы хотите. Теперь я предполагаю, что я просто никогда не знал, что ЭТО хотело от МЕНЯ. Вспомнил рекомендацию и решил использовать трехколоночную компоновку. Звучит наиболее разумно для меня! - person offeltoffel; 28.06.2017