Tkinter — графическая библиотека Python, которая предназначена для создания программ с оконным интерфейсом. Она кроссплатформенная, то есть с ее помощью можно писать приложения для Windows, Linux, macOS.
Содержание:
Tkinter в Python
Создание простого GUI приложения на Tkinter
Заключение
Tkinter — это интерфейс Tcl/Tk. На английском его обычно называют «тикль-ток», на русском — «так-тикль».
Tcl — это скриптовый язык. Tk — кроссплатформенная графическая библиотека.
Область применения Tcl/Tk — быстрое прототипирование. С его помощью создают графические интерфейсы, встраивают новые сценарии в программы, тестируют.
Чтобы работать с Tcl/Tk на Python, используется библиотека Tkinter. Чтобы узнать больше о том, как с ней взаимодействовать, изучите документацию или запишитесь на курсы к нашим партнерам Powercode Академии и Mate Academy.
Удобство Tkinter в том, что она входит в стандартный набор Python. Если в системе установлен Python, то Tkinter тоже работает. Проверить это можно командой python -m tkinter.
В результате должно запуститься окно, в котором указана версия Tcl/Tk, а также две кнопки — Click me и Quit.
В этом руководстве мы будем писать первое приложение на Tkinter в среде Windows. В качестве IDE используем Visual Studio Code. Подразумевается, что вы владеете основами Python. Все примеры кода написаны на Python 3.9.
Прежде чем использовать библиотеку Tkinter, нужно убедиться, что в системе стоит последняя версия Tk. В противном случае могут возникнуть ошибки при компиляции.
Если в системе уже установлен Python, проверьте версию Tcl/Tk командой python -m tkinter.
Вам нужна версия 8.6 и выше. Если в системе установлена версия 8.4 или 8.5, нужно ее обновить. Самый простой способ сделать это — установить одну из последних версий Python. Начиная с версии 3.7 в ядре Python предустановлен Tcl/Tk версии 8.6.
После завершения установки запустите консоль и проверьте, какая версия Python используется по умолчанию. Должна быть 3.7 и выше. Если версия отличается, переключитесь на установленную ранее.
Начнем традиционно — поздороваемся с миром. Для этого сделаем простое окно, у которого будет только заголовок.
from tkinter import * # Импортируем библиотеку
window = Tk() # Создаем новое окно
window.title("Hello, World!") # Добавляем заголовок окна
window.mainloop() # Запускаем бесконечный цикл окна
Обратите внимание на функцию mainloop(). Она вызывает бесконечный цикл. Окно будет ждать любого действия от пользователя до тех пор, пока пользователь его не закроет. Без mainloop() окно не отобразится.
python my_app.pyОткроется окно вашей первой программы с заголовком Hello, World!
Особенность Tkinter в том, что библиотека автоматически подстраивает внешний вид окна под стиль операционной системы. Так окно выглядит на Windows. На Linux и macOS оно будет другим, соответствующим стилю системы.
Виджеты — это основа библиотеки Tkinter. Через них пользователи взаимодействуют с программой.
Каждый виджет определен классом. Вот основные семь:
| Класс виджета | Что делает | Пример использования |
| Frame | Помогает организовать пользовательский интерфейс как визуально, так и на уровне кода. Отображается как простой прямоугольник. | Разделение интерфейса на блоки. |
| Label | Виджет для отображения текста или изображения. Пользователи могут его просматривать, но не могут взаимодействовать с ним. | Заголовки, подписи, иконки в интерфейсе. |
| Button | Это элемент интерфейса, с которым пользователи могут взаимодействовать. На кнопку нажимают, чтобы выполнить действие. Button может отображать текст и изображение, как и Label, но также может принимать дополнительные параметры для изменения поведения. | Кнопки в интерфейсе: для перехода, сохранения, выхода из программы. |
| Checkbutton | Разновидность кнопки, которая содержит двоичное значение. При нажатии переключатель переворачивается, затем происходит обратный вызов. | Включение и выключение опций с помощью галочек. |
| Radiobutton | Кнопка, которая позволяет выбрать один из нескольких взаимоисключающих вариантов. | Список с опциями, например, для выбора языка интерфейса. |
| Entry | Виджет для ввода одной строки текста. | Указание имени, пароля, города и других данных пользователей. |
| Combobox | Объединяет Entry со списком опций. Пользователи могут выбирать из предложенных вариантов или указывать свои. | Выпадающий список. |
Это лишь базовые виджеты. Посмотреть их подробное описание можно в официальной документации Tk. Там же есть и другие стандартные виджеты — например, скроллбар, шкала прогресса, список. Также можно записаться на онлайн курсы и изучить все аспекты с практикующими специалистами.
Для управления геометрией используются менеджеры. Самый популярный — grid(). Он превращает окно или фрейм в сетку, разделяя пространство на строки и столбцы.
Чтобы указать место виджета, достаточно передать индексы row и column. Индексы начинаются с 0.
Например, вот так просто можно разместить три кнопки в ряд:
button_1.grid(row=1, column=0) button_2.grid(row=1, column=1) button_3.grid(row=1, column=2)
В grid() также можно гибко управлять размерами виджетов при расширении и уменьшении окна.
Еще один менеджер геометрии — pack(). Он размещает виджеты в определенном порядке. Это происходит в два этапа:
По умолчанию pack() размещает виджеты друг над другом и центрирует. Настроить расположение элементов можно с помощью ключевых аргументов. Например, вот так можно расширить виджет по горизонтали на всю ширину экрана:
frame1 = tk.Frame(master=window, height=100, bg="red") frame1.pack(fill=tk.X)
Примечательно, что pack() реагирует на расширение экрана. То есть виджет будет растягиваться и сворачиваться при изменении ширины окна.
Управлять направлением виджетов можно с помощью аргумента side. Он принимает следующие параметры:
tk.TOP — наверх;tk.BOTTOM — вниз;tk.LEFT — налево;tk.RIGHT — направо.Например, вот так можно развернуть наши виджеты налево:
frame1 = tk.Frame(master=window, width=200, height=100, bg="red") frame1.pack(fill=tk.Y, side=tk.LEFT) frame2 = tk.Frame(master=window, width=100, bg="yellow") frame2.pack(fill=tk.Y, side=tk.LEFT)
Третий менеджер геометрии — place(). Он нужен для точного указания местоположения виджета. В place() вам нужно определить координаты x и y для верхнего левого угла. Они измеряются в пикселях.
Менеджер place() используется все реже. У него два недостатка:
Но в некоторых случаях place() подходит — например, если нужно создать интерфейс для географической карты и разместить виджеты на правильном расстоянии друг от друга.
У pack() тоже есть недостаток. Так как расположение виджетов зависит от порядка вызова метода, приложения сложно модифицировать без полного понимания кода. В grid() эти проблемы решены, поэтому он сейчас используется чаще, чем другие менеджеры геометрии. Больше полезной информации о менеджере grid() вы найдете в документации.
Чтобы лучше понять концепцию создания и размещения виджетов, давайте разберем несколько примеров.
Здесь мы добавляем текст с помощью виджета Label и кнопку с помощью виджета Button:
from tkinter import *
window = Tk()
window.title("Highload")
lbl = Label(window, text="Первая программа", font=("Roboto Bold", 20))
lbl.grid(column=0, row=0)
btn = Button(window, text="Запустить")
btn.grid(column=0, row=2)
window.mainloop()
Получаем вот такой результат:
Label, и навесим ее на кнопку:
from tkinter import *
def clicked():
lbl.configure(text="Запустили!")
window = Tk()
window.title("Highload")
lbl = Label(window, text="Первая программа", font=("Roboto Bold", 20))
lbl.grid(column=0, row=0)
btn = Button(window, text="Запустить", command=clicked)
btn.grid(column=1, row=0)
window.mainloop()
Теперь после нажатия на кнопку текст Label будет меняться на тот, который мы указали внутри функции:
from tkinter import *
from tkinter.ttk import Checkbutton
window = Tk()
window.title("Highload")
chk_state = BooleanVar()
chk_state.set(True) # Проверяем состояние
chk = Checkbutton(window, text='Добавить', var=chk_state)
chk.grid(column=0, row=0)
window.mainloop()
Мы получим такой результат:
Используем полученные знания, чтобы написать первое приложение на Tkinter. Пусть это будет очень простой калькулятор, который умеет совершать основные математические операции: складывать, вычитать, умножать, делить. У него также будет кнопка очистки для удаления введенных или выведенных данных.
Стандартное начало — импорт модуля Tkinter, создание окна и добавление заголовка. Создайте файл calculator.py и напишите:
from tkinter import *
root = Tk()
root.title("Простой калькулятор")
Определим базовое расположение элементов калькулятора. Начнем со строки, в которую пользователь вводит цифры. В ней же отображается результат расчетов:
e = Entry(root, width=35, borderwidth=5) e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
Теперь создадим все кнопки, которые нужны нашему калькулятору. Цифры от 1 до 0, знаки сложения, вычитания, деления, умножения, кнопки вывода результата и очистки строки:
button_1 = Button(root, text="1", padx=40, pady=20, command=lambda: button_click(1)) button_2 = Button(root, text="2", padx=40, pady=20, command=lambda: button_click(2)) button_3 = Button(root, text="3", padx=40, pady=20, command=lambda: button_click(3)) button_4 = Button(root, text="4", padx=40, pady=20, command=lambda: button_click(4)) button_5 = Button(root, text="5", padx=40, pady=20, command=lambda: button_click(5)) button_6 = Button(root, text="6", padx=40, pady=20, command=lambda: button_click(6)) button_7 = Button(root, text="7", padx=40, pady=20, command=lambda: button_click(7)) button_8 = Button(root, text="8", padx=40, pady=20, command=lambda: button_click(8)) button_9 = Button(root, text="9", padx=40, pady=20, command=lambda: button_click(9)) button_0 = Button(root, text="0", padx=40, pady=20, command=lambda: button_click(0)) button_add = Button(root, text="+", padx=39, pady=20, command=button_add) button_equal = Button(root, text="=", padx=91, pady=20, command=button_equal) button_clear = Button(root, text="Clear", padx=79, pady=20, command=button_clear) button_subtract = Button(root, text="-", padx=41, pady=20, command=button_subtract) button_multiply = Button(root, text="*", padx=40, pady=20, command=button_multiply) button_divide = Button(root, text="/", padx=41, pady=20, command=button_divide)
Теперь нужно расположить кнопки в интерфейсе, используя менеджер геометрии grid:
button_1.grid(row=3, column=0) button_2.grid(row=3, column=1) button_3.grid(row=3, column=2) button_4.grid(row=2, column=0) button_5.grid(row=2, column=1) button_6.grid(row=2, column=2) button_7.grid(row=1, column=0) button_8.grid(row=1, column=1) button_9.grid(row=1, column=2) button_0.grid(row=4, column=0) button_clear.grid(row=4, column=1, columnspan=2) button_add.grid(row=5, column=0) button_equal.grid(row=5, column=1, columnspan=2) button_subtract.grid(row=6, column=0) button_multiply.grid(row=6, column=1) button_divide.grid(row=6, column=2)
Осталось определить логику для каждого действия пользователя: нажатия на цифру, знаки математических операций:
def button_click(number):
#e.delete(0, END)
current = e.get()
e.delete(0, END)
e.insert(0, str(current) + str(number))
def button_clear():
e.delete(0, END)
def button_add():
first_number = e.get()
global f_num
global math
math = "addition"
f_num = int(first_number)
e.delete(0, END)
def button_equal():
second_number = e.get()
e.delete(0, END)
if math == "addition":
e.insert(0, f_num + int(second_number))
if math == "subtraction":
e.insert(0, f_num - int(second_number))
if math == "multiplication":
e.insert(0, f_num * int(second_number))
if math == "division":
e.insert(0, f_num / int(second_number))
def button_subtract():
first_number = e.get()
global f_num
global math
math = "subtraction"
f_num = int(first_number)
e.delete(0, END)
def button_multiply():
first_number = e.get()
global f_num
global math
math = "multiplication"
f_num = int(first_number)
e.delete(0, END)
def button_divide():
first_number = e.get()
global f_num
global math
math = "division"
f_num = int(first_number)
e.delete(0, END)
Калькулятор готов.
Чтобы пользователь мог взаимодействовать с программой, добавьте в конце root.mainloop().
Запустите файл calculator.py. На экране появится окно программы:
Полный код приложения:
from tkinter import *
root = Tk()
root.title("Простой калькулятор")
e = Entry(root, width=35, borderwidth=5)
e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
def button_click(number):
#e.delete(0, END)
current = e.get()
e.delete(0, END)
e.insert(0, str(current) + str(number))
def button_clear():
e.delete(0, END)
def button_add():
first_number = e.get()
global f_num
global math
math = "addition"
f_num = int(first_number)
e.delete(0, END)
def button_equal():
second_number = e.get()
e.delete(0, END)
if math == "addition":
e.insert(0, f_num + int(second_number))
if math == "subtraction":
e.insert(0, f_num - int(second_number))
if math == "multiplication":
e.insert(0, f_num * int(second_number))
if math == "division":
e.insert(0, f_num / int(second_number))
def button_subtract():
first_number = e.get()
global f_num
global math
math = "subtraction"
f_num = int(first_number)
e.delete(0, END)
def button_multiply():
first_number = e.get()
global f_num
global math
math = "multiplication"
f_num = int(first_number)
e.delete(0, END)
def button_divide():
first_number = e.get()
global f_num
global math
math = "division"
f_num = int(first_number)
e.delete(0, END)
# Определяем кнопки
button_1 = Button(root, text="1", padx=40, pady=20, command=lambda: button_click(1))
button_2 = Button(root, text="2", padx=40, pady=20, command=lambda: button_click(2))
button_3 = Button(root, text="3", padx=40, pady=20, command=lambda: button_click(3))
button_4 = Button(root, text="4", padx=40, pady=20, command=lambda: button_click(4))
button_5 = Button(root, text="5", padx=40, pady=20, command=lambda: button_click(5))
button_6 = Button(root, text="6", padx=40, pady=20, command=lambda: button_click(6))
button_7 = Button(root, text="7", padx=40, pady=20, command=lambda: button_click(7))
button_8 = Button(root, text="8", padx=40, pady=20, command=lambda: button_click(8))
button_9 = Button(root, text="9", padx=40, pady=20, command=lambda: button_click(9))
button_0 = Button(root, text="0", padx=40, pady=20, command=lambda: button_click(0))
button_add = Button(root, text="+", padx=39, pady=20, command=button_add)
button_equal = Button(root, text="=", padx=91, pady=20, command=button_equal)
button_clear = Button(root, text="Clear", padx=79, pady=20, command=button_clear)
button_subtract = Button(root, text="-", padx=41, pady=20, command=button_subtract)
button_multiply = Button(root, text="*", padx=40, pady=20, command=button_multiply)
button_divide = Button(root, text="/", padx=41, pady=20, command=button_divide)
# Располагаем кнопки на экране
button_1.grid(row=3, column=0)
button_2.grid(row=3, column=1)
button_3.grid(row=3, column=2)
button_4.grid(row=2, column=0)
button_5.grid(row=2, column=1)
button_6.grid(row=2, column=2)
button_7.grid(row=1, column=0)
button_8.grid(row=1, column=1)
button_9.grid(row=1, column=2)
button_0.grid(row=4, column=0)
button_clear.grid(row=4, column=1, columnspan=2)
button_add.grid(row=5, column=0)
button_equal.grid(row=5, column=1, columnspan=2)
button_subtract.grid(row=6, column=0)
button_multiply.grid(row=6, column=1)
button_divide.grid(row=6, column=2)
root.mainloop()
Чтобы потренироваться с Tkinter, создайте еще несколько простых приложений. В качестве руководства можно использовать это видео от freeCodeCamp. Это мини-курс по Tkinter, в рамках которого вы создадите программу для просмотра картинок. Это будет минималистическое приложение для погоды.
А с этого видео начинается курс по Trinter на русском языке. В нем 28 уроков, вторая половина которых посвящена созданию игры «Сапер» на Python.
На фоне роста спроса на ликвидность в бычьем рынке 2025 года, криптозаймы снова выходят на…
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…