Создание окон в Tkinter: от основ до расширенных возможностей

Раздел: Прочее -> Графический интерфейс

Создание окон в Python с помощью Tkinter

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

Для создания окна используется класс Tk из модуля tkinter. Минимальный код:

import tkinter as tk

root = tk.Tk()
root.mainloop()

Python tkinter canvas (холст canvas в tkinter)

После запуска появится пустое окно с заголовком "tk". Метод mainloop() запускает главный цикл обработки событий, без него окно закроется сразу. Окно можно закрыть стандартными средствами операционной системы.

Типичная ошибка: вызов mainloop() не в конце программы или его отсутствие приводит к мгновенному закрытию окна. Следует всегда размещать вызов метода последним.

Как задать размеры окна и его положение на экране?

Метод geometry('ширинаxвысота+x+y') управляет размерами и расположением:

root.geometry('400x300+200+150')

Python tkinter frame (фрейм frame в tkinter)

Параметры: ширина 400 пикселей, высота 300, отступ слева 200 и сверху 150. Если указывать только размеры, окно появится в центре экрана с этими размерами. Координаты можно опустить, например '400x300'.

Ошибка: неверный синтаксис строки - использование пробелов вместо символа 'x' или запятых. Строка должна строго соответствовать формату: 'ШxВ' или 'ШxВ+X+Y'.

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

Метод title('текст') устанавливает заголовок:

root.title('Моё первое окно')

Python tkinter messagebox (messagebox в tkinter)

Заголовок отображается в строке заголовка окна. Если не задать, будет по умолчанию "tk".

Как сделать окно с изменяемыми размерами или фиксированным?

Метод resizable(True, True) позволяет изменять размер по ширине и высоте. Для фиксации параметры равны False:

root.resizable(False, False)  # запретить изменение размера

Tkinter python ввод (ввод данных в tkinter)

По умолчанию размеры можно менять. Обратите внимание: после вызова этого метода пользователь не сможет растянуть окно.

Как добавить иконку в окно?

Метод iconbitmap('путь_к_иконке.ico'):

root.iconbitmap('icon.ico')

Python tkinter виджет (виджеты tkinter)

Поддерживается только формат .ico (на Windows). На других платформах требуется использовать iconphoto() с изображением PhotoImage.

Частая проблема: иконка не отображается, если путь указан неверно или файл не является .ico. Используйте абсолютный путь или проверяйте существование файла.

Как обработать закрытие окна (например, подтверждение выхода)?

Метод protocol('WM_DELETE_WINDOW', callback) позволяет назначить функцию, которая вызовется при попытке закрыть окно:

def on_closing():
    if messagebox.askyesno('Выход', 'Вы уверены?'):
        root.destroy()

root.protocol('WM_DELETE_WINDOW', on_closing)

Python file select (диалог выбора файла в python (tkinter.filedialog))

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

Ошибка: забыли вызвать root.destroy() внутри обработчика - окно не закроется вообще. Всегда завершайте обработчик вызовом destroy() или используйте метод quit().

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

Для центрирования сначала вычисляется ширина и высота экрана, затем задаётся смещение:

w, h = 400, 300
screen_w = root.winfo_screenwidth()
screen_h = root.winfo_screenheight()
x = (screen_w - w) // 2
y = (screen_h - h) // 2
root.geometry(f'{w}x{h}+{x}+{y}')

Такой подход гарантирует расположение в центре независимо от разрешения экрана.

- Python tkinter root (главное окно tkinter (root))
- Python tkinter bind (метод bind() в tkinter)
- Python tkinter image (работа с изображениями в tkinter)

Расширенные примеры работы с окнами Tkinter

Создание нескольких независимых окон

Можно создать два и более окон, каждый со своим циклом mainloop() отдельно, но обычно используют одно главное окно и дополнительные окна Toplevel:

Пример
import tkinter as tk

def open_new_window():
    new_win = tk.Toplevel(root)
    new_win.title('Дополнительное окно')
    new_win.geometry('300x200')

root = tk.Tk()
root.title('Главное окно')
btn = tk.Button(root, text='Открыть новое окно', command=open_new_window)
btn.pack(pady=20)
root.mainloop()

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

Окно с таймером, обновляющим заголовок

Используем метод after() для периодического обновления:

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

def update_title():
    current_time = datetime.now().strftime('%H:%M:%S')
    root.title(f'Текущее время: {current_time}')
    root.after(1000, update_title)

root = tk.Tk()
root.geometry('300x150')
update_title()
root.mainloop()

Результат: заголовок окна обновляется каждую секунду, отображая текущее время. Обратите внимание: функция вызывается рекурсивно через 1000 мс, но это не блокирует интерфейс.

Прозрачное окно (Windows/Linux)

На Windows можно задать прозрачность через атрибут attributes:

Пример
import tkinter as tk

root = tk.Tk()
root.geometry('400x300+300+200')
root.title('Прозрачное окно')
root.attributes('-alpha', 0.5)  # 0.0 - полностью прозрачно, 1.0 - непрозрачно
root.mainloop()

Результат: окно становится полупрозрачным. На Linux может потребоваться дополнительная настройка композитора.

Окно без стандартной рамки (frameless)

Метод overrideredirect(True) убирает строку заголовка и рамки:

Пример
import tkinter as tk

root = tk.Tk()
root.geometry('300x200')
root.overrideredirect(True)  # окно без рамки
label = tk.Label(root, text='Окно без рамки')
label.pack(expand=True)
root.mainloop()

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

Перетаскивание окна без рамки

Добавляем обработку и :

Пример
import tkinter as tk

def start_move(event):
    global x_move, y_move
    x_move = event.x
    y_move = event.y

def do_move(event):
    dx = event.x - x_move
    dy = event.y - y_move
    x = root.winfo_x() + dx
    y = root.winfo_y() + dy
    root.geometry(f'+{x}+{y}')

root = tk.Tk()
root.geometry('300x150')
root.overrideredirect(True)
root.bind('', start_move)
root.bind('', do_move)
root.mainloop()

Результат: окно без рамки можно перетаскивать мышью. Код использует глобальные переменные для запоминания смещения.

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

En
Python окно (python)