Справочник по Tkinter — элементы UI
Назначение
Пошаговые рецепты: импорт → создать → разместить → обработчик. Каркас приложения — в Первая программа на Tkinter, теория — Tkinter и GUI. Готовые примеры с построчным разбором — Tkinter — окна и виджеты. Общие названия элементов — Архитектура десктопных приложений; UI-поток и потоки — Особенности разработки десктопных приложений.
Как пользоваться
- Создайте
root = tk.Tk()и контейнер (frame = tk.Frame(root)), как в Первая программа на Tkinter. - Найдите нужный элемент ниже, скопируйте блок в свой
frame(илиroot). - В конце файла оставьте
root.mainloop(). - Для учебных мини-проектов (калькулятор, блокнот, список задач) см. галерею 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 (меню)
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() # модальное
Переменные привязки
| Класс | Тип |
|---|---|
StringVar | str |
IntVar | int |
DoubleVar | float |
BooleanVar | bool |
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 |
См. также
- Tkinter и GUI · Первая программа · Tkinter — окна и виджеты
- C# WinForms и WPF — простые окна — те же элементы UI на .NET
- Архитектура десктопа — элементы UI · раздел "Десктопные приложения" · Особенности разработки десктопных приложений