Альтернативные приемы использования tkinter

alternativnye priemy ispolzovaniya tkinter Графические интерфейсы пользователя

Как можно предполагать, есть разные способы реализации примера gui1. Например, если желательно более явным образом описать в сценарии импортируемые из tkinter элементы, импортируйте весь модуль и добавляйте имя модуля ко всем относящимся к нему именам, как в примере 7.3.

Пример 7.3. PP4E\Gui\Intro\gui1b.py import против from

import tkinter

widget = tkinter.Label(None, text=’Hello GUI world!’) widget.pack() widget.mainloop()

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

Пример 7.4. PP4E\Gui\Intro\gui1c.py — константы и функции вместе

from tkinter import * root = Tk()

Label(root, text=’Hello GUI world!’).pack(side=TOP) root.mainloop()

Модуль tkinter старается экспортировать только то, что действительно необходимо, поэтому он один из немногих, для которых формат импорта со спецификатором * можно применять относительно безопасно.[XXVIII] К примеру, константа TOP в вызове функции pack является одной из многих, экспортируемых модулем tkinter. Это просто имя переменной (TOP=”top”), которой заранее присвоено значение в модуле constants, автоматически загружаемом пакетом tkinter.

При размещении графических элементов можно указать, к какому краю родительского контейнера они должны быть прикреплены, — TOP, BOTTOM, LEFT или RIGHT. Если параметр side не передается функции pack (как в предшествующих примерах), виджет по умолчанию прикрепляется к верхнему краю (TOP). В целом, более крупные графические интерфейсы на базе tkinter могут конструироваться как набор прямоугольников, прикрепляемых к надлежащим сторонам других, охватывающих их прямоугольников. Как будет показано позднее, tkinter располагает графические элементы в прямоугольнике, в соответствии с очередностью их размещения и параметром side. Если виджеты располагаются по сетке, им присваиваются номера строк и колонок. Однако все это имеет смысл, только если в окне присутствует больше одного виджета, поэтому продолжим наши исследования.

Обратите внимание, что в этой версии метод pack вызывается сразу после создания метки, которая не присваивается никакой переменной. Если нет необходимости сохранять виджет, можно разместить его таким способом на месте, и этим сэкономить строку программного кода. Мы будем использовать этот прием, если графический элемент прикрепляется к более крупной структуре и нигде в программном коде больше не используется. Сложности могут возникнуть, если присваивать результат, возвращаемый pack, но объяснение этого откладывается до того времени, когда будут изучены еще некоторые основные понятия.

Мы также используем здесь в качестве родителя экземпляр класса Tk виджета вместо None. Объект Tk представляет главное («корневое») окно программы — которое открывается вместе с запуском программы. Автоматически созданный объект Tk используется также как родительский виджет по умолчанию, когда в вызовы других методов виджетов не передается никакого родителя или когда в качестве родителя передается None. Иными словами, по умолчанию виджеты просто прикрепляются к главному окну программы. В данном сценарии это поведение по умолчанию реализуется явно, путем создания и передачи самого объекта Tk. В главе 8 будет показано, как для создания новых всплывающих окон, действующих независимо от главного окна программы, используются виджеты Toplevel.

Некоторые методы виджетов в tkinter экспортируются также в виде функций, что позволяет сократить пример 7.5 до трех строчек кода.

Пример 7.5. PP4E\Gui\Intro\gui1d.py — минимальная версия

from tkinter import *

Label(text=’Hello GUI world!’).pack() mainloop()

Функцию mainloop из модуля tkinter можно вызывать относительно виджета или непосредственно (то есть как метод или как функцию). В этом варианте мы не передавали конструктору Label аргумент родителя: если он опущен, то по умолчанию будет использоваться значение None (что, в свою очередь, по умолчанию означает автоматически создаваемый объект Tk). Но использование этого значения по умолчанию становится менее удобным при создании более крупных графических интерфейсов. Такие элементы, как метки, чаще прикрепляются к другим контейнерам виджетов.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий