如果鼠标滚轮位于滚动条所在的框架中,如何使用鼠标滚轮在 Tkinter 中滚动?

Tea*_*ast 2 python tkinter scrollbar tkinter-canvas

我知道有.bind这个.bind_all方法,但是这两个方法都存在问题。如果您使用.bind,则仅当光标位于该框架的空白区域时它才会滚动。如果你使用.bind_all,无论你的鼠标在哪里,只要你使用鼠标滚轮,它就会滚动。有没有办法仅当光标位于某个帧时才用鼠标滚轮滚动它?

Saa*_*aad 8

您可以使用<Enter><Leave>绑定该小部件来处理小部件何时应具有鼠标滚轮滚动。

仅当光标移动到该小部件上时才使用bind_all序列<MouseWheel>,可以使用<Enter>序列绑定进行检查,并<MouseWheel>在光标移离小部件时取消绑定。

看看这个例子。

import tkinter as tk


def set_mousewheel(widget, command):
    """Activate / deactivate mousewheel scrolling when 
    cursor is over / not over the widget respectively."""
    widget.bind("<Enter>", lambda _: widget.bind_all('<MouseWheel>', command))
    widget.bind("<Leave>", lambda _: 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()
Run Code Online (Sandbox Code Playgroud)

此示例非常适合使用画布创建的可滚动框架,因为画布内的主框架有多个小部件,如果我们不使用bind_allover bind,则当光标移动到该可滚动框架内的小部件上时,滚动将不起作用。