Практические примеры использования 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() запускает цикл обработки событий. Без него окно мгновенно закроется.

\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438: Забытый 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.

\u041e\u0448\u0438\u0431\u043a\u0438: Если написать 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 изменяет свойства виджета.

\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b: Если поле ввода пустое, 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 добавляют отступы.

\u041e\u0448\u0438\u0431\u043a\u0438: Конфликт с 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 убирает пунктирную линию для отрыва меню.

\u041e\u0448\u0438\u0431\u043a\u0438: Меню не появится, если не привязать его к окну через 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) рисует отрезок. Координаты отсчитываются от верхнего левого угла.

\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b: Если холст меньше рисунка, линия может обрезаться. Используйте 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 возвращает путь к выбранному файлу.

\u041e\u0448\u0438\u0431\u043a\u0438: В Windows окно может скрываться за другими. Вызов диалога до mainloop() может нарушить цикл.
- Python file select (диалог выбора файла в python (tkinter.filedialog))
- Python tkinter игра (игра на tkinter)
- Python калькулятор tkinter (калькулятор на tkinter)

\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.

Примеры кода tkinter - comments

En
Python tkinter код (python)