Окна в Tkinter: от простого к сложному

Раздел: GUI -> Tkinter

Основной способ: создание основного окна с помощью Tk()

Самый простой и распространённый метод создания окна в Tkinter - использование класса Tk(). Этот класс инициализирует главное окно приложения и запускает цикл обработки событий.

import tkinter as tk

root = tk.Tk()  # создаём главное окно
root.mainloop() # запускаем главный цикл обработки событий

Python self tkinter (использование self в tkinter)

После выполнения этого кода появится пустое окно. Метод mainloop() необходим для того, чтобы окно оставалось открытым и реагировало на действия пользователя.

Типичные ошибки и их решение

  • TclError: can't invoke "tk" command - возникает, если Tkinter не установлен или используется в среде без графического интерфейса (например, в некоторых Docker-контейнерах). Решение: установить python3-tk в системе или использовать альтернативы.
  • Окно закрывается сразу - забыли вызвать mainloop().
  • Окно не реагирует на кнопки - если окно создано в интерактивной оболочке (IDLE), может потребоваться отдельный поток или запуск через файл.

Как сделать окно с заголовком?

Для изменения заголовка окна используется метод title(). Это позволяет задать текст, отображаемый в строке заголовка.

import tkinter as tk

root = tk.Tk()
root.title("Моё первое окно")
root.mainloop()

Tkinter python buttons (кнопки в tkinter (англ.))

Цель:

улучшить идентификацию окна для пользователя.

Как задать размер окна при создании?

Метод geometry() позволяет указать ширину, высоту и положение окна в формате "ширинаxвысота+x+y".

import tkinter as tk

root = tk.Tk()
root.geometry("400x300+200+100")  # ширина 400, высота 300, смещение от левого края 200, от верхнего 100
root.mainloop()

Python tkinter label (метка (label) в tkinter)

Проблема: если окно не отображено, геометрия может быть неверной. Лучше вызывать update() перед чтением размеров.

Как расположить окно по центру экрана?

Для центрирования нужно получить ширину и высоту экрана, затем вычислить координаты.

import tkinter as tk

root = tk.Tk()
root.title("Центрированное окно")

window_width = 400
window_height = 300

screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

x = (screen_width - window_width) // 2
y = (screen_height - window_height) // 2

root.geometry(f"{window_width}x{window_height}+{x}+{y}")
root.mainloop()

Python tkinter entry (поле ввода (entry) в tkinter)

Примечание:

расчёт выполняется после того, как окно уже создано, но до его отображения.

Как сделать окно без рамки (overrideredirect)?

Метод overrideredirect(True) убирает все элементы декорирования окна (заголовок, кнопки свернуть/закрыть). Используется для создания заставок или кастомных интерфейсов.

import tkinter as tk

root = tk.Tk()
root.overrideredirect(True)
root.geometry("300x200+500+300")
root.mainloop()

Python tkinter приложение (создание приложения на tkinter)

Ошибка: закрыть такое окно можно только через диспетчер задач или программно (например, по нажатию кнопки). Рекомендуется добавить виджет для закрытия.

Как сделать окно поверх всех других окон (always on top)?

Используется метод attributes('-topmost', True). Окно остаётся поверх всех остальных приложений.

import tkinter as tk

root = tk.Tk()
root.attributes('-topmost', True)
root.mainloop()

Python tkinter programs (примеры программ на tkinter)

Случаи использования:

уведомления, таймеры, инструменты для разработчика.

Как сделать окно фиксированного размера (запретить изменение)?

Метод resizable(False, False) отключает возможность изменения ширины и высоты окна пользователем.

import tkinter as tk

root = tk.Tk()
root.resizable(False, False)
root.mainloop()

Python tkinter line (рисование линий в tkinter)

Первое значение - ширина, второе - высота. Можно разрешить изменение только по одной оси.

Как установить иконку для окна?

Метод iconbitmap() задаёт файл иконки (обычно .ico на Windows, .xbm на Linux).

import tkinter as tk

root = tk.Tk()
root.iconbitmap('icon.ico')  # файл должен находиться рядом со скриптом
root.mainloop()

Python tkinter окно (создание окна в tkinter)

Проблема: на разных платформах требуются разные форматы. На Linux может потребоваться конвертация в PNG и использование PhotoImage.

Как сделать окно полноэкранным?

Атрибут '-fullscreen' позволяет развернуть окно на весь экран. Часто используется для киосков или презентаций.

import tkinter as tk

root = tk.Tk()
root.attributes('-fullscreen', True)
root.mainloop()

Python tkinter таблицы (создание таблиц в tkinter python)

Выход из полноэкранного режима:

обычно связывают нажатие клавиши Escape с отключением атрибута.

Как сделать модальное окно (блокирует родительское)?

Создаётся дочернее окно Toplevel, затем вызывается grab_set() и устанавливается transient() для привязки к родителю.

import tkinter as tk

def open_modal():
    modal = tk.Toplevel(root)
    modal.title("Модальное окно")
    modal.transient(root)
    modal.grab_set()
    root.wait_window(modal)

root = tk.Tk()
btn = tk.Button(root, text="Открыть модальное окно", command=open_modal)
btn.pack()
root.mainloop()

Python text get (метод get() для текста в python (например, из tkinter))

Важно:

после закрытия модального окна grab_set() автоматически снимается.

Как открыть несколько окон в одном приложении?

Класс Toplevel создаёт дополнительные окна, которые не являются главными.

import tkinter as tk

root = tk.Tk()
root.title("Главное окно")

win1 = tk.Toplevel(root)
win1.title("Дополнительное окно 1")

win2 = tk.Toplevel(root)
win2.title("Дополнительное окно 2")

root.mainloop()

Import tkinter as tk python (импорт tkinter как tk в python)

Закрытие главного окна (root) завершает всё приложение, тогда как закрытие дочерних окон этого не делает.

Как определить действие при закрытии окна (кнопка "крестик")?

Метод protocol() позволяет привязать функцию к событию закрытия окна (WM_DELETE_WINDOW).

import tkinter as tk
from tkinter import messagebox

def on_closing():
    if messagebox.askokcancel("Выход", "Вы действительно хотите закрыть окно?"):
        root.destroy()

root = tk.Tk()
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()

Python интерфейс tkinter (интерфейс tkinter в python)

Цель:

сохранить данные перед выходом или предотвратить случайное закрытие.

Как установить цвет фона окна?

Метод configure(bg='color') или параметр bg при создании окна.

import tkinter as tk

root = tk.Tk()
root.configure(bg='lightblue')
# или root = tk.Tk(bg='lightblue')
root.mainloop()

Python приложение для windows (создание окна с помощью tkinter)

Цвет можно задать именем (например, 'red') или hex-кодом ('#FF0000').

Как добавить меню в окно?

Создаётся объект Menu и привязывается к окну через config(menu=...).

import tkinter as tk

def hello():
    print("Привет!")

root = tk.Tk()
menubar = tk.Menu(root)
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="Открыть", command=hello)
filemenu.add_separator()
filemenu.add_command(label="Выход", command=root.quit)
menubar.add_cascade(label="Файл", menu=filemenu)

root.config(menu=menubar)
root.mainloop()

Частые проблемы при создании окон Tkinter

  • Окно не появляется - возможные причины: вызов mainloop() отсутствует или блокирован другим циклом; скрипт запущен без графической оболочки (например, через SSH).
  • Ошибки с иконкой - на Windows требуется файл .ico, на Linux - .xbm или PNG через PhotoImage. При отсутствии файла выбрасывается TclError.
  • Окно зависает - если в основном потоке выполняется длительная операция, интерфейс перестаёт реагировать. Решение: использовать after() или потоки.
  • Два окна при запуске - часто бывает, если случайно создано два экземпляра Tk() в одном приложении. Используйте Toplevel для дополнительных окон.
  • Невозможно закрыть окно без рамки - предусмотрите кнопку или горячую клавишу для выхода.

Расширенные примеры создания и управления окнами

Пример 1: Окно с кнопкой, закрывающей его

Демонстрирует добавление виджетов и завершение приложения через destroy().

Пример
import tkinter as tk

def close_window():
    root.destroy()

root = tk.Tk()
root.title("Окно с кнопкой")
root.geometry("300x150+500+200")

label = tk.Label(root, text="Нажмите кнопку для закрытия")
label.pack(pady=20)

button = tk.Button(root, text="Закрыть окно", command=close_window)
button.pack(pady=10)

root.mainloop()

Результат:

окно с текстом и кнопкой. При нажатии окно закрывается.

Пример 2: Окно с обработчиком закрытия и подтверждением

Используется protocol и messagebox для подтверждения выхода.

Пример
import tkinter as tk
from tkinter import messagebox

def on_closing():
    if messagebox.askokcancel("Выход", "Закрыть программу?"):
        root.destroy()

root = tk.Tk()
root.title("Подтверждение выхода")
root.geometry("400x200")
root.protocol("WM_DELETE_WINDOW", on_closing)

label = tk.Label(root, text="Попробуйте закрыть окно крестиком")
label.pack(expand=True)

root.mainloop()

Результат:

при нажатии на крестик появляется диалог подтверждения.

Пример 3: Многооконное приложение с главным и дочерним окнами

Показывает использование Toplevel и передачу данных между окнами.

Пример
import tkinter as tk

def open_second_window():
    second = tk.Toplevel(root)
    second.title("Второе окно")
    second.geometry("250x150+400+300")
    label = tk.Label(second, text="Я второе окно!")
    label.pack(expand=True)
    btn_close = tk.Button(second, text="Закрыть это окно", command=second.destroy)
    btn_close.pack()

root = tk.Tk()
root.title("Главное окно")
root.geometry("300x200+300+200")

btn_open = tk.Button(root, text="Открыть второе окно", command=open_second_window)
btn_open.pack(expand=True)

root.mainloop()

Результат:

главное окно с кнопкой. При нажатии появляется дополнительное окно, которое можно закрыть без завершения основного.

Пример 4: Полноэкранное окно с выходом по нажатию Escape

Комбинация атрибутов и привязки клавиш.

Пример
import tkinter as tk

def exit_fullscreen(event=None):
    root.attributes('-fullscreen', False)
    root.quit()

root = tk.Tk()
root.attributes('-fullscreen', True)
root.bind('<Escape>', exit_fullscreen)

label = tk.Label(root, text="Полноэкранный режим. Нажмите Escape для выхода.", font=('Arial', 20))
label.pack(expand=True)

root.mainloop()

Результат:

окно разворачивается на весь экран. При нажатии Escape окно закрывается и приложение завершается.

Пример 5: Окно с настраиваемым меню и подменю

Создание строки меню с командами.

Пример
import tkinter as tk

def new_file():
    print("Создан новый файл")

def open_file():
    print("Открыть файл...")

def about():
    print("О программе")

root = tk.Tk()
root.title("Приложение с меню")
root.geometry("500x400")

menubar = tk.Menu(root)

filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="Новый", command=new_file)
filemenu.add_command(label="Открыть...", command=open_file)
filemenu.add_separator()
filemenu.add_command(label="Выход", command=root.quit)
menubar.add_cascade(label="Файл", menu=filemenu)

helpmenu = tk.Menu(menubar, tearoff=0)
helpmenu.add_command(label="О программе", command=about)
menubar.add_cascade(label="Помощь", menu=helpmenu)

root.config(menu=menubar)

root.mainloop()

Результат:

окно с классическим меню в верхней части.

Пример 6: Окно с изменяемой прозрачностью

Атрибут alpha регулирует прозрачность от 0.0 до 1.0.

Пример
import tkinter as tk

root = tk.Tk()
root.title("Прозрачное окно")
root.geometry("300x200+400+300")
root.attributes('-alpha', 0.7)

label = tk.Label(root, text="Окно с прозрачностью 70%")
label.pack(expand=True)

root.mainloop()

Результат:

окно полупрозрачное; сквозь него виден фон.

Пример 7: Окно с фоновым изображением (через Canvas)

Используется Canvas для размещения изображения в качестве фона.

Пример
import tkinter as tk
from PIL import Image, ImageTk

root = tk.Tk()
root.title("Фоновое изображение")

# Загружаем изображение через Pillow
image = Image.open("background.jpg")
photo = ImageTk.PhotoImage(image)

canvas = tk.Canvas(root, width=photo.width(), height=photo.height())
canvas.pack()
canvas.create_image(0, 0, anchor=tk.NW, image=photo)

root.mainloop()

Результат:

окно с изображением, занимающим всю область холста. Внимание: требуется установка Pillow (pip install Pillow).

Пример 8: Окно, реагирующее на изменение размера

Привязка события <Configure> для отслеживания изменения размеров.

Пример
import tkinter as tk

def on_resize(event):
    width = event.width
    height = event.height
    status_label.config(text=f"Размер: {width} x {height}")

root = tk.Tk()
root.title("Изменение размера")
root.geometry("400x300")

status_label = tk.Label(root, text="Размер: 400 x 300", relief=tk.SUNKEN, anchor=tk.W)
status_label.pack(side=tk.BOTTOM, fill=tk.X)

root.bind('<Configure>', on_resize)

root.mainloop()

Результат:

в нижней части окна отображаются текущие ширина и высота. Они обновляются при каждом изменении размера.

Пример 9: Окно с таймером, закрывающееся автоматически

Использование after() для отложенного закрытия.

Пример
import tkinter as tk

def close_after():
    root.destroy()

root = tk.Tk()
root.title("Автоматическое закрытие")
root.geometry("300x150+500+250")

label = tk.Label(root, text="Это окно закроется через 5 секунд")
label.pack(expand=True)

root.after(5000, close_after)  # 5000 мс = 5 секунд

root.mainloop()

Результат:

окно появляется и самостоятельно закрывается через 5 секунд.

Создание окна в Tkinter - comments

En
Python tkinter окно (python)