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.
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…