Как привязать кручение колесика мыши в Tkinter

Как мне привязать кручение колесика мыши в tkinter ? Я использую Windows


Ответы (2 шт):

Автор решения: S. Nick

Попробуйте так:

import tkinter as tk


def mouse_wheel(event):
    global count
    if event.num == 5 or event.delta == -120:
        count -= 1
    if event.num == 4 or event.delta == 120:
        count += 1
    label['text'] = count
    
count = 0
root = tk.Tk()
root.title('Поверните колесо мыши')
root['bg'] = 'darkgreen'

# Windows 
root.bind("<MouseWheel>", mouse_wheel)

# Linux 
#root.bind("<Button-4>", mouse_wheel)
#root.bind("<Button-5>", mouse_wheel)

label = tk.Label(root, font=('courier', 18, 'bold'), width=10)
label.pack(padx=40, pady=40)
root.mainloop()

введите сюда описание изображения

→ Ссылка
Автор решения: Jack Juno

Я долго бился с подобной проблемой. Делюсь решением: как правильно реализовать прокрутку Canvas колесиком мыши в Tkinter

Основные принципы

Проблема: Колесико мыши не прокручивает содержимое Canvas со scrollable_frame. Решение: Привязать события <MouseWheel>, <Button-4> и <Button-5> к главному фрейму и ко всем виджетам в нем, включая Canvas и его потомков.

Ключевые шаги реализации

Шаг 1: Создаю функцию обработки прокрутки

def _on_mousewheel(event):
    # Нахожу виджет под курсором мыши
    widget = event.widget
    scrollable_widget = None

    # Поднимаюсь по иерархии виджетов, чтобы найти первый прокручиваемый
    while widget:
        # Проверяю, есть ли у виджета методы прокрутки
        if hasattr(widget, 'yview') and hasattr(widget, 'yview_scroll'):
            scrollable_widget = widget
            break
        widget = widget.master

    # Если нашел прокручиваемый виджет, выполняю прокрутку
    if scrollable_widget:
        if event.delta:  # Windows/Mac
            scrollable_widget.yview_scroll(int(-1 * (event.delta / 120)), "units")
        elif event.num == 4:  # Linux - колесо вверх
            scrollable_widget.yview_scroll(-1, "units")
        elif event.num == 5:  # Linux - колесо вниз
            scrollable_widget.yview_scroll(1, "units")

Шаг 2: Рекурсивно привязываю события ко всем виджетам

def _bind_recursive(widget):
    widget.bind("<MouseWheel>", _on_mousewheel)
    widget.bind("<Button-4>", _on_mousewheel)
    widget.bind("<Button-5>", _on_mousewheel)
    for child in widget.winfo_children():
        _bind_recursive(child)

Шаг 3: Применяю привязку после создания всех виджетов

После создания всех виджетов (чтобы к ним применились предыдущие шаги)

_bind_recursive(main_container)
→ Ссылка