Практические примеры использования tkinter: от простого к сложному
Основные примеры кода tkinter
Наиболее эффективное решение для быстрого старта - создание простого окна с меткой и кнопкой. Это позволяет освоить базовый цикл событий и размещение виджетов.
import tkinter as tk
root = tk.Tk()
root.title("\u041c\u043e\u0435 \u043e\u043a\u043d\u043e")
label = tk.Label(root, text="\u041f\u0440\u0438\u0432\u0435\u0442, \u043c\u0438\u0440!")
label.pack()
root.mainloop()вывод окна python (создание окна с выводом в python)
\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435: tk.Tk() созда\u0451т корневое окно. pack() - менеджер геометрии, размещающий виджет. mainloop() запускает цикл обработки событий. Без него окно мгновенно закроется.
mainloop() - окно не отображается. Импорт tkinter вместо tk в Python 3 (раньше был Tkinter).\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435?
import tkinter as tk
def say_hello():
print("\u041f\u0440\u0438\u0432\u0435\u0442!")
root = tk.Tk()
btn = tk.Button(root, text="\u041d\u0430\u0436\u043c\u0438 \u043c\u0435\u043d\u044f", command=say_hello)
btn.pack()
root.mainloop()открыть окно python (открыть окно на python)
\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435: Параметр command принимает ссылку на функцию (без скобок). При нажатии кнопки вызывается say_hello.
command=say_hello(), функция выполнится сразу, а не при нажатии. Для передачи аргументов используют lambda.\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u0441 \u043f\u043e\u043b\u0435\u043c \u0432\u0432\u043e\u0434\u0430 \u0438 \u0432\u044b\u0432\u043e\u0434\u043e\u043c?
import tkinter as tk
root = tk.Tk()
entry = tk.Entry(root)
entry.pack()
label = tk.Label(root, text="")
label.pack()
def show_text():
label.config(text=entry.get())
btn = tk.Button(root, text="\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c", command=show_text)
btn.pack()
root.mainloop()
Python окно (создание окон в python tkinter)
\u0426\u0435\u043b\u044c: Считывание текста из Entry и обновление Label. Метод get() возвращает строку, config изменяет свойства виджета.
label отобразит пустую строку. Для проверки можно добавить условие. Использование StringVar() упрощает отслеживание изменений.\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 grid?
import tkinter as tk
root = tk.Tk()
for i in range(3):
for j in range(3):
btn = tk.Button(root, text=f"{i},{j}")
btn.grid(row=i, column=j, padx=5, pady=5)
root.mainloop()Python tkinter canvas (холст canvas в tkinter)
\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435: grid() размещает виджеты в ячейках таблицы. Параметры padx/pady добавляют отступы.
pack() - нельзя смешивать разные менеджеры в одном контейнере. Забытые аргументы row/column приведут к наложению.\u041a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043c\u0435\u043d\u044e?
import tkinter as tk
root = tk.Tk()
menubar = tk.Menu(root)
root.config(menu=menubar)
file_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="\u0424\u0430\u0439\u043b", menu=file_menu)
file_menu.add_command(label="\u0412\u044b\u0445\u043e\u0434", command=root.quit)
root.mainloop()Python tkinter frame (фрейм frame в tkinter)
\u0426\u0435\u043b\u044c: Создание выпадающего меню. tearoff=0 убирает пунктирную линию для отрыва меню.
root.config(menu=menubar).\u041a\u0430\u043a \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e \u043d\u0430 Canvas?
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=300, bg="white")
canvas.pack()
canvas.create_line(50, 50, 200, 150, fill="blue", width=3)
root.mainloop()Python tkinter messagebox (messagebox в tkinter)
\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435: create_line(x1, y1, x2, y2) рисует отрезок. Координаты отсчитываются от верхнего левого угла.
scrollregion для большого содержимого.\u041a\u0430\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430?
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
def open_file():
file_path = filedialog.askopenfilename()
if file_path:
print(f"\u0412\u044b\u0431\u0440\u0430\u043d: {file_path}")
btn = tk.Button(root, text="\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b", command=open_file)
btn.pack()
root.mainloop()\u0426\u0435\u043b\u044c: Использование стандартного диалога открытия файла. askopenfilename возвращает путь к выбранному файлу.
mainloop() может нарушить цикл.\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 tkinter
\u041f\u0440\u0438\u043c\u0435\u0440 1: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ttk.Themed виджетов
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
style = ttk.Style()
style.theme_use("clam") # \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u044b
btn = ttk.Button(root, text="\u0422\u0435\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430")
btn.pack()
root.mainloop()\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043a\u043d\u043e \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439, \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043d\u043e\u0439 \u0432 \u0441\u0442\u0438\u043b\u0435 "clam". \u0414\u0440\u0443\u0433\u0438\u0435 \u0442\u0435\u043c\u044b: 'default', 'classic', 'vista' (Windows), 'alt', 'winnative'.
\u041f\u0440\u0438\u043c\u0435\u0440 2: \u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e after
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=300, bg="white")
canvas.pack()
ball = canvas.create_oval(10, 10, 40, 40, fill="red")
dx = 2
dy = 0
def move_ball():
global dx
canvas.move(ball, dx, dy)
x1, y1, x2, y2 = canvas.coords(ball)
if x2 >= 400:
dx = -dx
if x1 <= 0:
dx = -dx
root.after(20, move_ball)
root.after(20, move_ball)
root.mainloop()\u041e\u043a\u043d\u043e Canvas \u0441 \u043a\u0440\u0430\u0441\u043d\u044b\u043c \u0448\u0430\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u0438 \u043e\u0442\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0435\u0442 \u043e\u0442 \u0433\u0440\u0430\u043d\u0438\u0446 (п\u0440\u043e\u0441\u0442\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f).
\u041f\u0440\u0438\u043c\u0435\u0440 3: \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448 \u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043c\u044b\u0448\u0438
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0443", font=("Arial", 16))
label.pack()
def on_key(event):
label.config(text=f"\u041d\u0430\u0436\u0430\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430: {event.char}")
def on_mouse(event):
label.config(text=f"\u041c\u044b\u0448\u044c \u043d\u0430 ({event.x}, {event.y})")
root.bind("", on_key)
root.bind("", on_mouse)
root.mainloop() \u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043b\u044e\u0431\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442 \u043c\u0435\u0442\u043a\u0438 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b, \u0430 \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u043c\u044b\u0448\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0443\u0440\u0441\u043e\u0440\u0430.
\u041f\u0440\u0438\u043c\u0435\u0440 4: \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0441 ttk.Notebook
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
notebook = ttk.Notebook(root)
notebook.pack(fill="both", expand=True)
frame1 = ttk.Frame(notebook)
frame2 = ttk.Frame(notebook)
notebook.add(frame1, text="\u0412\u043a\u043b\u0430\u0434\u043a\u0430 1")
notebook.add(frame2, text="\u0412\u043a\u043b\u0430\u0434\u043a\u0430 2")
ttk.Label(frame1, text="\u042d\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430").pack()
ttk.Label(frame2, text="\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430").pack()
root.mainloop()\u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043a\u043d\u043e \u0441 \u0434\u0432\u0443\u043c\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430\u043c\u0438, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043c\u0435\u0442\u043a\u0443.