Tkinter anchor не работает

Функция tkinter .pack (anchor = «s») не работает

Сначала он показывает пользователям пару флажков, спрашивающих пользователя, где они хотят разместить его на своем экране.
Эти параметры следующие: северо-восток, северо-запад, юго-восток и юго-запад, затем он переводит его в другую функцию, которая (я тестировал, чтобы увидеть, если при отметке правильные переменные дают 1, а не 0, поэтому vars2 (северо-запад), vars3 (северо-восток), vars4 (юго-восток) и vars5 (юго-запад) все работали и преобразовывались в nw, ne, se, sw, а затем, наконец, он отображает его на экране в положении, указанном пользователем.
Я тестировал его пару раз, и все северное восток / запад, казалось, работали, но когда дело дошло до юго-востока / запада, оно оказалось в том же месте, что и северо-восток / запад, и не так, как ожидалось. Я пробовал и .grid (), и .pack (), и результат был одинаковым.
Но, как заявил Анураг Чандра, возможно, этикетка с техническими характеристиками компьютера может быть слишком маленькой, и поэтому она не работает, но каков минимум, чтобы она работала на южной стороне?

Ниже приведен полный код, извините за неудобства:

3 ответа

pack работает, распределяя пространство вдоль одной стороны пустого пространства в мастере. Параметр side принимает одно из значений «сверху», «снизу», «слева» или «справа». По умолчанию — «верх». Таким образом, если вы не укажете сторону, виджет будет размещен в самом верху пустого места.

По умолчанию выделенное пространство будет достаточно большим, чтобы уместить виджет. Если сторона является «верхней» или «нижней», выделенное пространство будет достаточно высоким, чтобы поместиться только для виджета, а если сторона «левая» или «правая», выделенное пространство будет достаточно широким, чтобы поместиться только для виджета.

Параметр anchor указывает, где находится виджет в выделенном ему пространстве . Таким образом, если вы укажете только anchor=»s» без указания стороны или каких-либо других параметров, виджет появится в верхней части доступного пространства в виджете, а anchor из «s» (юг) будет казаться чтобы не иметь никакого эффекта, так как пространство достаточно высоко, чтобы поместиться в виджет.

Если вы хотите, чтобы виджет находился внизу, вы можете использовать side=»bottom» :

Если вы хотите, чтобы виджет находился внизу слева, вам нужно использовать anchor=’w’ (запад) или anchor=’sw’ (юго-запад) в сочетании с установкой side на «низ».

Использовать якорь при определении метки

Вы можете указать положение восток-запад

Юг будет работать, только если этикетка достаточно большая

Источник

Создание макетов окна / tkinter 5

Виджеты определяют, какие действия смогут выполнять пользователи с помощью графического интерфейса. Однако важно обращать внимание на их взаимное и индивидуальное расположение. Эффективные макеты позволяют интуитивно определять значение и приоритетность каждого графического элемента, так что пользователь способен быстро разобраться, как нужно взаимодействовать с программой.

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

В этом материале погрузимся в разные механизмы, которые Tkinter предлагает для формирования макета, группировки виджетов и управления другими атрибутами, например, размером и отступами.

Группировка виджетов с фреймами

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

Читайте также:  Не могу настроить райд

Еще одна распространенная особенность фреймов — инкапсуляция части функциональности приложения таким образом, что с помощью абстракции можно спрятать детали реализации дочерних виджетов.

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

Создадим приложение, которое будет включать два списка, где первый — это список элементов, а второй изначально пустой. Оба можно пролистывать. Также есть возможность перемещать элементы между ними с помощью двух кнопок по центру:

Определим подкласс Frame , который представляет собой список с возможностью скроллинга и два его экземпляра. Также в основное окно будут добавлены две кнопки:

Как работает группировка виджетов

У класса ListFrame есть только два метода для взаимодействия с внутренним списком: pop_selection() и insert_item() . Первый возвращает и удаляет текущий выделенный элемент, или не делает ничего, если элемент не был выбран. Второй — вставляет элемент в конец списка.

Эти методы используются в родительском классе для перемещения элемента из одного списка в другой:

Также можно воспользоваться особенностями контейнеров родительского фрейма, чтобы правильно размещать их с нужными внутренними отступами:

Благодаря фреймам вызовы управлять геометрией макетов проще.

Еще одно преимущество такого подхода — возможность использовать geometry manager в контейнерах каждого виджета. Это могут быть grid() для виджетов во фрейме или pack() для укладывания фрейма в основном окне.

Однако смешивать эти менеджеры в одном контейнере в Tkinter запрещено. Из-за этого приложение просто не будет работать.

Geometry manager Pack

В прошлых материалах можно было обратить внимание на то, что после создания виджета он не отображается на экране автоматически. Для каждого нужно было вызывать метод pack() . Это подразумевает использование соответствующего geometry manager.

Это один из трех доступных в Tkinter менеджеров и он отлично подходит для простых макетов, как в случае, когда, например, нужно разместить все друг над другом или рядом.

Предположим, что нужно получить следующий макет для приложения:

Он состоит из трех строк, где в последней есть три виджета, расположенных рядом друг с другом. В таком случае Pack сможет добавить виджеты как требуется без использования дополнительных фреймов.

Для этого будут использоваться пять виджетов Label с разными текстом и фоном, что поможет различать каждую прямоугольную область:

Также были добавлены параметры в словаре opts . Они делают яснее размеры каждой области:

Как работает Pack

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

Сначала добавляются две метки в верхней части экрана. Пусть значение параметра side по умолчанию является tk.TOP ,все равно зададим его явно, чтобы отличать от тех случаев, где используется tk.LEFT :

Дальше добавляем еще три метки со значением tk.LEFT у параметра side , в результате чего они размещаются рядом друг рядом с другом:

Определение стороны label_e особой роли не играет, поскольку это последний виджет, который добавляется в контейнер.

Важно запомнить, что это основная причина, почему порядок так важен при работе с Pack. Чтобы не столкнутся с непредвиденными результатами в сложных макетах распространенной практикой считается их расположение в пределах фрейма так, что бы они не пересекались.

В таких случаях рекомендуется использовать geometry manager Grid, поскольку он позволяет прямо задавать положение каждого виджета с помощью вызова geometry manager и избегать использования дополнительных фреймов.

В side можно передать не только tk.TOP и tk.LEFT , но также tk.BOTTOM и tk.RIGHT . Они разместят виджеты в другом порядке, но это может быть не интуитивно, ведь мы естественным путем следим сверху вниз и слева направо.

Читайте также:  Как починить пенал с паролем

Например, если заменить значение tk.LEFT на tk.RIGHT в последних трех виджетах, их порядок будет следующим: label_e , label_d и label_c .

Geometry manager Grid

Grid — самый гибкий из всех доступных geometry manager. Он полностью переосмысливает концепцию сетки (grid), которая традиционно используется при дизайне пользовательских интерфейсов. Сетка — это двумерная таблица, разделенная на строки и колонки, где каждая ячейка представляет собой пространство, которое доступно для виджета.

Продемонстрируем работу Grid с помощью следующего макета:

Его можно представить в виде таблицы 3×3, где виджеты во второй и третьей колонках растягиваются на две строки, а виджет в третьей строке занимает все три колонки.

Как и в предыдущем варианте используем 5 меток с разным фоном, чтобы проиллюстрировать распределение ячеек:

Также будем передавать словарь параметров, включающий внутренний отступ, который растянет виджеты на все доступное пространство внутри ячеек.

Как работает Grid

Расположение label_a и label_b говорит само за себя: они занимают первую и вторую строки первой колонки соответственно (важно не забывать, что индексация начинается с нуля):

Чтобы растянуть label_c и label_d на несколько ячеек, зададим значение 2 для параметра rowspan . Таким образом они будут занимать две ячейки, начиная с положения, отмеченного опциями row и column . Наконец, значение columnspan для label_e будет 3.

Важно запомнить, что в отличие от Pack есть возможность менять порядок вызовов к grid() для каждого виджета без изменения финального макета.

Параметр sticky определяет границы, к которым виджет должен крепиться. Он выражается в координатах сторон света: север, юг, запад и восток. В Tkinter эти значения выражены константами tk.N , tk.S , tk.W и tk.E , а также их комбинациями: tk.NW , tk.NE , tk.SW и tk.SE .

Например, sticky=tk.N выравнивает виджет у верхней границы ячейки (north – север), а sticky=tk.SE — в правом нижнем углу (south-ease – юго-восток).

Поскольку эти константы представляют соответствующие символы в нижнем регистре, выражение tk.N + tk.S + tk.W + tk.E можно записать в виде строки nwse . Это значит, что виджет должен расширяться одновременно горизонтально и вертикально — по аналогии с работой fill=tk.BOTH из Pack.

Если параметру sticky значение не передается, виджет располагается по центру ячейки.

Geometry manager Place

Менеджер Place позволяет задать положение и размер виджета в абсолютном или относительном значении.

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

Для демонстрации работы Place повторим следующий макет, смешав абсолютные и относительные положения и размеры:

Метки, которые будут отображаться, имеют разный фон и определены в том порядке, в котором они будут расположены слева направо и сверху вниз:

Если запустить эту программу, то можно будет увидеть наложение label_c и label_d в центре экрана. Этого не удастся добиться с помощью других менеджеров.

Как работает Place

Первая метка располагается со значением 0.25 у параметров relwidth и relheight . Это значит, что виджет будет занимать 25% ширины и высоты родительского. По умолчанию виджеты расположены в положениях x=0 и y=0 , а также выравнены к северо-западу, то есть, верхнему левому углу экрана.

Вторая метка имеет абсолютное положение — x=100 . Она выравнена по верхней границе с помощью параметра anchor , который имеет значение tk.N . Тут также определен абсолютный размер с помощью width и height .

Третья метка расположена по центру окна с помощью относительного позиционирования и параметра anchor для tk.CENTER . Важно запомнить, что значение 0.5 для relx и relwidth обозначает половину родительской ширины, а 0.5 для rely и relheight — половину родительской высоты.

Четвертая метка расположена в верхней части label_c . Это делается с помощью переданного аргумента in_ (суффикс используется из-за того, что in — зарезервированное ключевое слово в Python). При использовании in_ можно обратить внимание на то, что выравнивание не является геометрически точным. В этом примере нужно добавить смещение на 2 пикселя в каждом направлении, чтобы идеально перекрыть правый нижний угол label_c .

Читайте также:  Не работает передний плафон

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

Еще одно важное преимущество Place — возможность совмещать его с Pack и Grid.

Например, представьте, что есть необходимость динамически отобразить текст на виджете при нажатии правой кнопкой мыши на нем. Его можно представить в виде виджета Label, который располагается в относительном положении при нажатии:

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

Группировка полей ввода с помощью виджета LabelFrame

Класс LabelFrame может быть использован для группировки нескольких виджетов ввода. Он представляет собой логическую сущность с соответствующей меткой. Обычно он используется в формах и сильно напоминает виджет Frame .

Создадим форму с парой экземпляров LabelFrame , каждый из которых будет включать соответствующие виджеты ввода:

Поскольку цель этого примера — показать финальный макет, добавим некоторые виджеты без сохранения их ссылок в виде атрибутов:

Источник

Почему у меня не работает модуль tkinter?

Только начал учить GUI, для этого мне надо работать с модулем tkinter, но он не работает вообще.
Вот мой самый первый код:

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Почему в tkinter не работает column (столбец)?
Подскажите, пожалуйста, почему упаковщик grid не размещает виджет в указанном столбце? Из трёх.

Почему у меня домо не работает! а в Колледже работает?
Написал в УЗ прогу! выводит текст Ассемблер по середине экрана! пришёл домой, написал её начал.

Не могу понять почему не работает. Создаю игру Пятнашки. И ничего у меня не работает. И ошибки при запуске выдает
Не могу понять почему не работает. Создаю игру Пятнашки. И ничего у меня не работает. И ошибки при.

Почему у меня не работает PHP?
У меня Linux. Уcтановил: PHP5 Apache2 libapache2-mod-auth-mysql php5-mysql Создал файл.

Добавлено через 2 минуты
Скорее всего не установлен Тkinter

А как его скачать.

Добавлено через 1 минуту
этот код, у меня работает только в IDLE, но я работаю в VS code, и там как раз выходит ошибка

Решение

Перестать называть свои скрипты именами встроенных модулей. Вы импортируете не tkinter из каталога Python\lib, а свой личный tkinter.py.
При совпадении имен интепретатор всегда будет выбирать тот модуль, который находится в самом ближайшем каталоге из списка каталогов sys.path. А поскольку первый в списке — текущий рабочий каталог, импорт будет происходить из него.

В IDLE текущий рабочий каталог это:

Скрипт переименуй и удали каталог __pycache__ (там же где и скрипт).

Добавлено через 45 секунд

Люди: у меня похожая проблема — не устанавливается «tkinter»:

Я занялся изучением «Python», и пробуя установить среду использовал следующие варианты:
«Anaconda» — «tkinter» не ставится.
«python-3.6.0» (для моей Windows 7) — в командной строке отказался устанавлявать библиотеки, «почитав» выяснил — что нужно виндовую командную строку (FarComander не прокатил)(а «Anaconda» нормально в своей строке ставила); и здесь получил ошибки на «pip install pyautogui»:

и ту-же ошибку на «pip install tkinter».
— Может этого пакета вообще нету? Может его переименовали? Или мне пакет для игр ставить ?

Добавлено через 14 минут
Вычитал что «tkinter» уже установлен в системе (у меня семёрка) и инсталлировать его не надо — а просто подключить:

Источник

Оцените статью