Книга: Создание настольных Python приложений с графическим интерфейсом пользователя
Назад: Advanced PyQt
Дальше: Kivy

Tkinter



Tkinter – это обертка Python библиотеки Tk GUI, которая поставляется вместе с Python.







Tkinter – это стандартная библиотека графического интерфейса для Python.

И Tkinter – это интерфейс Python для Tk.

Tkinter – это аббревиатура от «Tk interface».

Tk был разработан Джоном Остерхаутом как расширение графического интерфейса для языка сценариев Tcl.

И Tk был очень популярен в 1990-х годах, так как его легче было изучать и использовать, чем другие наборы инструментов.

Поэтому неудивительно, что многие программисты захотели использовать Tk независимо от Tcl.

Вот почему были разработаны обертки для множества других языков программирования, включая Perl, Ada, Python, Ruby и Common Lisp.







Создание приложения с графическим интерфейсом пользователя с использованием Tkinter – это несложная задача.

Все, что вам нужно сделать, это выполнить следующие шаги -

Импортировать модуль Tkinter.

Создать главное окно приложения GUI.

Добавить один или несколько виджетов в приложение с графическим интерфейсом.

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

Чтобы инициализировать tkinter, мы должны создать корневой виджет Tk, который представляет собой окно со строкой заголовка.

Корневой виджет должен быть создан перед любыми другими виджетами, и может быть только один корневой виджет.

Метод pack сообщает Tk, что размер окна подгоняется под заданный текст.

И окно не появится, пока мы не войдем в цикл событий Tkinter mainloop.

И наш скрипт останется в цикле событий, пока мы не закроем окно.







Теперь, как создать исполняемый файл для приложения Tkinter.

Для начала, установим инструмент pyinstaller.







Затем в окне терминала наберем команду pyinstaller –onefile –windowed main.py

В результате в папке dist будет создан один исполняемый файл.







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

И мы начнем знакомство с Tk с одного из самых простых виджетов – с метки.

Метка – это виджет Tkinter, который используется для отображения текста или изображения.

И метка – это виджет, который пользователь просто просматривает, но не взаимодействует с ним.

Посмотрите на строку кода, которая содержит виджет Label.

Здесь первый параметр – это имя родительского окна, в нашем случае «root».

Так как наш виджет Label является потомком корневого виджета.

Параметр text или textvariable определяет текст, который будет отображаться.

Параметр relief задает внешний вид декоративной рамки вокруг метки. По умолчанию – FLAT.

Некоторые виджеты (например, виджеты ввода текста, переключатели и т. д.) могут быть напрямую связаны с переменными приложения с помощью специальных параметров: variable, textvariable, onvalue, offvalue, и value.

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

Эти управляющие переменные Tkinter используются как обычные переменные Python для хранения определенных значений.

Но при этом невозможно передать обычную переменную виджету с помощью параметра variable или textvariable.

Единственные типы переменных, для которых это работает, – это переменные, которые являются подклассами класса Variable, определенного в модуле Tkinter.

Это переменные StringVar, IntVar, DoubleVar, BooleanVar.

Чтобы прочитать текущее значение такой переменной, можно вызвать метод get.

Значение такой переменной можно изменить с помощью метода set.







Виджет Message можно использовать для отображения коротких текстовых сообщений.

И виджет сообщения аналогичен по своим функциям виджету Label, но более гибок в отображении текста, например можно изменить шрифт, в то время как виджет метки может отображать текст только одним шрифтом. Хотя невозможно использовать для текста более одного шрифта.

Если вам нужно отображать текст несколькими шрифтами, можно использовать виджет Text.

Здесь мы используем метод config чтобы установить фон сообщения и шрифт сообщения.







Виджет Button используется для добавления кнопок в приложение Python.

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

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

Здесь мы создаем фрейм как родительский виджет для двух кнопок.

Первая кнопка с красной надписью QUIT, при нажатии на которую окно закрывается – это встроенная команда quit, прикрепленная к кнопке.

Ко второй кнопке прикреплен метод write_slogan, который печатает в вывод текст.







Радиокнопка представляет собой элемент графического пользовательского интерфейса Tkinter, который позволяет пользователю выбрать одну опцию из предопределенного набора опций.

Радиокнопки могут содержать текст или изображения.

И кнопка может отображать текст только одним шрифтом.

С кнопкой можно связать функцию Python.

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

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

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

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

Если была нажата такая кнопка, другие кнопки выскакивали, оставляя нажатую кнопку единственной нажатой кнопкой.

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

Нажатие кнопки изменяет значение этой переменной на заранее определенное значение.

Здесь у нас есть список «языков», который содержит тексты кнопок и соответствующие значения.

И мы можем использовать цикл for для создания всех переключателей.

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







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

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

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

Таким образом, флажок имеет два состояния: включен или выключен.

И флажок может содержать текст, но только одним шрифтом или изображение.

Параметр variable является управляющей переменной, которая отслеживает текущее состояние флажка.

Обычно эта переменная является переменной IntVar, и 0 означает очищено, а 1 означает установлено.







Виджет ввода – это виджет Tkinter, используемый для получения ввода данных от пользователя приложения.

Этот виджет позволяет пользователю вводить одну строку текста.

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

Если вы хотите ввести несколько строк текста, вы должны использовать виджет Text.

И виджет ввода также ограничен одним шрифтом.

Как и с другими виджетами, можно дополнительно влиять на отображение виджета с помощью параметров.

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

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

Этот метод ждет событий.

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

И Tkinter предоставляет механизм, позволяющий программисту иметь дело с событиями.

Для каждого виджета можно привязать функции Python к событию с помощью метода widget.bind (событие, обработчик)

Если определенное событие происходит в виджете, функция «обработчик» вызывается с объектом события.

В этом примере используется событие <Return>, когда пользователь нажимает клавишу Enter.

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







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

С помощью Canvas можно рисовать графики, создавать графические редакторы и реализовывать различные виды пользовательских виджетов.

Метод create_line используется для рисования прямой линии.

Координаты здесь представлены четырьмя целыми числами: x1, y1, x2, y2.

Это означает, что прямая идет от точки (x1, y1) к точке (x2, y2).

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

Здесь мы можем установить, например, цвет линии.

Для создания прямоугольников есть метод create_rectangle.

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

Метод create_text можно применить к объекту холста, чтобы написать на нем текст.

Также есть методы create_arc, create_image, create_oval, create_polygon.

Также можно организовать интерактивное рисование на холсте.

К сожалению, нарисовать одну точку на холсте невозможно.

Но мы можем решить эту проблему, используя небольшой овал.

Здесь мы связываем методом bind с холстом событие мыши и метод pain, который будет рисовать на холсте.







Слайдер или ползунок – это объект Tkinter, с помощью которого пользователь может установить значение, перемещая индикатор.

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

Ползунок создается с помощью метода Scale.

В качестве параметров можно установить минимальное и максимальное значения, а также разрешение.

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

Виджет Scale – альтернатива виджету Entry, если пользователь должен ввести число из конечного диапазона, то есть предустановленное числовое значение.

И мы можем увеличить длину слайдера с помощью параметра length, который определяет размер x, если масштаб горизонтальный, и размер y, если масштаб вертикальный.

Методом get мы можем получить значение ползунка.







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

Текстовые виджеты также могут использоваться как простые текстовые редакторы или даже веб-браузеры.

Кроме того, текстовые виджеты могут использоваться для отображения ссылок, изображений и HTML, даже с использованием стилей CSS.

Здесь мы создаем текстовый виджет с помощью метода Text.

И мы устанавливаем высоту, то есть количество строк, и ширину, то есть количество символов.

И мы можем применить метод insert, чтобы добавить текст в виджет.

Также мы добавляем полосу прокрутки в наше окно.

С этой целью Tkinter предоставляет метод Scrollbar.

И мы вызываем его с корневым объектом в качестве единственного параметра.

И мы связываем полосу прокрутки с текстовым виджетом с помощью параметра yscrollcommand.







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

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

Диалоги предоставляются подмодулем messagebox в tkinter и его функциями.

Функция askokcancel спрашивает, следует ли продолжить операцию и возвращает истину или ложь.

Функция askquestion задает вопрос.

Функция askretrycancel спрашивает, нужно ли повторить операцию и возвращает истину, если ответ положительный.

Функция askyesno задает вопрос и возвращает истину, если ответ положительный.

Функция askyesnocancel также задает вопрос и возвращает true, если ответ положительный, или None, если он отменен.

Функция showerror показывает сообщение об ошибке.

Функция showinfo показывает информационное сообщение.

Функция showwarning показывает предупреждающее сообщение.







Для чтения из файла или записи в файл Tkinter предоставляет модуль tk

f

ile

d

ialog и его функцию askopenfilename.

А для выбора цвета Tkinter предоставляет всплывающее меню.

Для этого мы должны импортировать модуль colorchooser и использовать метод askColor.







Tkinter представляет возможность создавать раскрывающиеся меню, то есть списки в верхней части окна, которые появляются или раскрываются, если вы нажимаете на такой элемент, как, например, «Файл», «Редактировать» или «Справка».

Меню добавляется в окно с помощью метода config и параметра menu.

Далее метод add_cascade создает новое иерархическое меню, связывая данное меню с родительским меню.

Метод add_command добавляет пункт меню в меню.

При этом параметр command связывает с пунктом меню функцию.







Кнопка меню – это часть раскрывающегося меню, которое постоянно отображается на экране.

И кнопка меню может отображать варианты выбора для этого меню, когда пользователь нажимает на нее.

Здесь параметр relief определяет эффекты затенения границ кнопки.

Метод add_checkbutton добавляет флажок как пункт меню, так как каждая кнопка меню связана с виджетом меню.







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

Tkinter имеет три менеджера компоновки pack, grid и place.

И не разрешено смешивать три менеджера компоновки в одном главном окне!

Менеджеры геометрии выполняют различные функции, такие как расположение виджетов на экране, регистрация виджетов в системе, управление отображением виджетов на экране.

Размещение виджетов на экране включает в себя определение размера и положения компонентов.

Виджеты могут предоставлять информацию о размере и выравнивании менеджерам геометрии, но менеджеры геометрии всегда имеют последнее слово по позиционированию и размеру.

Pack – самый простой в использовании из трех менеджеров геометрии.

Вместо того, чтобы точно объявлять, где должен отображаться виджет на экране дисплея, мы можем объявить позиции виджетов относительно друг друга с помощью команды pack.

Параметр expand команды pack – если установлено значение true, виджет расширяется, чтобы заполнить любое пространство родительского виджета.

Параметр fill определяет, заполняет ли виджет дополнительное пространство, выделенное ему, или сохраняет свои собственные минимальные размеры: NONE (по умолчанию), X (заливка только по горизонтали), Y (заливка только по вертикали) или BOTH (заливка как по горизонтали, так и по вертикали).

Параметр side определяет, какая сторона родительского виджета общая: TOP (по умолчанию), BOTTOM, LEFT или RIGHT.

Параметр padx – внешний отступ по горизонтали.

Параметр pady – внешний отступ по вертикали.

Параметр ipadx – внутренний отступ по горизонтали.

Параметр ipady – внутренний отступ по вертикали.







Компоновка Place позволяет явно установить положение и размер виджета в абсолютном выражении или относительно другого виджета.

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

Параметр anchor метода place позволяет указать привязку виджета, это может быть N, E, S, W, NE, NW, SE или SW, то есть направления по компасу, указывающие углы и стороны виджета, по умолчанию это NW (левый верхний угол).

Параметр bordermode указывает, что другие параметры игнорируют границу родителя или нет.

Параметры height, width указывают высоту и ширину в пикселях.

Параметры x, y указывают смещение по горизонтали и вертикали в пикселях.







Компоновка Grid помещает виджеты в двухмерную таблицу, которая состоит из ряда строк и столбцов.

И положение виджета определяется номером строки и столбца.

То есть этот менеджер геометрии организует виджеты в виде таблицы в родительском виджете.

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

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

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







Виджет Frame работает как контейнер, который отвечает за расположение других виджетов.

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







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

Метод get возвращает кортеж, содержащий текст строк с индексами от первого до последнего включительно.

Если второй аргумент опущен, возвращает текст строки, ближайшей к первой.







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

Модуль tkinter.ttk служит улучшением уже существующего модуля tk.

И модуль Ttk предоставляет 18 виджетов, 12 из которых есть в модуле Tkinter.

Добавленные виджеты – это Combobox, Notebook, Sizegrip, Progressbar, Separator и Treeview.

Здесь мы показываем создание виджета с вкладками.

Виджет ttk.Notebook управляет коллекцией окон и отображает их по одному.

Каждое дочернее окно связано с вкладкой.

И пользователь может выбирать по одной вкладке за раз, чтобы просмотреть содержимое окна.

Назад: Advanced PyQt
Дальше: Kivy