Python
Tkinter Python: как сделать первое окно
Tkinter позволяет создать простое desktop-окно на Python без установки тяжелых GUI-фреймворков. Для первого шага достаточно создать Tk(), задать заголовок, добавить текст и запустить mainloop()
Tkinter подходит для учебных окон, маленьких утилит, форм ввода и прототипов. Для сложных современных интерфейсов могут понадобиться другие инструменты, но начать проще именно с него
По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы
Первое окно
import tkinter as tk
root = tk.Tk()
root.title('Первое окно')
label = tk.Label(root, text='Привет, Tkinter')
label.pack(padx=20, pady=20)
root.mainloop()
После запуска откроется окно с текстом. Если скрипт сразу завершился, проверьте, есть ли строка root.mainloop()
mainloop() запускает цикл обработки событий: окно ждет кликов, ввода с клавиатуры, перемещения и закрытия
Размер окна
import tkinter as tk
root = tk.Tk()
root.title('Мини-приложение')
root.geometry('320x180')
tk.Label(root, text='Окно 320 на 180').pack(pady=20)
root.mainloop()
geometry('320x180') задает ширину и высоту окна в пикселях
Кнопка с обработчиком
import tkinter as tk
def say_hello():
label.config(text='Кнопка нажата')
root = tk.Tk()
root.title('Кнопка')
root.geometry('320x180')
label = tk.Label(root, text='Нажмите кнопку')
label.pack(pady=20)
button = tk.Button(root, text='Нажать', command=say_hello)
button.pack()
root.mainloop()
command=say_hello передает функцию, которую Tkinter вызовет при нажатии. Скобки писать не нужно: command=say_hello, а не command=say_hello()
Поле ввода Entry
import tkinter as tk
def greet():
name = entry.get()
label.config(text=f'Привет, {name}')
root = tk.Tk()
root.title('Приветствие')
root.geometry('340x180')
entry = tk.Entry(root)
entry.pack(pady=10)
button = tk.Button(root, text='Поздороваться', command=greet)
button.pack()
label = tk.Label(root, text='Введите имя')
label.pack(pady=10)
root.mainloop()
entry.get() получает текст из поля ввода. label.config() меняет текст уже созданного виджета
Такой пример показывает базовую логику GUI: пользователь вводит данные, нажимает кнопку, программа меняет интерфейс
pack, grid и place
В Tkinter есть несколько способов расположения элементов
pack() быстро размещает элементы сверху вниз или слева направо
grid() раскладывает элементы по строкам и колонкам
place() задает координаты вручную
Для первого окна проще использовать pack()
tk.Label(root, text='Имя').pack()
tk.Entry(root).pack()
tk.Button(root, text='OK').pack()
Не смешивайте pack() и grid() внутри одного и того же контейнера без понимания. Это частая причина странной верстки
Кнопка закрытия
import tkinter as tk
root = tk.Tk()
root.title('Закрытие окна')
root.geometry('300x150')
tk.Button(root, text='Закрыть', command=root.destroy).pack(pady=40)
root.mainloop()
root.destroy закрывает окно и завершает Tkinter-приложение
Мини-приложение со счетчиком
Этот пример показывает, как хранить состояние и менять текст после каждого клика
import tkinter as tk
count = 0
def increase():
global count
count += 1
label.config(text=f'Нажатий: {count}')
root = tk.Tk()
root.title('Счетчик')
root.geometry('300x160')
label = tk.Label(root, text='Нажатий: 0')
label.pack(pady=20)
button = tk.Button(root, text='Увеличить', command=increase)
button.pack()
root.mainloop()
Для первого учебного примера global допустим, но в более аккуратном приложении состояние лучше хранить в классе или отдельном объекте
Структура через функцию main
Чтобы код не расползался, можно завернуть создание окна в функцию
import tkinter as tk
def main():
root = tk.Tk()
root.title('Первое окно')
tk.Label(root, text='Привет').pack(padx=20, pady=20)
root.mainloop()
if __name__ == '__main__':
main()
Такой вид удобнее, когда файл начинает расти: появляются функции-обработчики, настройки окна и дополнительные виджеты
Частые ошибки
Забыть root.mainloop()
Написать command=handler() вместо command=handler
Создавать несколько tk.Tk() вместо дополнительных окон
Смешивать pack() и grid() в одном контейнере
Запускать Tkinter на сервере без графической оболочки
Делать долгую операцию прямо в обработчике кнопки, из-за чего окно зависает
Практические задачи
Измените заголовок окна
Добавьте Entry и кнопку, которая читает введенный текст
Сделайте кнопку очистки поля
Добавьте Label, который показывает количество символов в поле
Поменяйте размер окна через geometry()
Сделайте кнопку закрытия через root.destroy
Первое окно Tkinter состоит из четырех шагов: создать root = tk.Tk(), настроить окно, добавить виджеты, запустить root.mainloop()
После первого окна добавьте кнопку, поле ввода и обработчик события. Так вы быстро увидите, как desktop-интерфейс связывается с обычным Python-кодом