- Функция tkinter .pack (anchor = «s») не работает
- 3 ответа
- Создание макетов окна / tkinter 5
- Группировка виджетов с фреймами
- Как работает группировка виджетов
- Geometry manager Pack
- Как работает Pack
- Geometry manager Grid
- Как работает Grid
- Geometry manager Place
- Как работает Place
- Группировка полей ввода с помощью виджета LabelFrame
- Почему у меня не работает модуль tkinter?
- Решение
Функция 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» уже установлен в системе (у меня семёрка) и инсталлировать его не надо — а просто подключить:
Источник