Создание окон в 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}')
Такой подход гарантирует расположение в центре независимо от разрешения экрана.
Расширенные примеры работы с окнами 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()
Результат: окно без рамки можно перетаскивать мышью. Код использует глобальные переменные для запоминания смещения.