Кнопки в Tkinter: создание, настройка, обработка событий

Раздел: GUI -> Tkinter

Основы работы с кнопками в Tkinter

Главный способ добавить кнопку - использовать класс Button из модуля tkinter. Кнопка отображается в окне и может выполнять действие при нажатии. Ниже приведён минимальный пример.


import tkinter as tk

root = tk.Tk()
btn = tk.Button(root, text='Нажми меня')
btn.pack()
root.mainloop()
  

Python self tkinter (использование self в tkinter)

Эта программа создаёт окно с кнопкой, но при нажатии ничего не происходит. Чтобы добавить реакцию, используется параметр command.


def say_hello():
    print('Привет!')

btn = tk.Button(root, text='Нажми меня', command=say_hello)
  

Tkinter python buttons (кнопки в tkinter (англ.))

Теперь при каждом нажатии в консоль выводится сообщение. Параметр command принимает имя функции (без скобок).

Частая ошибка:

Если написать command=say_hello(), функция вызовется сразу при создании кнопки, а не при нажатии. Передавайте только ссылку на функцию.

Как изменить текст или цвет кнопки после её создания?

Для динамического изменения свойств кнопки используйте методы config или прямой доступ к атрибуту через словарь btn['text'].


def change_text():
    btn.config(text='Новый текст')
    btn['bg'] = 'yellow'

btn = tk.Button(root, text='Исходный', command=change_text)
btn.pack()
  

Python tkinter label (метка (label) в tkinter)

Свойства bg (фон), fg (цвет текста), font и другие меняются аналогично.

Некоторые старые версии Tkinter требуют перерисовки окна после изменения - добавьте root.update().

Как разместить изображение на кнопке?

Используйте объект PhotoImage и передайте его в параметр image.


from tkinter import PhotoImage

img = PhotoImage(file='icon.png')
btn = tk.Button(root, image=img, command=some_func)
btn.pack()
  

Python tkinter entry (поле ввода (entry) в tkinter)

Обратите внимание: переменная img должна быть сохранена (например, как атрибут виджета или глобальная переменная), иначе сборщик мусора удалит изображение.

Изображение не отображается, если переменная img локальная и выходит из области видимости. Решение: присвойте изображение самому виджету: btn.image = img.

Как отключить кнопку (сделать недоступной)?

Установите состояние 'disabled' или верните 'normal'.


def toggle_button():
    if btn['state'] == 'normal':
        btn.config(state='disabled')
    else:
        btn.config(state='normal')
  

Python tkinter приложение (создание приложения на tkinter)

Отключенная кнопка не реагирует на нажатия и выглядит бледнее.

Как привязать клавишу на клавиатуре к нажатию кнопки?

Метод bind позволяет привязать любое событие (например, нажатие клавиши Enter) к функции. Внутри функции можно программно «нажать» кнопку с помощью btn.invoke().


def on_enter(event):
    btn.invoke()

root.bind('<Return>', on_enter)
  

Python tkinter programs (примеры программ на tkinter)

Теперь при нажатии Enter будет выполняться команда кнопки.

Событие <Return> срабатывает только при фокусе на окне. Если нужно глобально перехватывать клавиши, используйте привязку к корневому окну.

Как передать аргументы в функцию обработчика?

Прямая передача аргументов через command=func(arg) не работает. Используйте lambda или functools.partial.


def greet(name):
    print(f'Привет, {name}!')

btn = tk.Button(root, text='Сказать привет', command=lambda: greet('Вася'))
  

Python tkinter line (рисование линий в tkinter)

Внутри lambda можно вызывать нужную функцию с конкретными аргументами.

Ошибка замыкания: если lambda создаётся в цикле, переменная цикла будет иметь последнее значение. Решение - использовать аргумент по умолчанию: lambda i=i: func(i).

Как создать стилизованную кнопку с помощью ttk?

Модуль ttk предоставляет кнопки с нативным стилем. Они поддерживают темы оформления.


from tkinter import ttk

style = ttk.Style()
style.theme_use('clam')
btn = ttk.Button(root, text='Стильная кнопка')
btn.pack()
  

Python tkinter окно (создание окна в tkinter)

Для изменения внешнего вида используйте configure стиля. Например, изменить цвет фона:


style.configure('TButton', background='lightblue')
  

Python tkinter таблицы (создание таблиц в tkinter python)

Не все темы одинаково поддерживаются на разных платформах. Проверяйте тему clam, alt или default.

Как добавить подсказку (tooltip) при наведении на кнопку?

В Tkinter нет встроенной подсказки, но её легко реализовать через события <Enter> и <Leave>.


def show_tooltip(event):
    tooltip = tk.Label(root, text='Это кнопка', bg='yellow')
    tooltip.place(x=event.x_root, y=event.y_root)
    btn.tooltip = tooltip

def hide_tooltip(event):
    if hasattr(btn, 'tooltip'):
        btn.tooltip.destroy()

btn.bind('<Enter>', show_tooltip)
btn.bind('<Leave>', hide_tooltip)
  

Для более аккуратного решения используйте сторонние библиотеки, например, tkinter-tooltip.

- Python интерфейс tkinter (интерфейс tkinter в python)
- Python приложение для windows (создание окна с помощью tkinter)

Расширенные примеры с кнопками

Динамическое создание сетки кнопок

Создаётся 9 кнопок (3x3), каждая выводит свой номер при нажатии. Используется цикл с lambda и аргументом по умолчанию для избежания замыкания.

Пример

import tkinter as tk

root = tk.Tk()
for i in range(3):
    for j in range(3):
        number = i * 3 + j + 1
        btn = tk.Button(root, text=f'Кнопка {number}',
                        command=lambda n=number: print(f'Нажата кнопка {n}'))
        btn.grid(row=i, column=j, padx=5, pady=5)
root.mainloop()
  

Результат: окно с девятью кнопками, каждая при нажатии выводит в консоль свой номер.

(Консоль) Нажата кнопка 5
Нажата кнопка 2
...
  

Кнопка с изменением цвета при наведении

События Enter и Leave меняют цвет кнопки, создавая эффект подсветки.

Пример

def on_enter(e):
    btn['bg'] = 'lightgreen'
def on_leave(e):
    btn['bg'] = 'SystemButtonFace'  # стандартный цвет

btn = tk.Button(root, text='Наведи мышку')
btn.bind('<Enter>', on_enter)
btn.bind('<Leave>', on_leave)
btn.pack(pady=20)
  

При наведении кнопка становится зелёной, при уходе - возвращает стандартный цвет.

Кнопка с таймером: изменение текста через заданные интервалы

Используется метод after для планирования действий. Кнопка меняет текст каждые 500 мс.

Пример

import tkinter as tk

root = tk.Tk()
counter = 0

def update_text():
    global counter
    counter += 1
    btn.config(text=f'Счётчик: {counter}')
    root.after(500, update_text)  # рекурсивный вызов

btn = tk.Button(root, text='Старт')
btn.pack(pady=20)
root.after(500, update_text)
root.mainloop()
  

Через полсекунды после старта текст кнопки начнёт обновляться каждые 500 мс, пока окно открыто.

Важно не забыть остановить рекурсивный вызов при закрытии окна. Обычно в простых примерах проблем нет, но в сложных используйте флаги.

Кнопка, открывающая новое окно (Toplevel)

При нажатии создаётся дочернее окно с сообщением.

Пример

def open_window():
    win = tk.Toplevel(root)
    win.title('Новое окно')
    tk.Label(win, text='Привет из нового окна!').pack(padx=20, pady=20)
    tk.Button(win, text='Закрыть', command=win.destroy).pack()

btn = tk.Button(root, text='Открыть окно', command=open_window)
btn.pack(pady=20)
  

После нажатия появляется новое окно с текстом и кнопкой закрытия.

Использование ttk.Button с настраиваемой темой и картинками

Создание кнопки с иконкой и нестандартным стилем.

Пример

from tkinter import ttk
from tkinter import PhotoImage

root = tk.Tk()
style = ttk.Style()
style.theme_use('clam')
style.configure('Custom.TButton', font=('Arial', 12, 'bold'), foreground='darkblue')

img = PhotoImage(file='ok.png')
btn = ttk.Button(root, text='Готово', image=img, compound='left', style='Custom.TButton')
btn.image = img  # сохраняем ссылку
btn.pack(pady=20)
root.mainloop()
  

Результат: стилизованная кнопка с иконкой слева от текста, синим шрифтом и увеличенным шрифтом.

Кнопка с контекстным меню (правый клик)

Привязывается событие правого клика мыши (<Button-3>).

Пример

def show_context_menu(event):
    menu = tk.Menu(root, tearoff=0)
    menu.add_command(label='Копировать', command=lambda: print('Копировать'))
    menu.add_command(label='Вставить', command=lambda: print('Вставить'))
    menu.post(event.x_root, event.y_root)

btn = tk.Button(root, text='Правая кнопка мыши')
btn.bind('<Button-3>', show_context_menu)
btn.pack(pady=20)
  

При клике правой кнопкой мыши на кнопке появляется всплывающее меню.

Анимация кнопки с помощью after и изменения размеров

Плавное увеличение кнопки при нажатии (имитация «вспухания»).

Пример

def animate_grow():
    global size
    size += 2
    btn.config(width=size, height=size//2)
    if size < 20:
        root.after(50, animate_grow)

size = 10
btn = tk.Button(root, text='Расти!', command=animate_grow, width=10, height=5)
btn.pack(pady=20)
  

При каждом нажатии кнопка увеличивается в размерах до определённого предела. Обратите внимание, что width и height измеряются в символах, поэтому анимация не идеальна, но демонстрирует принцип.

Кнопки в Tkinter (англ.) - comments

En
Tkinter python buttons (python)