Как привязать кручение колесика мыши в 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)
