Глава 16 · Создаём классные приложения с Tkinter
Мини-проект: счётчик кликов
Маленький проект — но уже настоящее взаимодействие: клик → callback → изменение состояния → обновление экрана.
Самый маленький настоящий проект главы: счётчик кликов. Хорошая возможность увидеть оба способа хранить число, связанное с виджетом.
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
Практика выполняется локально