В большинстве проектов язык Python используется для создания консольных приложений, в которых не требуется взаимодействие с пользователями через оконный интерфейс. Однако, иногда такая потребность возникает и сегодня мы рассмотрим Tkinter — пакет Python для создания GUI‑приложений.
В Python есть множество GUI‑фреймворков, но Tkinter — единственный фреймворк, встроенный в стандартную библиотеку Python. У Tkinter есть несколько сильных сторон: он кроссплатформенный, поэтому один и тот же код работает в Windows, macOS и Linux.
Tkinter легок и относительно прост в использовании по сравнению с другими фреймворками. Это делает его хорошим выбором для создания GUI‑приложений на Python, особенно для приложений, где современный блеск не нужен, а главным приоритетом является быстрое создание функционального и кроссплатформенного продукта.
Tkinter можно использовать для создания оконных и диалоговых приложений, которые позволяют пользователям взаимодействовать с вашей программой. Они могут использоваться для отображения информации, сбора данных или предоставления пользователю опций. Tkinter можно использовать для создания интерфейса настольного приложения, включая кнопки, меню и другие интерактивные элементы.
Также Tkinter можно использовать для быстрого создания прототипа графического интерфейса, позволяющего тестировать и повторять различные идеи дизайна, прежде чем приступать к окончательной реализации.
Приступая к работе
Для начала нам потребуется импортировать пакет tkinter и все его модули. Если мы работаем в Ubuntu то установить нужный пакет можно с помощью apt:
sudo apt-get install python3-tk
Далее приступим к написанию кода. Для начала создадим основное окно с заголовком. Размеры окна мы укажем в свойстве geometry()
, а заголовок в свойстве title()
. Все остальные виджеты, которые мы добавим чуть дальше, будут находиться внутри корневого окна.
Так как работа оконного приложения это по сути бесконечный цикл, используем свойство mainloop()
для вызова такого цикла. Если вы забудете вызвать этот цикл, пользователю ничего не будет показано. Окно будет ждать любого взаимодействия с пользователем, пока мы его не закроем.
Вот наш код:
# импортируем модуль
from tkinter import *
# создаем корневое окно
root = Tk()
# заголовок
root.title("Welcome to Habr!")
# размеры
root.geometry('350x200')
# запускаем бесконечный цикл
root.mainloop()
И получившееся окно:

Итак, мы нарисовали окно. Теперь необходимо добавить на него интерактивные компоненты. Мы добавим ярлык с помощью класса Label
и изменим его текстовую конфигурацию по своему усмотрению. Функция grid()
— это менеджер геометрии, который удерживает метку в нужном месте внутри окна. Если параметры не указаны, по умолчанию она поместит ее в пустую ячейку, то есть 0,0, так как это первое расположение.
# импортируем модуль
from tkinter import *
# создаем корневое окно
root = Tk()
# заголовок
root.title("Welcome to Habr!")
# размеры
root.geometry('350x200')
#добавляем Label
lbl = Label(root, text = "Are you a Geek?")
lbl.grid()
# запускаем бесконечный цикл
root.mainloop()
Мы добавили метку в наше окно. Но пока оно не слишком интерактивно, хотелось бы, чтобы пользователь мог что‑то передавать приложению. Для этого добавим кнопку в корневое окно. Изменение конфигурации кнопки дает нам множество возможностей. В этом примере мы заставим кнопку отображать текст после нажатия, а также изменим цвет текста внутри кнопки.
# импортируем модуль
from tkinter import *
# создаем корневое окно
root = Tk()
# заголовок
root.title("Welcome to Habr!")
# размеры
root.geometry('350x200')
#добавляем Label
lbl = Label(root, text = "Are you a Geek?")
lbl.grid()
# отображаем текст после нажатия кнопки
def clicked():
lbl.configure(text = "I just got clicked")
# изначально кнопка красного цвета
btn = Button(root, text = "Click me" ,
fg = "red", command=clicked)
# рисуем кнопку
btn.grid(column=1, row=0)
# запускаем бесконечный цикл
root.mainloop()
Вот что получилось:

Продолжаем делать наше оконное приложение интерактивным. Используя класс Entry()
, мы создадим текстовое поле для ввода текста пользователем. Чтобы отобразить введенный текст, мы внесем изменения в функцию clicked()
. Мы можем получить введенный пользователем текст с помощью функции get()
. При нажатии на кнопку после ввода, текст по умолчанию будет конкатенирован с текстом пользователя. Также изменим расположение кнопок на столбец 2, так как функция Entry()
будет находиться в столбце 1.
from tkinter import *
root = Tk()
root.title("Welcome to Habr")
root.geometry('350x200')
# метка
lbl = Label(root, text = "Are you a Geek?")
lbl.grid()
# поле ввода
txt = Entry(root, width=10)
txt.grid(column =1, row =0)
def clicked():
res = "You wrote" + txt.get()
lbl.configure(text = res)
btn = Button(root, text = "Click me" ,
fg = "red", command=clicked)
# меняем расположение
btn.grid(column=2, row=0)
root.mainloop()
Текущий вид нашего приложения:

Для того, что бы сделать наше приложение еще более похожим на настоящее мы можем еще добавить строку Menu с вкладками. Для этого нужно использовать соответствующий класс Menu
. Сначала мы создаем меню, затем добавляем первый ярлык и, наконец, присваиваем меню нашему окну. Мы можем добавлять пункты меню в любое меню с помощью функции add_cascade()
.
from tkinter import *
root = Tk()
root.title("Welcome to Habr")
root.geometry('350x200')
# добавляем меню
menu = Menu(root)
item = Menu(menu)
item.add_command(label='New')
item.add_command(label='Open')
item.add_command(label='Save')
menu.add_cascade(label='File', menu=item)
root.config(menu=menu)
lbl = Label(root, text = "Are you a Geek?")
lbl.grid()
txt = Entry(root, width=10)
txt.grid(column =1, row =0)
def clicked():
res = "You wrote" + txt.get()
lbl.configure(text = res)
btn = Button(root, text = "Click me" ,
fg = "red", command=clicked)
btn.grid(column=2, row=0)
root.mainloop()
Результат:

В итоге мы добавили в наше Меню три вкладки на каждую из которых затем можно повесить обработчик нажатия.
В одной статье нельзя охватить все возможности Tkinter по созданию оконных приложений? поэтому всем кто заинтересовался работой с данным пакетом я рекомендую ознакомится с официальной документацией.
Заключение
В этой статье мы узнали о программировании GUI на Python и о том, как сделать простейший GUI на Python. Несмотря на то, что командная строка по‑прежнему очень востребована, особенно при выполнении различных задач автоматизации, оконные интерфейсы также позволяют упростить работу с приложениями, поэтому разработчикам будет полезно добавить оконный функционал к своему Python приложению, для того, чтобы сделать его более удобным в работе.
Если вам интересна разработка интерфейсов и вы хотите расширить свои знания в этой области, рекомендую обратить внимание на эти открытые уроки в Otus. На них вы сможете узнать о создании функциональных и интеллектуальных приложений, а также разобраться в новых подходах к разработке интерфейсов и взаимодействию с пользователем:
Комментарии (5)
Andrey4ik
16.05.2025 16:37Слишком скучная статья. И сам ткинтер объективно говно, да. Он фигня полная. Старый интерфейс, нет дезигнера и прочей важной фигни. Он подходит для того чтобы создать простое приложение с 2 кнопками. Да/нет. Есть ещё более модерн - CustomTkinter. Но он все ещё кривенький и новенький. А проверенным временем, всеми известный и любимый Qt, который есть на Python - PySide6. Я написал большую статью о нём. Можете прочитать, если интересно.
mc2
16.05.2025 16:37Дизайнер есть - Tkinter GUI Designer.
Andrey4ik
16.05.2025 16:37https://github.com/ParthJadhav/Tkinter-Designer
Это? Так это просто Figma обёртка на легаси объекты. Вообще худшая идея. Я имею ввиду нативный дезигнер, как у Qt например и вроде wxWidgets
SulNs
Я не то чтобы еще программист, но даже для меня статья слишком банальная. Интересно кто из тех кто писал на Пайтон "Hello world" не слыхал про tk? А тут хабр как бы...
Ах да...Ясно...
Andrey4ik
Уроки по ткинтеру? What?