Перейти к основному содержимому

Первая программа на Tkinter

Разработчику Архитектору

Первая программа на Tkinter

Где применяют Tkinter

Tkinter входит в стандартную поставку CPython — отдельная установка не нужна. Это самый быстрый способ показать окно с кнопками на уроке или в утилите: установили Python — уже можно рисовать UI.

Мы сделаем "Конвертер °C → °F" и разберём mainloop() — без него окно исчезнет, как app.exec() в Qt.

Теория: Tkinter и GUI. Элементы UI по рецептам: Справочник по Tkinter — элементы UI. Галерея примеров: Tkinter — окна и виджеты. Богаче UI: PyQt6. Общая теория десктопа: Архитектура десктопных приложений · Особенности разработки десктопных приложений.


Что получится

Поле ввода, кнопки "Перевести" и "Выход", метка результата, Enter в поле вызывает расчёт.


Минимальное окно


import tkinter as tk

root = tk.Tk()
root.title("Привет, Tkinter")
root.geometry("320x120")

label = tk.Label(root, text="Окно работает")
label.pack(pady=20)

root.mainloop()

Разбор фрагмента:

  • tk.Tk() создаёт главное окно приложения.
  • Label добавляет статический текст, а pack(pady=20) размещает его с вертикальным отступом.
  • mainloop() запускает цикл событий; без него окно не будет интерактивным и быстро закроется.

mainloop() запускает цикл обработки событий — без него окно сразу закроется.


Конвертер температуры

Код ITЗагрузка примера кода…

Разбор фрагмента:

  • Функция convert() получает строку из Entry, приводит её к числу и считает перевод в Фаренгейты.
  • try/except ValueError отлавливает нечисловой ввод и показывает messagebox.showerror(...).
  • StringVar (result_var) связан с меткой, поэтому результат появляется в интерфейсе сразу после set(...).
  • command=convert и entry.bind("<Return>", ...) дают два способа запуска одной логики: кнопкой и Enter.

pack и grid

  • pack — укладка "стопкой" или "в ряд" (простые формы).
  • grid — таблица строк и столбцов (формы с выравниванием).

Не смешивайте pack и grid в одном родительском контейнере.


Диалоги и меню

from tkinter import filedialog

path = filedialog.askopenfilename(
title="Выберите файл",
filetypes=[("Текст", "*.txt"), ("Все", "*.*")],
)

Разбор фрагмента:

  • filedialog.askopenfilename(...) открывает системный диалог выбора файла.
  • filetypes задаёт фильтр расширений и помогает пользователю выбрать корректный тип документа.
  • Результат записывается в path; если диалог закрыт через Cancel, вернётся пустая строка.

Меню:

menubar = tk.Menu(root)
file_menu = tk.Menu(menubar, tearoff=0)
file_menu.add_command(label="Выход", command=root.destroy)
menubar.add_cascade(label="Файл", menu=file_menu)
root.config(menu=menubar)

Разбор фрагмента:

  • Menu(root) создаёт верхнее меню окна.
  • file_menu.add_command(...) добавляет команду в подменю.
  • add_cascade(...) привязывает подменю к пункту Файл.
  • root.config(menu=menubar) активирует меню в приложении.

Частые ошибки

СимптомПричина
Окно "мигает" и закрываетсяНет mainloop()
TclError: cannot use geometry manager grid inside ... packСмешаны pack и grid
Интерфейс "зависает" при долгой операцииТяжёлую работу выносите в threading или after()
TclError: no display nameНет GUI (SSH без X11) — нужен X forwarding или другой хост

Что попробовать

  1. Перепишите форму на grid: метки в столбец 0, поля в столбец 1.
  2. ttk.Button и ttk.Entry — вид ближе к системному стилю.
  3. Сохраните результат в файл через filedialog.asksaveasfilename.
  4. Расширьте навыки — галерея примеров — окна, формы, меню.

Дальше

ЦельИнструмент
Больше готовых примеров с разборомTkinter — окна и виджеты
Богаче UI на PythonPyQt6 / PySide6 — см. Экосистема Python-приложений
Веб-UI + Python-бэкендFlask/FastAPI + pywebview
Кроссплатформенный десктоп на JSElectron
Те же задачи на C# / .NETC# WinForms и WPF (Lab)

В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Первые шаги (маршрут подборки) — Первая программа на Django REST Framework, Первая программа на PyQt6, Первая программа на Django, Первая программа на Flask, Первая программа на Next.js, Первая программа на FastAPI.