Перейти к основному содержимому

Справочник по Tkinter — элементы UI


Назначение

Пошаговые рецепты: импорт → создать → разместить → обработчик. Каркас приложения — в Первая программа на Tkinter, теория — Tkinter и GUI. Готовые примеры с построчным разборомTkinter — окна и виджеты. Общие названия элементов — Архитектура десктопных приложений; UI-поток и потоки — Особенности разработки десктопных приложений.


Как пользоваться

  1. Создайте root = tk.Tk() и контейнер (frame = tk.Frame(root)), как в Первая программа на Tkinter.
  2. Найдите нужный элемент ниже, скопируйте блок в свой frame (или root).
  3. В конце файла оставьте root.mainloop().
  4. Для учебных мини-проектов (калькулятор, блокнот, список задач) см. галерею Tkinter в Lab.

Правило: в одном родителе используйте один менеджер — только pack, только grid или только place.


Главное окно


import tkinter as tk

root = tk.Tk()
root.title("Моё приложение")
root.geometry("640x480")
root.minsize(400, 300)
root.mainloop()
ДействиеКод
Закрыть программуroot.destroy()
Обработчик крестикаroot.protocol("WM_DELETE_WINDOW", on_close)
Отложенный вызовroot.after(1000, func)

Контейнер (Frame)

Куда: в root или во вложенный Frame.

frame = tk.Frame(root, padx=12, pady=12)
frame.pack(fill=tk.BOTH, expand=True)

# Группа с рамкой и заголовком
group = tk.LabelFrame(frame, text="Параметры", padx=8, pady=8)
group.grid(row=0, column=0, sticky="ew")

Label (метка)

Куда: в frame. Импорт: tk.Label.

label = tk.Label(frame, text="Имя пользователя:")
label.grid(row=0, column=0, sticky="w", padx=4, pady=4)

# Динамический текст
status_var = tk.StringVar(value="Готово")
status = tk.Label(frame, textvariable=status_var)
status.pack()
status_var.set("Сохранено")

TextBox — однострочный (Entry)

Куда: рядом с подписью в frame.

entry = tk.Entry(frame, width=30)
entry.grid(row=0, column=1, padx=4, pady=4)
entry.focus_set()

text = entry.get().strip()
entry.delete(0, tk.END)
entry.insert(0, "значение по умолчанию")

Enter в поле:

entry.bind("<Return>", lambda e: on_submit())

TextBox — многострочный (Text)

text = tk.Text(frame, width=40, height=8, wrap=tk.WORD)
text.grid(row=1, column=0, columnspan=2, sticky="nsew")
content = text.get("1.0", tk.END).strip()
text.delete("1.0", tk.END)
text.insert("1.0", "Черновик")

Поле пароля

pwd = tk.Entry(frame, show="*", width=24)
pwd.grid(row=2, column=1)
password = pwd.get()

Button (кнопка)

def on_save():
print("Сохранить")

btn = tk.Button(frame, text="Сохранить", command=on_save)
btn.grid(row=3, column=1, sticky="e", pady=8)
# command=on_save — без скобок!

Современный вид — ttk:

from tkinter import ttk

btn = ttk.Button(frame, text="OK", command=on_save)
btn.pack(pady=4)

CheckBox (флажок)

var = tk.BooleanVar(value=True)
chk = tk.Checkbutton(frame, text="Уведомления", variable=var, command=lambda: print(var.get()))
chk.pack(anchor="w")

# ttk
chk = ttk.Checkbutton(frame, text="Согласен", variable=var)

RadioButton (переключатель)

role = tk.StringVar(value="user")
tk.Radiobutton(frame, text="Пользователь", variable=role, value="user").pack(anchor="w")
tk.Radiobutton(frame, text="Админ", variable=role, value="admin").pack(anchor="w")
selected = role.get()

ComboBox (выпадающий список)

from tkinter import ttk

combo = ttk.Combobox(frame, values=["Работа", "Личное", "Учёба"], state="readonly")
combo.set("Работа")
combo.grid(row=0, column=1)
choice = combo.get()

Редактируемый список: state="normal".


ListBox (список)

listbox = tk.Listbox(frame, height=6)
for item in ("Яблоко", "Груша", "Слива"):
listbox.insert(tk.END, item)
listbox.pack(fill=tk.BOTH, expand=True)

listbox.bind("<<ListboxSelect>>", lambda e: print(listbox.get(listbox.curselection())))

# Множественный выбор
listbox = tk.Listbox(frame, selectmode=tk.EXTENDED)

DataGrid (таблица) — Treeview

from tkinter import ttk

cols = ("name", "age")
tree = ttk.Treeview(frame, columns=cols, show="headings", height=8)
tree.heading("name", text="Имя")
tree.heading("age", text="Возраст")
tree.column("age", width=60, anchor="center")
tree.pack(fill=tk.BOTH, expand=True)
tree.insert("", tk.END, values=("Алиса", 30))

sel = tree.selection()
if sel:
row = tree.item(sel[0])["values"]

Progress bar (индикатор прогресса)

from tkinter import ttk

progress = ttk.Progressbar(frame, length=200, mode="determinate")
progress.pack(pady=8)
progress["value"] = 0
progress["value"] = 50 # 0..100

# Неопределённый режим
progress = ttk.Progressbar(frame, mode="indeterminate")
progress.start(10)
progress.stop()

Slider (ползунок)

scale_var = tk.IntVar(value=50)
scale = tk.Scale(frame, from_=0, to=100, orient=tk.HORIZONTAL, variable=scale_var)
scale.pack(fill=tk.X)
value = scale_var.get()

Поле поиска (фильтр списка)

search_var = tk.StringVar()
search = tk.Entry(frame, textvariable=search_var)
search.pack(fill=tk.X)

def filter_list(*_):
query = search_var.get().lower()
listbox.delete(0, tk.END)
for item in all_items:
if query in item.lower():
listbox.insert(tk.END, item)

search_var.trace_add("write", filter_list)
# или: search.bind("<KeyRelease>", lambda e: filter_list())

Вкладки (Notebook)

from tkinter import ttk

notebook = ttk.Notebook(frame)
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text="Общее")
notebook.add(tab2, text="Настройки")
notebook.pack(fill=tk.BOTH, expand=True)

tk.Label(tab1, text="Содержимое вкладки 1").pack(padx=8, pady=8)

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

ToolBar (панель кнопок)

from tkinter import ttk

toolbar = ttk.Frame(frame)
toolbar.pack(fill=tk.X)
ttk.Button(toolbar, text="Новый", command=new_doc).pack(side=tk.LEFT, padx=2)
ttk.Button(toolbar, text="Сохранить", command=save_doc).pack(side=tk.LEFT, padx=2)

Или ttk.Toolbar через кастомный ряд Button.


StatusBar (строка состояния)

status_var = tk.StringVar(value="Готово")
statusbar = tk.Label(root, textvariable=status_var, bd=1, relief=tk.SUNKEN, anchor=tk.W)
statusbar.pack(side=tk.BOTTOM, fill=tk.X)
status_var.set("Файл сохранён")

ScrollPane (прокрутка)

canvas = tk.Canvas(frame)
scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL, command=canvas.yview)
scroll_frame = tk.Frame(canvas)
scroll_frame.bind("<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
canvas.create_window((0, 0), window=scroll_frame, anchor="nw")
canvas.configure(yscrollcommand=scrollbar.set)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# Виджеты добавляйте в scroll_frame

Для Text/Listbox часто достаточно scrollbar.config(command=widget.yview) и widget.config(yscrollcommand=scrollbar.set).


Диалоговые окна

from tkinter import messagebox, filedialog, colorchooser

messagebox.showinfo("Заголовок", "Текст")
messagebox.showerror("Ошибка", "Не удалось сохранить")
if messagebox.askyesno("Удалить?", "Файл будет удалён"):
delete_file()

path = filedialog.askopenfilename(filetypes=[("Текст", "*.txt"), ("Все", "*.*")])
save_path = filedialog.asksaveasfilename(defaultextension=".txt")
color = colorchooser.askcolor()

Tooltip (подсказка)

Код ITЗагрузка примера кода…


Context menu (контекстное меню)

menu = tk.Menu(root, tearoff=0)
menu.add_command(label="Копировать", command=copy)
menu.add_command(label="Вставить", command=paste)

def show_menu(event):
menu.tk_popup(event.x_root, event.y_root)

widget.bind("<Button-3>", show_menu) # ПКМ на Windows/Linux

Дочернее окно (Toplevel)

dialog = tk.Toplevel(root)
dialog.title("Настройки")
dialog.geometry("320x200")
dialog.transient(root)
dialog.grab_set() # модальное

Переменные привязки

КлассТип
StringVarstr
IntVarint
DoubleVarfloat
BooleanVarbool
var = tk.StringVar(value="начало")
entry = tk.Entry(frame, textvariable=var)
var.set("новое")
print(var.get())

Геометрия

widget.pack(side=tk.TOP, fill=tk.X, expand=True, padx=5, pady=5)
widget.grid(row=0, column=1, sticky="ew", padx=4, pady=4)
frame.grid_columnconfigure(1, weight=1)
widget.place(x=10, y=20, width=200)

Частые ошибки

СимптомПричина
Виджет не виденНет pack/grid/place
TclError geometry managerСмешали pack и grid в одном родителе
Кнопка срабатывает при стартеcommand=func() вместо command=func
Картинка пропалаНет ссылки на PhotoImage на self

См. также