Вы можете использовать привязки <Enter>
и <Leave>
этого виджета для обработки, когда виджет должен выполнять прокрутку.
Выполняя bind_all
с последовательностью <MouseWheel>
, только когда курсор перемещается на него виджет, который можно проверить с помощью <Enter>
привязки последовательности и отмены привязки <MouseWheel>
при перемещении курсора от виджета.
Взгляните на этот пример.
import tkinter as tk
def set_mousewheel(widget, command):
"""Active / deactivate mousewheel scrolling when
cursor is over / not over the widget respectively."""
widget.bind("<Enter>", lambda e: widget.bind_all('<MouseWheel>', command))
widget.bind("<Leave>", lambda e: widget.unbind_all('<MouseWheel>'))
root = tk.Tk()
root.geometry('300x300')
l0 = tk.Label(root, text='Hover and scroll on the labels.')
l0.pack(padx=10, pady=10)
l1 = tk.Label(root, text='0', bg='pink', width=10, height=5)
l1.pack(pady=10)
set_mousewheel(l1, lambda e: l1.config(text=e.delta))
l2 = tk.Label(root, text='0', bg='cyan', width=10, height=5)
l2.pack(pady=10)
set_mousewheel(l2, lambda e: l2.config(text=e.delta))
root.mainloop()
Этот пример отлично работает с прокручиваемым фреймом, созданным с помощью холста, так как основной фрейм внутри холста имеет несколько виджетов, и если мы не используем bind_all
поверх bind
, прокрутка не будет работать, если курсор перемещается по виджету внутри этой прокручиваемой рамки.