Как использовать колесо мыши для прокрутки в Tkinter, если оно находится в кадре, в котором находится полоса прокрутки? - PullRequest
2 голосов
/ 04 августа 2020

Я знаю, что есть методы .bind и .bind_all, но есть проблемы с обоими из них. Если вы используете .bind, он будет прокручиваться, только если ваш курсор находится в пустом месте этого фрейма. Если вы используете .bind_all, в любом месте, где находится ваша мышь, она будет прокручиваться, если вы используете колесо мыши. Есть ли способ прокручивать его колесом мыши, только когда курсор находится в определенном кадре?

1 Ответ

3 голосов
/ 04 августа 2020

Вы можете использовать привязки <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, прокрутка не будет работать, если курсор перемещается по виджету внутри этой прокручиваемой рамки.

...