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» уже установлен в системе (у меня семёрка) и инсталлировать его не надо — а просто подключить:

Источник

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