Что такое Tkinter
Tkinter – это пакет для Python, предназначенный для работы с библиотекой Tk. Библиотека Tk содержит компоненты графического интерфейса пользователя (graphical user interface – GUI). Эта библиотека написана на языке программирования Tcl.
Под графическим интерфейсом пользователя (GUI) подразумеваются все те окна, кнопки, текстовые поля для ввода, скроллеры, списки, радиокнопки, флажки и другие элементы, которые вы видите на экране, открывая то или иное приложение. Через них вы взаимодействуете с программой и управляете ею. Все эти элементы интерфейса будем называть виджетами (widgets – штуковины).
В настоящее время почти все приложения, которые создаются для конечного пользователя, имеют GUI. Редкие программы, подразумевающие взаимодействие с человеком, остаются консольными. В предыдущих двух курсах мы писали только консольные программы.
Существует множество библиотек GUI, среди которых Tk не самый популярный инструмент, хотя с его помощью написано немало проектов. Он был выбран для Python по-умолчанию. Установочный файл интерпретатора Питона обычно уже включает пакет tkinter в составе стандартной библиотеки.
Tkinter можно представить как переводчик с языка Python на язык Tcl. Вы пишете программу на Python, а код модуля tkinter переводит ваши инструкции на язык Tcl, который понимает библиотека Tk.
Программы с графическим интерфейсом пользователя событийно-ориентированные. Вы уже должны иметь представление о структурном и желательно объектно-ориентированном программировании. Событийно-ориентированное ориентировано на события. То есть та или иная часть программного кода начинает выполняться лишь тогда, когда случается то или иное событие.
Событийно-ориентированное программирование базируется на объектно-ориентированном. Даже если мы не будем разрабатывать собственные классы, мы обязательно будем пользоваться теми, что есть в tkinter . Все виджеты – это объекты-экземпляры, создаваемые от встроенных классов.
События бывают разными. Сработал временной фактор, завершилась загрузка, пришло сообщение, кто-то кликнул мышкой или нажал Enter , начал вводить текст, переключил радиокнопки, прокрутил страницу вниз и так далее. Когда случается что-либо подобное, то, если был создан обработчик для соответствующего события, происходит выполнение определенной части программы, что приводит к какому-либо результату.
Tkinter импортируется стандартно для модуля Python любым из способов:
- import tkinter
- from tkinter import *
- import tkinter as tk
Можно импортировать отдельные классы, что делается редко. В данном курсе мы будем использовать выражение from tkinter import * .
Если необходимо, узнать установленную версию Tk можно через константу TkVersion:
>>> from tkinter import * >>> TkVersion 8.6
Чтобы написать GUI-программу, надо выполнить приблизительно следующее:
- Создать главное окно.
- Создать виджеты и выполнить конфигурацию их свойств (опций).
- Определить события, то есть то, на что будет реагировать программа.
- Описать обработчики событий, то есть то, как будет реагировать программа.
- Расположить виджеты в главном окне.
- Запустить цикл обработки событий.
Последовательность не обязательно такая, но первый и последний пункты всегда остаются на своих местах. Посмотрим все это в действии.
В современных операционных системах любое пользовательское приложение заключено в окно, которое можно назвать главным, так как в нем располагаются все остальные виджеты. Объект окна верхнего уровня создается от класса Tk модуля tkinter . Переменную, связываемую с объектом, часто называют root (корень):
root = Tk()
Пусть в окне приложения располагаются текстовое поле, метка и кнопка. Данные объекты создаются от классов Entry , Label и Button модуля tkinter . Сразу выполним конфигурацию некоторые их свойства с помощью передачи аргументов конструкторам этих классов:
ent = Entry(root, width=20) but = Button(root, text="Преобразовать") lab = Label(root, width=20, bg='black', fg='white')
Устанавливать свойства объектов не обязательно при их создании. Существуют еще пара способов, с помощью которых это можно сделать после.
Первым аргументом в конструктор виджета передается виджет-хозяин, то есть тот, на котором будет располагаться создаваемый. В случае, когда элементы GUI помещаются непосредственно на главное окно, родителя можно не указывать. То есть в нашем примере мы можем убрать root :
ent = Entry(width=20) but = Button(text="Преобразовать") lab = Label(width=20, bg='black', fg='white')
Однако виджеты не обязательно располагаются на root ‘е. Они могут находиться на других виджетах, и тогда указывать «мастера» необходимо.
Пусть в программе текст, введенный человеком в поле, при нажатии на кнопку разбивается на список слов, слова сортируются по алфавиту и выводятся в метке. Выполняющий все это код надо поместить в функцию:
def str_to_sort_list(event): s = ent.get() s = s.split() s.sort() lab['text'] = ' '.join(s)
У функций, которые вызываются при наступлении события с помощью метода bind , должен быть один параметр. Обычно его называют event , то есть «событие».
В нашей функции с помощью метода get из поля забирается текст, представляющий собой строку. Она преобразуется в список слов с помощью метода split . Потом список сортируется. В конце изменяется свойство text метки. Ему присваивается строка, полученная из списка с помощью строкового метода join .
Теперь необходимо связать вызов функции с событием:
but.bind('', str_to_sort_list)
В данном случае это делается с помощью метода bind . Ему передается событие и функция-обработчик. Событие будет передано в функцию и присвоено параметру event . Здесь событием является щелчок левой кнопкой мыши, что обозначается строкой » .
В любом приложении виджеты не разбросаны по окну как попало, а организованы, интерфейс продуман до мелочей и обычно подчинен определенным стандартам. Пока расположим элементы друг под другом с помощью наиболее простого менеджера геометрии tkinter – метода pack :
ent.pack() but.pack() lab.pack()
Метод mainloop экземпляра Tk запускает главный цикл обработки событий, что в том числе приводит к отображению главного окна со всеми «упакованными» на нем виджетами:
root.mainloop()
Полный код программы:
from tkinter import * def str_to_sort_list(event): s = ent.get() s = s.split() s.sort() lab['text'] = ' '.join(s) root = Tk() ent = Entry(width=20) but = Button(text="Преобразовать") lab = Label(width=20, bg='black', fg='white') but.bind('', str_to_sort_list) ent.pack() but.pack() lab.pack() root.mainloop()
В результате выполнения данного скрипта появляется окно, в текстовое поле которого можно ввести список слов, нажать кнопку и получить его отсортированный вариант:
Попробуем теперь реализовать в нашей программе объектно-ориентированный подход. Это необязательно, но позволяет связать/объединить вместе (вспомните про инкапсуляцию в ООП) виджет и функции, которые обрабатывают связанные с ним события, что концептуально более верно. В этом случае функции становятся методами.
Пусть группа из метки, кнопки и поля представляет собой один объект, порождаемый от класса Block . Тогда в основной ветке программы будет главное окно, объект типа Block и запуск окна. Поскольку блок должен быть привязан к главному окну, то неплохо бы передать в конструктор класса окно-родитель:
from tkinter import * root = Tk() first_block = Block(root) root.mainloop()
Теперь напишем сам класс Block :
class Block: def __init__(self, master): self.ent = Entry(master, width=20) self.but = Button(master, text="Преобразовать") self.lab = Label(master, width=20, bg='black', fg='white') self.but['command'] = self.str_to_sort self.ent.pack() self.but.pack() self.lab.pack() def str_to_sort(self): s = self.ent.get().split() s.sort() self.lab['text'] = ' '.join(s)
Здесь виджеты являются значениями полей объекта типа Block , функция-обработчик события нажатия на кнопку устанавливается не с помощью метода bind , а с помощью свойства кнопки command . В этом случае в вызываемой функции не требуется параметр event . В метод мы передаем только сам объект.
Больший смысл в определении собственного класса появляется, когда требуется несколько или множество похожих объектов-блоков. Допустим, нам нужно несколько блоков, состоящих из метки, кнопки, поля. Причем у кнопки каждой группы будет своя функция-обработчик клика.
Тогда можно передавать значения для свойства command в конструктор. Значение будет представлять собой привязываемую к кнопке функцию-обработчик события. Полный код программы:
from tkinter import * class Block: def __init__(self, master, func): self.ent = Entry(master, width=20) self.but = Button(master, text="Преобразовать") self.lab = Label(master, width=20, bg='black', fg='white') # self.but['command'] = eval('self.' + func) self.but['command'] = getattr(self, func) self.ent.pack() self.but.pack() self.lab.pack() def str_to_sort(self): s = self.ent.get().split() s.sort() self.lab['text'] = ' '.join(s) def str_reverse(self): s = self.ent.get().split() s.reverse() self.lab['text'] = ' '.join(s) root = Tk() first_block = Block(root, 'str_to_sort') second_block = Block(root, 'str_reverse') root.mainloop()
Выражение getattr(self, func) , где вместо func подставляется строка ‘str_to_sort’ или ‘str_reverse’, преобразуется в выражение self.str_to_sort или self.str_reverse .
При выполнения этого кода в окне будут выведены два однотипных блока, кнопки которых выполняют разные действия.

Класс можно сделать более гибким, если жестко не задавать свойства виджетов, а передавать значения как аргументы в конструктор, после чего присваивать их соответствующим опциям при создании объектов.
Практическая работа
Напишите простейший калькулятор, состоящий из двух текстовых полей, куда пользователь вводит числа, и четырех кнопок «+», «-«, «*», «/». Результат вычисления должен отображаться в метке. Если арифметическое действие выполнить невозможно (например, если были введены буквы, а не числа), то в метке должно появляться слово «ошибка».
Курс с примерами решений практических работ: pdf-версия
X Скрыть Наверх
Tkinter. Программирование GUI на Python
Tkinter: кратко для начинающих
Python — один из самых лёгких и популярных языков программирования. С помощью python решается достаточно много проблем — он сможет помочь в почти любой ситуации. Сегодня речь пойдёт о встроенной библиотеке tkinter. С помощью tkinter создаётся уникальный графический интерфейс для приложения на python.
- Загрузка
- Синтаксис
- Компиляция
Tkinter вы можете скачать на официальном сайте или PyPi.

Загрузка
Для начала работы необходимо загрузить tkinter. Как я уже упоминал выше, он встроенный. Но встроен он начиная с версии Python3.
Загрузка для windows:
pip install tkinter pip install --update tkinter
либо на всё том же PyPi выбираете tkinter для Windows, macOS или Linux.
Синтаксис
Теперь надо разобраться с синтаксисом tkinter. Сначала импортируем:
from tkinter import *
Теперь наша задача — сделать окно приложения. Для этого выберем название приложения (у меня это My App). Запишем
from tkinter import * #исходный код if __name__ == '__main__': #выполнение кода до загрузки root = Tk() root.title('My App') #заголовок root.mainloop() #отображение окна
пояснение
Сначала мы импортировали tkinter. После него идёт исходный код — виджеты, текст и тд. После if name == ‘main’ в отступах идёт код, который выполняется до загрузки, тоесть первее чем код в начале (не считая импорт). Сам код, который будет дальше, пишите до. .mainloop() отвечает за отображение окна — оно обязательно должно быть в конце кода. Если вы редактируете 2 окна, нужно ставить не в конец, а в начало кода второго окна (да я «очень хорошо» объясняю)
виджеты и текст
Теперь наша задача — ввести текст. Наше окно пока что пустое. Выглядит оно так:

Чтобы добавить и редактировать текст, нужно использовать виджет Label. Давайте попробуем записать
lbl1 = Label(root, text='Привет') lbl1.grid(column=0, row=0)

Row отвечает за строку, а column за столбец. Правда, у некоторых могут возникнуть проблемы в том, что вторая строка сдвинута. Для этого изменим grid на place
lbl1.place(x=10,y=10)
Нужно всего лишь указать место по x и y. Для удобства можете задать отдельный класс для управления переменными
class wid_prm(): #класс управления переменными x = 10 y1 = 10 y2 = 30 y3 = 50 x_y_z = 410 #. lbl1 = Label(root, text='. ') lbl2 = Label(root, text='. ') #плейсы lbl1.place(x=x,y=y1) lbl2.place(x=x,y=y2)
Думаю, тут всё понятно. Местоположение по x нужно использовать одно, если вы хотите использовать один столбец. Думаю, не стоит тратить время, нужно автоматизировать управление переменными x, y
for auto_prm in range(5): y1 = 10 y1 += 20 y1 -= 10 y1 -= 10 if y1 == 30: #останавливаем процесс y1 = 30 else: y2 = y1 + 20 y3 = y1 + 40 y4 = y1 + 60 y5,y6,y7,y8 = y1 * 2 + (y1 * 4) y990 = 4 if y990 > 1: x = 10 else: x = 5
А для чего это? Это для того, чтобы задать переменные автоматически. Просто скопируйте и вставьте эту часть кода в свой код.
Давайте теперь сделаем шрифт жирным в Label
lbl1 = Label(root,text='. ',font=("Times New Roman",21,"bold"))
Вы, наверное, уже поняли, что за шрифт отвечает функция font. «bold» можете убрать, если вы не хотите жирный шрифт текста. 21 — размер текста в пикселях/мм.
Теперь попробуем использовать виджет Button — добавим кнопку
btn1 = Button(root, text='Не нажимай', command=clicked) btn1.place(x=x_x,y=y1_y) def clicked(): print('Я же сказал. ')
При нажатии на кнопку будет писать определённый текст по команде clicked. Вы можете дать любое название и любое содержимое команды.
Получается, что полный код пока-что выглядит так:
from tkinter import * #импорт #исходный код class wid_prm(): #класс управления переменными x = 10 y1 = 10 y2 = 30 y3 = 50 x_y_z = 410 for auto_prm in range(5): y1 = 10 y1 += 20 y1 -= 10 y1 -= 10 if y1 == 30: #останавливаем процесс y1 = 30 else: y2 = y1 + 20 y3 = y1 + 40 y4 = y1 + 60 y5,y6,y7,y8 = y1 * 2 + (y1 * 4) y990 = 4 if y990 > 1: x = 10 else: x = 5 class prm_x_y(): x_x = 10 y1_y = 50 lbl1 = Label(root, text='. ') btn1 = Label(root, text='Не нажимай', command=clicked) def clicked(): print('Я же сказал. ') #плейсы lbl1.place(x=x,y=y1) btn1.place(x=x_x,y=y1_y) if __name__ == '__main__': root = Tk() root.title('My App') root.geometry('400x400') root.mainloop()
Виджет messagebox
Виджет messagebox позволяет создать отдельное окно с информацией. Давайте попробуем
from tkinter import * from tkinter import messagebox messagebox.showinfo('Заголовок', 'текст')

Это довольно круто для дополнительных виджетов.
Я, наверное, с синтаксисом закончу.
Компиляция
Первым делом нужно установить приложение auto-py-to-exe. Вы его можете установить либо с того же PyPi, либо через командную строку:
pip install auto-py-to-exe pip install --update auto-py-to-exe
Вы скачаете приложение auto-py-to-exe от python. Вот как оно выглядит:

В script location указываете путь к файлу. Вот небольшой пример:
>Path to file: >\Users\username\Desktop\file.py
Дальше всё просто. Укажите One File, если не хотите, чтобы файлы приложения засоряли ваш пк. Если хотите скрыть консоль (и оставить только окно tkinter), выберите Window Based.
Загрузите иконку приложения в Icon. И наконец-то нажимаете CONVERT .PY TO .EXE. Думаю, с последующим вы сами справитесь — в консоль будет выводиться всякая всячина, и в итоге вы успешно сконвертируете приложение на tkinter.
В этом посте я рассказал базу синтаксиса tkinter. Да, виджетов в ткинтере в разы больше, я могу их подробно расписать в следующей статье если вы захотите.
Tkinter
Tkinter — это кроссплатформенный графический интерфейс Python, позволяющий работать с библиотекой Tk. Он содержит элементы графического интерфейса пользователя (GUI — Graphical User Interface), с помощью которых можно создавать различные приложения. Изначально Tkinter был разработан в 1988 году профессором математических наук в университете Беркли Джоном Остерхаутом для собственного языка программирования Tcl. Однако впоследствии он был адаптирован для многих других ЯП, таких как Ruby, Perl и т.д. С 1994 года этот программный пакет входит в стандартный дистрибутив языка программирования Python.

Освойте профессию
«Fullstack-разработчик на Python»
Fullstack-разработчик на Python
Fullstack-разработчики могут в одиночку сделать IT-проект от архитектуры до интерфейса. Их навыки востребованы у работодателей, особенно в стартапах. Научитесь программировать на Python и JavaScript и создавайте сервисы с нуля.

Профессия / 12 месяцев
Fullstack-разработчик на Python
Создавайте веб-проекты самостоятельно

Что такое Tkinter и для чего он нужен
В большинстве пользовательских приложений, которыми мы пользуемся на мобильных и десктопных устройствах, используется графический интерфейс пользователя. Это система интерактивных элементов, обеспечивающих взаимодействие человека с программой. Чтобы программа выполнила нужное вам действие, не нужно вводить соответствующую команду в строку — достаточно кликнуть или коснуться пальцем виртуальной кнопки, поставить флажок или галочку, перетащить ползунок и т.д. Этим программы с графическим интерфейсом отличаются от консольных приложений, в которых любую команду нужно вбивать текстом в командную строку. Преимущества GUI очевидны:
- управлять приложением с помощью интерактивных элементов проще, чем вводить каждую команду текстом;
- графический интерфейс интуитивно понятен — даже пользователь, впервые открывший приложение или не знающий языка, сможет разобраться хотя бы в основном функционале.
Очевидно, что любой визуальный интерактивный элемент — не просто картинка. Изображение должно быть сопряжено с программной частью приложения, чтобы обеспечивать взаимодействие пользователя с функциями программы. Только в этом случае совокупность визуальных интерактивных элементов образует пользовательский интерфейс. Для этой цели и предназначены различные библиотеки и GUI-фреймворки, одним из которых является Tkinter.
По сути, программный пакет представляет собой интерпретатор, переводящий код приложений с Python на Tcl — высокоуровневый скриптовый язык, который используется в быстром прототипировании, создании графических интерфейсов, веб-разработке. Программист пишет приложение на Python, а встроенный модуль Tkinter автоматически переводит его на Tcl.
В Tkinter реализовано событийно-ориентированное и объектно-ориентированное программирование.
- Та или иная часть программного кода начинает работать тогда, когда случилось определенное событие — в данном случае это либо действия пользователя в приложении, такие как клики или нажатия на кнопки, внесение данных в онлайн-форму, прокручивание и т.д., либо события, заложенные в самой программе, например завершение загрузки, срабатывание таймера.
- Интерфейс приложения представляет собой взаимодействующие друг с другом и пользователем элементы (виджеты), каждый из которых является объектом-экземпляром, создаваемым от встроенных классов.
Tkinter позволяет создать полноценный работающий интерфейс пользователя мобильного или десктопного приложения с помощью уже встроенных в программный пакет классов и наследующих им объектов. Это довольно универсальный инструмент, у которого есть свои преимущества и недостатки, определяющие сферу его применения.
Станьте Fullstack-разработчик на Python и найдите стабильную работу
на удаленке
Возможности Tkinter
Работа в этом графическом пакете организована вокруг набора визуальных интерактивных элементов управления — виджетов. Именно их совокупность образует пользовательский интерфейс приложения. В Tkinter представлена большая палитра виджетов — перечислим некоторые из них.
- Toplevel/Tk (окно верхнего уровня) — корневой виджет, в котором группируются все остальные, визуальная оболочка интерфейса.
- Frame (рамка) — с помощью этого виджета осуществляется группировка других элементов в пределах общей визуальной оболочки.
- Button (кнопка) — простейший элемент, клик на который вызывает определенное изменение (открытие нового окна, загрузку элемента и т.д.).
- Label (этикетка) — виджет, показывающий некоторый текст и/или изображение.
- Canvas (холст) — элемент, используемый для вывода простейших графических фигур, таких как стрелки, многоугольники, круги, линии. Также с его помощью отображаются тексты, окна и изображения.
- Text (текст) — виджет в виде поля, в котором можно вводить, редактировать и форматировать текст с использованием различных стилей, а также внедрять в него окна и изображения.
- Scale (шкала) — ползунок, с помощью которого можно плавно выбрать определенное числовое значение (например, стоимость товара или яркость изображения).
В Tkinter есть виджеты всплывающих и ниспадающих меню, списка с возможностью выбора, сообщений, полосы прокрутки и т.д.
У каждого виджета есть настраиваемые параметры, позволяющие придать элементу определенный вид и поведение. Как правило, они задаются через конструктор. Например, у элемента Button (кнопка) таким параметром будет text, который отвечает за текст, отображающийся на кнопке. Также с помощью параметров можно настроить форму, размер, цвет, отображение курсора мыши при наведении на элемент и другие характеристики.
Хотя результат работы в Tkinter представляет собой интерактивный визуальный интерфейс пользователя, само программирование осуществляется текстовым способом. Программист придает виджетам-экземплярам определенные значения, которые затем преобразуются в визуальные и функциональные характеристики элементов.
Достоинства Tkinter
Уже сразу после своего создания инструмент стал достаточно популярным среди разработчиков программных интерфейсов мобильных и декстоп-приложений. Особенно после того, как был включен в стандартный дистрибутив Python.
- Функциональность. Tkinter предоставляет достаточно широкий встроенный набор интерактивных элементов и их атрибутов, который позволяет создавать полноценный работающий интерфейс пользователя. Кроме того, он позволяет использовать внешние подключаемые модули, которые расширяют возможности пользователя за счет дополнительных элементов и их параметров.
- Кроссплатформенность. Приложения, созданные с помощью Tkinter, могут работать на любой распространенной платформе (Windows, Linux, MacOS). Это обусловлено тем, что Tkinter написан на высокоуровневом языке Tcl, который слабо привязан к техническим аспектам конкретной операционной системы или процессора. Кроссплатформенность Tkinter потенциально позволяет разработчику охватить максимальную аудиторию для продвижения своего продукта.
- Простота. Библиотека Tkinter проста и удобна в установке, настройке и использовании, чему способствует и ограниченный набор возможностей. Это отличный инструмент для новичков, желающих начать первые шаги в создании пользовательских интерфейсов. С помощью Tkinter они могут понять базовые принципы функционирования GUI, научиться создавать простейшие приложения, чтобы затем перейти к использованию более мощных профессиональных инструментов.
- Широкая поддержка. Вокруг Tkinter сформировалось достаточно большое сообщество профессиональных разработчиков и энтузиастов-любителей. Благодаря им библиотека имеет большой объем документации, различных инструкций, примеров созданных приложений, разборов ошибок и проблем — все это помогает пользователям быстро освоить данный инструмент.
- Включение в стандартный дистрибутив Python. С 1994 года Tkinter по умолчанию устанавливается вместе с инсталляционным пакетом Python. Это позволяет не искать и скачивать библиотеку отдельно, а быстро импортировать ее и начать работать.
- Свободное использование. Tkinter распространяется под Python-лицензией, то есть является свободным программным обеспечением. Это значит, что с ее помощью можно создавать, распространять, копировать и изменять как бесплатные (любительские), так и коммерческие приложения. Это существенно расширяет ее применение и одновременно снижает порог вхождения со стороны новичков.
Недостатки Tkinter
Несмотря на свою популярность, эта библиотека часто пользуется не слишком высокой репутацией среди профессиональных разработчиков из-за присущих ей недостатков. Причем часть из них являются обратной стороной достоинств — перечислим наиболее значимые из них.
- Устаревший интерфейс. Установленные по умолчанию оболочка среды разработки этой программной библиотеки и встроенные виджеты для сегодняшнего времени выглядят явно архаичными. Хотя есть возможность улучшить их вид с помощью настраиваемых тем и стилей.
- Ограниченный функционал. Tkinter предлагает пользователю ограниченный набор базовых виджетов и их параметров. С одной стороны, это упрощает работу с библиотекой, особенно для новичков, с другой — не затрудняет создание сложных и разнообразных интерфейсов. Частично этот недостаток компенсируется подключаемыми модулями, расширяющими функционал библиотеки.
- Ограниченная производительность. Скорости работы Thinker вполне хватает для разработки небольших и средним проектов. Но при создании сложных приложений с высокой частотой обновлений производительность данного инструмента существенно снижается, а также уменьшается надежность самих интерфейсов. Это не позволяет масштабировать проекты, разработанные с помощью этой графической библиотеки.
- Ошибки переносимости. Tkinter является кроссплатформенной библиотекой, то есть созданные с ее помощью программы на Python должны одинаково хорошо работать на разных платформах. На практике же многие пользователи сталкиваются с тем, что интерфейс, созданный для одной платформе, на другой отображается с большими искажениями.
Из-за недостатков у Tkinter существует множество более современных и функциональных альтернатив — в частности, PyQt. Инструмент выгодно отличается более высокой производительностью и надежностью, подробным и широким функционалом, современным дизайном интерфейса и другими преимуществами.
Где и кем используется Tkinter
Несмотря на недостатки, инструмент продолжает широко использоваться в разработке программ с графическим интерфейсом. Однако сфера применения ограничена в основном небольшими и средними проектами, так как в работе над масштабными программами эффективность сильно падает.
Чаще всего Tkinter используется как инструмент обучения разработке графических интерфейсов новичками, делающими первые шаги в этом направлении. Благодаря простоте и лаконичности библиотека действительно позволяет быстро освоить основные принципы создания GUI, научиться работать с интерактивными элементами, понять механику эффективного взаимодействия между человеком и программой. С помощью Tkinter можно создавать интерфейсы приложений различных типов, например:
- вспомогательных программ — установщиков приложений, несложных фоторедакторов, калькуляторов, утилит для чистки компьютера, виджетов погоды и т.д.;
- различных электронных справочников, словарей, энциклопедий, учебников, программ для обучения иностранным языкам;
- несложных десктопных и мобильных игр — особенно квестов, пошаговых стратегий, в которых не требуется высокое качество анимации и сложные визуальные эффекты.
Кроме того, с помощью Tkinter можно создавать интерактивные интерфейсы веб-приложений и сайтов любой сложности, от простых лендингов до социальных сетей, информационных порталов и интернет-магазинов.
Также Tkinter используется в прототипировании и тестировании интерфейсов приложений. С его помощью можно быстро создавать рабочие «эскизы» (макеты) будущих приложений, чтобы с минимальными издержками отработать на них основные механики, выявить ошибочные и правильные решения, возможные программные баги и т.д. А затем на основе полученных данных разработать полноценный интерфейс.
Таким образом, несмотря на ограниченную функциональность, устаревший интерфейс и другие недостатки, Tkinter продолжает широко использоваться как программистами-любителями, так и профессиональными разработчиками. Хотя у него есть более функциональные и современные аналоги, этот графический пакет хорошо подходит для быстрой разработки несложных приложений, веб-страниц и прототипов.
tkinter — Інтерфейс Python до Tcl/Tk¶
Пакет tkinter («інтерфейс Tk») є стандартним інтерфейсом Python до інструментарію GUI Tcl/Tk. І Tk, і tkinter доступні на більшості платформ Unix, включаючи macOS, а також у системах Windows.
Запуск python -m tkinter з командного рядка має відкрити вікно, яке демонструє простий інтерфейс Tk, повідомляючи, що tkinter правильно встановлено у вашій системі, а також показує, яка версія Tcl/Tk встановлено, тому ви можете прочитати документацію Tcl/Tk, що стосується цієї версії.
Tkinter підтримує низку версій Tcl/Tk, створених із підтримкою потоків або без неї. Офіційний двійковий випуск Python включає в себе Tcl/Tk 8.6. Перегляньте вихідний код для модуля _tkinter , щоб дізнатися більше про підтримувані версії.
Tkinter не є тонкою обгорткою, але додає достатню кількість власної логіки, щоб зробити досвід більш пітонічним. Ця документація зосереджуватиметься на цих доповненнях і змінах, а подробиці, які не змінилися, див. в офіційній документації Tcl/Tk.
Tcl/Tk 8.5 (2007) представив сучасний набір тематичних компонентів інтерфейсу користувача разом із новим API для їх використання. І старі, і нові API все ще доступні. Більшість документації, яку ви знайдете в Інтернеті, все ще використовує старий API і може бути дуже застарілим.
- TkDocs Розширений підручник зі створення інтерфейсів користувача за допомогою Tkinter. Пояснює ключові концепції та ілюструє рекомендовані підходи за допомогою сучасного API.
- Довідник Tkinter 8.5: графічний інтерфейс для Python Довідкова документація для Tkinter 8.5 із детальним описом доступних класів, методів і параметрів.
- Tk команди Вичерпне посилання на кожну з базових команд Tcl/Tk, що використовуються Tkinter.
- Домашня сторінка Tcl/Tk Додаткова документація та посилання на розробку ядра Tcl/Tk.
- Сучасний Tkinter для зайнятих розробників Python Автор: Марк Розман. (ISBN 978-1999149567)
- Програмування на Python і Tkinter Автор: Алан Мур. (ISBN 978-1788835886)
- Programming Python Марк Лутц; має чудове покриття Tkinter. (ISBN 978-0596158101)
- Tcl і Tk Toolkit (2-е видання) Джон Остерхаут, винахідник Tcl/Tk, і Кен Джонс; не охоплює Tkinter. (ISBN 978-0321336330)
Архітектура¶
Tcl/Tk не є окремою бібліотекою, а складається з кількох окремих модулів, кожен з яких має окремі функції та власну офіційну документацію. Двійкові випуски Python також постачають додатковий модуль разом із ним.
Tcl — це динамічна інтерпретована мова програмування, як і Python. Хоча його можна використовувати самостійно як мову програмування загального призначення, найчастіше його вбудовують у додатки C як механізм сценаріїв або інтерфейс до набору інструментів Tk. Бібліотека Tcl має інтерфейс C для створення та керування одним або декількома екземплярами інтерпретатора Tcl, запуску команд і сценаріїв Tcl у цих екземплярах і додавання спеціальних команд, реалізованих у Tcl або C. Кожен інтерпретатор має чергу подій, а також є засоби для надсилання до нього подій та їх обробки. На відміну від Python, модель виконання Tcl розроблена навколо кооперативної багатозадачності, і Tkinter усуває цю різницю (докладніше див. Модель потоків).
Tk is a Tcl package implemented in C that adds custom commands to create and manipulate GUI widgets. Each Tk object embeds its own Tcl interpreter instance with Tk loaded into it. Tk’s widgets are very customizable, though at the cost of a dated appearance. Tk uses Tcl’s event queue to generate and process GUI events.
Тематичний Tk (Ttk) — це новіша сімейство віджетів Tk, які забезпечують набагато кращий вигляд на різних платформах, ніж багато класичних віджетів Tk. Ttk поширюється як частина Tk, починаючи з Tk версії 8.5. Прив’язки Python надаються в окремому модулі, tkinter.ttk .
Внутрішньо Tk і Ttk використовують засоби базової операційної системи, тобто Xlib на Unix/X11, Cocoa на macOS, GDI на Windows.
Коли ваша програма Python використовує клас у Tkinter, наприклад, для створення віджета, модуль tkinter спочатку збирає рядок команди Tcl/Tk. Він передає цей командний рядок Tcl до внутрішнього двійкового модуля _tkinter , який потім викликає інтерпретатор Tcl для його оцінки. Потім інтерпретатор Tcl звернеться до пакетів Tk та/або Ttk, які, у свою чергу, звернуться до Xlib, Cocoa або GDI.
Модулі Tkinter¶
Підтримка Tkinter розподілена на кілька модулів. Для більшості програм знадобиться головний модуль tkinter , а також модуль tkinter.ttk , який надає сучасний тематичний набір віджетів і API:
from tkinter import * from tkinter import ttk
class tkinter. Tk ( screenName = None , baseName = None , className = ‘Tk’ , useTk = True , sync = False , use = None ) ¶
Створіть віджет Tk верхнього рівня, який зазвичай є головним вікном програми, та ініціалізуйте інтерпретатор Tcl для цього віджета. Кожен екземпляр має власний асоційований інтерпретатор Tcl.
Клас Tk зазвичай створюється з використанням усіх значень за замовчуванням. Однак наразі розпізнаються такі аргументи ключових слів:
Якщо задано (у вигляді рядка), установлює змінну середовища DISPLAY . (лише X11)
Ім’я файлу профілю. За замовчуванням baseName походить від назви програми ( sys.argv[0] ).
Назва класу віджетів. Використовується як файл профілю, а також як ім’я, з яким викликається Tcl (argv0 у interp).
Якщо True , ініціалізувати підсистему Tk. Функція tkinter.Tcl() встановлює значення False .
Якщо True , виконувати всі команди X-сервера синхронно, щоб повідомляти про помилки негайно. Можна використовувати для налагодження. (лише X11)
Визначає id вікна, у яке потрібно вставити програму, замість того, щоб воно створювалося як незалежне вікно верхнього рівня. id потрібно вказати так само, як значення параметра -use для віджетів верхнього рівня (тобто воно має форму, подібну до тієї, яку повертає winfo_id() ).
Зауважте, що на деяких платформах це працюватиме належним чином, лише якщо id посилається на фрейм Tk або верхній рівень, для якого ввімкнено параметр -container.
Tk reads and interprets profile files, named . className .tcl and . baseName .tcl , into the Tcl interpreter and calls exec() on the contents of . className .py and . baseName .py . The path for the profile files is the HOME environment variable or, if that isn’t defined, then os.curdir .
Об’єкт програми Tk, створений шляхом створення екземпляра Tk . Це забезпечує доступ до інтерпретатора Tcl. Кожен віджет, до якого приєднано той самий екземпляр Tk , має однакове значення для свого атрибута tk .
Об’єкт віджета, який містить цей віджет. Для Tk , master є None , оскільки це головне вікно. Терміни master і parent подібні та іноді використовуються як взаємозамінні назви аргументів; однак виклик winfo_parent() повертає рядок назви віджета, тоді як master повертає об’єкт. parent/child відображає деревоподібний зв’язок, тоді як master/slave відображає структуру контейнера.
Безпосередні нащадки цього віджета як dict з іменами дочірніх віджетів як ключі та дочірні об’єкти екземплярів як значення.
tkinter. Tcl ( screenName = None , baseName = None , className = ‘Tk’ , useTk = False ) ¶
Функція Tcl() є фабричною функцією, яка створює об’єкт, подібний до створеного класом Tk , за винятком того, що вона не ініціалізує підсистему Tk. Це найчастіше корисно, коли керуєте інтерпретатором Tcl у середовищі, де не потрібно створювати сторонні вікна верхнього рівня або де це неможливо (наприклад, системи Unix/Linux без X-сервера). Для об’єкта, створеного об’єктом Tcl() , можна створити вікно верхнього рівня (та ініціалізувати підсистему Tk), викликавши його метод loadtk() .
Модулі, які забезпечують підтримку Tk, включають:
Головний модуль Tkinter.
Діалогове вікно, у якому користувач може вибрати колір.
Базовий клас для діалогових вікон, визначених в інших модулях, перелічених тут.
Загальні діалоги, які дозволяють користувачеві вказати файл для відкриття або збереження.
Утиліти для допомоги в роботі зі шрифтами.
Доступ до стандартних діалогових вікон Tk.
Текстовий віджет із вбудованою вертикальною смугою прокручування.
Основні діалоги та функції зручності.
Тематичний набір віджетів, представлений у Tk 8.5, надає сучасні альтернативи для багатьох класичних віджетів у головному модулі tkinter .
Двійковий модуль, який містить низькорівневий інтерфейс для Tcl/Tk. Він автоматично імпортується головним модулем tkinter і ніколи не повинен використовуватися безпосередньо програмістами додатків. Зазвичай це спільна бібліотека (або DLL), але в деяких випадках може бути статично пов’язана з інтерпретатором Python.
Інтегроване середовище розробки та навчання Python (IDLE). На основі tkinter .
Символічні константи, які можна використовувати замість рядків під час передачі різних параметрів викликам Tkinter. Автоматично імпортується основним модулем tkinter .
(експериментальний) Підтримка перетягування для tkinter . Це стане застарілим, коли його буде замінено на Tk DND.
(застаріло) Старіший сторонній пакет Tcl/Tk, який додає кілька нових віджетів. Кращі альтернативи для більшості можна знайти в tkinter.ttk .
Графіка Turtle у вікні Tk.
Tkinter Life Preserver¶
Цей розділ не призначений для вичерпного підручника з Tk або Tkinter. Для цього зверніться до одного із зовнішніх ресурсів, згаданих раніше. Натомість цей розділ надає дуже швидку орієнтацію щодо того, як виглядає програма Tkinter, визначає основні концепції Tk і пояснює, як структурована оболонка Tkinter.
Решта цього розділу допоможе вам визначити класи, методи та параметри, які вам знадобляться у вашій програмі Tkinter, і де знайти більш детальну документацію щодо них, у тому числі в офіційному довідковому посібнику Tcl/Tk.
Програма «Привіт, світ».¶
Ми почнемо з огляду програми «Hello World» у Tkinter. Це не найменше, що ми можемо написати, але достатньо, щоб проілюструвати деякі ключові поняття, які вам потрібно знати.
from tkinter import * from tkinter import ttk root = Tk() frm = ttk.Frame(root, padding=10) frm.grid() ttk.Label(frm, text="Hello World!").grid(column=0, row=0) ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0) root.mainloop()
Після імпорту в наступному рядку створюється екземпляр класу Tk , який ініціалізує Tk і створює пов’язаний з ним інтерпретатор Tcl. Він також створює вікно верхнього рівня, відоме як кореневе вікно, яке служить головним вікном програми.
Наступний рядок створює рамковий віджет, який у цьому випадку міститиме мітку та кнопку, яку ми створимо далі. Рама встановлюється всередині вікна.
Наступний рядок створює віджет мітки, що містить статичний текстовий рядок. Метод grid() використовується для вказівки відносного розташування (положення) мітки всередині віджета кадру, що містить її, подібно до того, як працюють таблиці в HTML.
Потім створюється віджет кнопки, який розміщується праворуч від мітки. При натисканні викличе метод destroy() кореневого вікна.
Нарешті, метод mainloop() виводить все на дисплей і реагує на введення користувача, доки програма не завершить роботу.
Важливі поняття Tk¶
Навіть ця проста програма ілюструє такі ключові концепції Tk:
Інтерфейс користувача Tkinter складається з окремих віджетів. Кожен віджет представлено як об’єкт Python, створений із таких класів, як ttk.Frame , ttk.Label і ttk.Button .
Віджети впорядковані в ієрархію. Мітка та кнопка містилися у фреймі, який, у свою чергу, містився в кореневому вікні. Під час створення кожного дочірнього віджета його батьківський віджет передається як перший аргумент конструктору віджетів.
Віджети мають параметри конфігурації, які змінюють їхній зовнішній вигляд і поведінку, наприклад текст для відображення в мітці або кнопці. Різні класи віджетів матимуть різні набори параметрів.
Віджети не додаються автоматично до інтерфейсу користувача під час їх створення. Менеджер геометрії, як-от grid , контролює, де в інтерфейсі користувача вони розміщені.
Tkinter реагує на введення користувача, зміни вашої програми та навіть оновлює дисплей лише під час активного запуску циклу подій. Якщо ваша програма не запускає цикл подій, ваш інтерфейс користувача не оновлюватиметься.
Розуміння того, як Tkinter обертає Tcl/Tk¶
When your application uses Tkinter’s classes and methods, internally Tkinter is assembling strings representing Tcl/Tk commands, and executing those commands in the Tcl interpreter attached to your application’s Tk instance.
Незалежно від того, чи це спроба навігації по довідковій документації, спроба знайти правильний метод або параметр, адаптація деякого існуючого коду або налагодження вашої програми Tkinter, іноді буде корисно зрозуміти, як виглядають ці основні команди Tcl/Tk.
Для ілюстрації, ось еквівалент Tcl/Tk основної частини сценарію Tkinter вище.
ttk::frame .frm -padding 10 grid .frm grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0 grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
Синтаксис Tcl подібний до багатьох мов оболонки, де першим словом є команда, яка має бути виконана, а аргументи цієї команди йдуть за нею, розділені пробілами. Не вдаючись у подробиці, зауважте наступне:
- Команди, які використовуються для створення віджетів (наприклад, ttk::frame ), відповідають класам віджетів у Tkinter.
- Параметри віджета Tcl (наприклад, -text ) відповідають аргументам ключових слів у Tkinter.
- Віджети посилаються за шляхом у Tcl (наприклад, .frm.btn ), тоді як Tkinter використовує не імена, а посилання на об’єкти.
- Місце віджета в ієрархії віджетів закодовано в його (ієрархічному) шляху, який використовує . (точку) як роздільник шляху. Ім’я шляху для кореневого вікна — це просто . (крапка). У Tkinter ієрархія визначається не шляхом, а вказівкою батьківського віджета під час створення кожного дочірнього віджета.
- Операції, які реалізовані як окремі команди в Tcl (наприклад, grid або destroy ), представлені як методи в об’єктах віджетів Tkinter. Як ви незабаром побачите, в інших випадках Tcl використовує те, що здається викликами методів для об’єктів віджетів, які більш точно відображають те, що використовується в Tkinter.
Як мені…? Який варіант робить…?¶
Якщо ви не впевнені, як щось зробити в Tkinter, і не можете відразу знайти це в підручнику чи довідковій документації, яку використовуєте, є кілька стратегій, які можуть бути корисними.
По-перше, пам’ятайте, що деталі роботи окремих віджетів можуть відрізнятися в різних версіях як Tkinter, так і Tcl/Tk. Якщо ви шукаєте документацію, переконайтеся, що вона відповідає версіям Python і Tcl/Tk, встановленим у вашій системі.
Коли ви шукаєте, як використовувати API, корисно знати точну назву класу, опції або методу, який ви використовуєте. Самоаналіз в інтерактивній оболонці Python або за допомогою print() може допомогти вам визначити, що вам потрібно.
Щоб дізнатися, які параметри конфігурації доступні для будь-якого віджета, викличте його метод configure() , який повертає словник, що містить різноманітну інформацію про кожен об’єкт, включаючи його типові та поточні значення. Використовуйте keys() , щоб отримати лише назви кожного параметра.
btn = ttk.Button(frm, . ) print(btn.configure().keys())
Оскільки більшість віджетів мають багато спільних параметрів конфігурації, може бути корисно дізнатися, які є специфічними для певного класу віджетів. Порівняння списку опцій зі списком простіших віджетів, як-от рамка, є одним із способів зробити це.
print(set(btn.configure().keys()) - set(frm.configure().keys()))
Так само ви можете знайти доступні методи для об’єкта віджета за допомогою стандартної функції dir() . Якщо ви спробуєте це, ви побачите, що існує понад 200 поширених методів віджетів, тому знову ж таки буде корисно визначити ті, які є специфічними для класу віджетів.
print(dir(btn)) print(set(dir(btn)) - set(dir(frm)))
Навігація довідковим посібником Tcl/Tk¶
Як зазначалося, офіційний довідковий посібник Tk commands (сторінки довідок) часто є найточнішим описом того, що виконують конкретні операції з віджетами. Навіть якщо ви знаєте назву потрібного вам параметра або методу, у вас все одно може бути кілька місць, де слід шукати.
Хоча всі операції в Tkinter реалізовані як виклики методів для об’єктів віджетів, ви бачили, що багато операцій Tcl/Tk відображаються як команди, які приймають шлях до віджета як свій перший параметр, за яким слідують додаткові параметри, напр.
destroy . grid .frm.btn -column 0 -row 0
Інші, однак, більше схожі на методи, викликані об’єктом віджета (насправді, коли ви створюєте віджет у Tcl/Tk, він створює команду Tcl з іменем шляху до віджета, причому першим параметром цієї команди є ім’я методу для виклику).
.frm.btn invoke .frm.lbl configure -text "Goodbye"
В офіційній довідковій документації Tcl/Tk ви знайдете більшість операцій, які виглядають як виклики методів на сторінці довідки для певного віджета (наприклад, ви знайдете метод invoke() на кнопці ttk::button). сторінка довідки), тоді як функції, які приймають віджет як параметр, часто мають власну сторінку довідки (наприклад, grid).
Ви знайдете багато поширених параметрів і методів на сторінках довідки options або ttk::widget, а інші можна знайти на сторінці довідки для певного класу віджетів.
Ви також побачите, що багато методів Tkinter мають складені імена, наприклад, winfo_x() , winfo_height() , winfo_viewable() . Ви знайдете документацію для всього цього на сторінці довідки winfo.
Дещо збентежує те, що у всіх віджетах Tkinter також є методи, які фактично не працюють з віджетом, а працюють у глобальному масштабі, незалежно від будь-якого віджета. Прикладами є методи доступу до буфера обміну або системного дзвінка. (Вони реалізовані як методи в базовому класі Widget , від якого успадковуються всі віджети Tkinter).
Модель різьблення¶
Python і Tcl/Tk мають дуже різні моделі потоків, які tkinter намагається поєднати. Якщо ви використовуєте потоки, вам, можливо, потрібно це знати.
Інтерпретатор Python може мати багато потоків, пов’язаних із ним. У Tcl можна створити кілька потоків, але кожен потік має окремий екземпляр інтерпретатора Tcl, пов’язаний з ним. Потоки також можуть створювати більше одного екземпляра інтерпретатора, хоча кожен екземпляр інтерпретатора може використовуватися лише тим потоком, який його створив.
Кожен об’єкт Tk , створений tkinter , містить інтерпретатор Tcl. Він також відстежує, який потік створив цей інтерпретатор. Виклики tkinter можна здійснювати з будь-якого потоку Python. Внутрішньо, якщо виклик надходить з потоку, відмінного від того, який створив об’єкт Tk , подія публікується в черзі подій інтерпретатора, і після виконання результат повертається до викликаного потоку Python.
Програми Tcl/Tk зазвичай керуються подіями, тобто після ініціалізації інтерпретатор запускає цикл подій (тобто Tk.mainloop() ) і відповідає на події. Оскільки він однопотоковий, обробники подій повинні реагувати швидко, інакше вони заблокують обробку інших подій. Щоб уникнути цього, будь-які тривалі обчислення не повинні виконуватися в обробнику подій, а розбиваються на менші частини за допомогою таймерів або виконуються в іншому потоці. Це відрізняється від багатьох наборів інструментів графічного інтерфейсу, де графічний інтерфейс працює в повністю окремому потоці від усього коду програми, включаючи обробники подій.
Якщо інтерпретатор Tcl не запускає цикл подій і не обробляє події, будь-які виклики tkinter , здійснені з потоків, відмінних від того, що запускає інтерпретатор Tcl, не вдасться.
Існує ряд особливих випадків:
- Бібліотеки Tcl/Tk можна створити таким чином, щоб вони не розпізнавали потоки. У цьому випадку tkinter викликає бібліотеку з початкового потоку Python, навіть якщо він відрізняється від потоку, який створив інтерпретатор Tcl. Глобальне блокування забезпечує лише один виклик за один раз.
- У той час як tkinter дозволяє створювати більше ніж один екземпляр об’єкта Tk (з власним інтерпретатором), усі інтерпретатори, які є частиною одного потоку, спільно використовують спільну чергу подій, яка швидко стає жахливою . На практиці не створюйте більше одного екземпляра Tk одночасно. В іншому випадку найкраще створити їх в окремих потоках і переконатися, що ви використовуєте збірку Tcl/Tk з підтримкою потоків.
- Блокування обробників подій — не єдиний спосіб запобігти повторному входу інтерпретатора Tcl у цикл подій. Можна навіть запустити кілька вкладених циклів подій або повністю відмовитися від циклу подій. Якщо ви робите щось складне, коли йдеться про події чи ланцюжки, пам’ятайте про ці можливості.
- Є кілька вибраних функцій tkinter , які зараз працюють лише тоді, коли викликаються з потоку, який створив інтерпретатор Tcl.
Зручний довідник¶
Параметри налаштування¶
Параметри контролюють такі речі, як колір і ширина рамки віджета. Параметри можна встановити трьома способами:
Під час створення об’єкта, використовуючи ключові аргументи
fred = Button(self, fg="red", bg="blue")
