Глава 16 · Создаём классные приложения с Tkinter

Мини-проект: счётчик кликов

Маленький проект — но уже настоящее взаимодействие: клик → callback → изменение состояния → обновление экрана.

Самый маленький настоящий проект главы: счётчик кликов. Хорошая возможность увидеть оба способа хранить число, связанное с виджетом.

Окно счётчика кликов со значением 3 и кнопкой +1
Результат выполнения кода ниже, после трёх кликов. Пример внешнего вида на среде курса. На вашей ОС шрифты, размеры и тема могут немного отличаться.
schetchik_intvar.py
import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("Счётчик кликов")

schet = tk.IntVar(value=0)
ttk.Label(root, textvariable=schet, font=("Arial", 24)).pack(pady=20)

def na_klik():
    schet.set(schet.get() + 1)

ttk.Button(root, text="+1", command=na_klik).pack(pady=10)

root.mainloop()
Второй способ — без Tk-переменной
Тот же счётчик можно собрать с обычным int и явным label.config(text=...) после каждого изменения — работает одинаково хорошо; IntVar удобен именно когда значение нужно синхронизировать сразу с несколькими виджетами (раздел 16.4).
Debug Lab 5: Забыли mainloop() — окно не работает как надо
bez_mainloop.py
root = tk.Tk()
ttk.Button(root, text="+1").pack()
# забыли root.mainloop()!
# Скрипт завершается почти сразу — окно либо не появляется,
# либо мгновенно закрывается, не дожидаясь никаких действий пользователя.
Что видно на экране

Без root.mainloop() программа не переходит в цикл обработки событий (раздел 16.10) — она просто линейно доходит до конца скрипта и завершается, как обычная терминальная программа. Виджеты созданы и даже размещены, но никто не ждёт кликов по ним.

Исправленный код
s_mainloop.py
root = tk.Tk()
ttk.Button(root, text="+1").pack()
root.mainloop()   # без этого вызова событий не будет вообще
Практика: счётчик кликов
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →