【问题标题】:How to use the mouse wheel to scroll in Tkinter, if it's in the frame the scrollbar is in?如何使用鼠标滚轮在 Tkinter 中滚动,如果它在滚动条所在的框架中?
【发布时间】:2020-11-24 03:56:33
【问题描述】:

我知道有.bind.bind_all 方法,但是这两个方法都有问题。如果您使用.bind,则只有当您的光标位于该框架的空白处时,它才会滚动。如果您使用.bind_all,则鼠标在任何位置,如果您使用鼠标滚轮,它将滚动。有没有办法只在光标在某个帧时才用鼠标滚轮滚动?

【问题讨论】:

  • 通常在需要和支持滚动的小部件上使用bind()Frame 不是支持滚动的小部件。
  • 我不是指 Frame 小部件中的框架。我的意思是它通常作为框架小部件(例如 Canvas 和 LabelFrame)。此外,将 .bind() 与 Canvas 一起使用对 Frame 执行相同的操作。滚动条正在工作,它的绑定不是
  • 您需要在您希望鼠标滚轮滚动工作的所有小部件上使用.bind(例如,在画布中滚动的框架中的标签)。

标签: python tkinter scrollbar tkinter-canvas


【解决方案1】:

您可以使用该小部件的<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()

这个例子非常适用于用画布创建的可滚动框架,因为画布内的主框架有多个小部件,如果我们不使用bind_all 而不是bind,那么如果光标移动,滚动将不起作用该可滚动框架内的小部件。

【讨论】:

  • 谢谢。这完美地回答了我的问题。
  • 完全被低估且非常有帮助的答案,干杯@Saad!
猜你喜欢
  • 2023-03-06
  • 2011-09-18
  • 1970-01-01
  • 2019-11-26
  • 2013-06-25
  • 2021-05-18
  • 1970-01-01
相关资源
最近更新 更多