</>
Тема 2 из 6

Окно и виджеты

Tkinter — библиотека для программ с окнами, которая входит в сам Python. Ставить ничего не нужно: import tkinter работает сразу после установки Python на Windows и macOS.

Первое окно

import tkinter as tk

root = tk.Tk()                 # главное окно
root.title("Привет")           # заголовок
root.geometry("400x200")       # размер: ширина x высота

label = tk.Label(root, text="Привет, Tkinter!", font=("Segoe UI", 16))
label.pack(pady=20)            # показать в окне с отступом 20 px сверху и снизу

root.mainloop()                # цикл событий: окно живёт, пока его не закроют

Три шага повторяются в любой программе на Tkinter:

  1. создать окно tk.Tk();
  2. создать виджеты — надписи, кнопки, поля — и разместить их (pack, grid или place);
  3. запустить mainloop().

После mainloop() код выполнится, только когда окно закроют.

Виджеты и их параметры

Первым аргументом виджет получает родителя — окно или рамку, в которой он лежит. Остальное — именованные параметры:

Виджет Что это Частые параметры
Label надпись text, font, fg, bg
Button кнопка text, command
Entry поле ввода в одну строку width, show="*"
Scale ползунок from_, to, orient, command
Frame рамка-контейнер для других виджетов padx, pady

Параметры можно поменять потом через config:

label.config(text="Новый текст", fg="green")

Кнопка и функция

Кнопка вызывает функцию из параметра command — без скобок, ведь функцию нужно передать, а не вызвать сразу:

count = 0

def on_click():
    global count
    count += 1
    label.config(text=f"Нажато: {count}")

tk.Button(root, text="Нажми", command=on_click).pack()

Размер и положение окна

geometry принимает строку "ШxВ+X+Y": ширина, высота и координаты левого верхнего угла окна от левого верхнего угла экрана. Размер экрана узнают так:

sw = root.winfo_screenwidth()
sh = root.winfo_screenheight()
root.geometry(f"400x200+{(sw - 400) // 2}+{(sh - 200) // 2}")   # по центру

Код логики — отдельно от окна

В задачах курса программа устроена так:

def caption(n):            # логика: её проверяют тесты
    ...

if __name__ == "__main__":   # окно: только при обычном запуске
    root = tk.Tk()
    ...

Кнопка «Запустить у себя» откроет окно, а при «Отправить» тесты вызывают только функцию — без окна. Так же удобно писать и свои программы: логику легко проверить, а интерфейс тонкий.

Итог

  • tk.Tk() → виджеты → pack/grid/place → mainloop();
  • Label, Button(command=функция), config(...) меняет параметры;
  • geometry("ШxВ+X+Y"), winfo_screenwidth();
  • логику держим в функциях, окно — под if __name__ == "__main__".