Рубріки: Теория

Tkinter в Python: руководство по использованию

Сергей Почекутов

Tkinter — графическая библиотека Python, которая предназначена для создания программ с оконным интерфейсом. Она кроссплатформенная, то есть с ее помощью можно писать приложения для Windows, Linux, macOS.

Как я поделился своими чувствами, что познал вселенную Tkinter

Содержание:
Tkinter в Python
Создание простого GUI приложения на Tkinter
Заключение

Tkinter в Python

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.

Создание простого GUI приложения на Tkinter

В этом руководстве мы будем писать первое приложение на Tkinter в среде Windows. В качестве IDE используем Visual Studio Code. Подразумевается, что вы владеете основами Python. Все примеры кода написаны на Python 3.9.

Установка Tk

Прежде чем использовать библиотеку Tkinter, нужно убедиться, что в системе стоит последняя версия Tk. В противном случае могут возникнуть ошибки при компиляции.

Если в системе уже установлен Python, проверьте версию Tcl/Tk командой python -m tkinter.

Вам нужна версия 8.6 и выше. Если в системе установлена версия 8.4 или 8.5, нужно ее обновить. Самый простой способ сделать это — установить одну из последних версий Python. Начиная с версии 3.7 в ядре Python предустановлен Tcl/Tk версии 8.6.

  1. Перейдите на сайт python.org.
  2. Откройте раздел Downloads.
  3. Убедитесь, что сайт правильно определил версию вашей ОС. Если вам нужен установщик Python для другой операционной системы, выберите ее из перечня.
  4. Нажмите кнопку Download Python.
  5. Запустите скачанный файл.
  6. Нажмите Install now и дождитесь завершения установки.

После завершения установки запустите консоль и проверьте, какая версия Python используется по умолчанию. Должна быть 3.7 и выше. Если версия отличается, переключитесь на установленную ранее.

Hello, World!

Начнем традиционно — поздороваемся с миром. Для этого сделаем простое окно, у которого будет только заголовок.

  • Создайте файл my_app.py и напишите в нем:
from tkinter import * # Импортируем библиотеку
window = Tk() # Создаем новое окно
window.title("Hello, World!") # Добавляем заголовок окна
window.mainloop() # Запускаем бесконечный цикл окна

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

  • Запускаем файл в консоли командой python my_app.py

Откроется окно вашей первой программы с заголовком Hello, World!

Особенность Tkinter в том, что библиотека автоматически подстраивает внешний вид окна под стиль операционной системы. Так окно выглядит на Windows. На Linux и macOS оно будет другим, соответствующим стилю системы.

Источник изображения: python-scripts.com/tkinter

Базовые виджеты

Виджеты — это основа библиотеки 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(). Он размещает виджеты в определенном порядке. Это происходит в два этапа:

  1. Расчет участка — прямоугольной области, в которую будет помещен виджет. После размещения виджета на участке оставшееся пространство заполняется пустотой.
  2. Центрирование виджета в участке, если не указаны иные параметры.

По умолчанию 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() используется все реже. У него два недостатка:

  1. Сложно настраивать макет, особенно если виджетов много.
  2. Макеты не адаптируются под размер окна.

Но в некоторых случаях 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.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023