Tkinter将多个滚动条绑定到MouseWheel

时间:2019-07-24 20:49:49

标签: python tkinter

我正在构建使用多个滚动条的东西。此类实际上是tk.ScrollBar的包装,并且用于创建可滚动框架。我想要的是能够设置“默认”滚动容器。

假设90%的时间使用该应用程序的人想要滚动某个帧(我们将其称为main_frame),而10%的时间他们希望滚动一个不同的帧。 (normal_frame)

只有当用户将鼠标悬停在normal_frame上时,才使鼠标滚轮滚动normal_frame是有意义的,但是在所有情况下,除非将鼠标悬停在normal_frame上,否则鼠标滚轮都可以滚动main_frame。

问题在于,无论何时在normal_frame上调用bind_all时,当在<Enter>上调用bind_all时,main_frame都不再滚动。有什么建议吗?

<Leave>

2 个答案:

答案 0 :(得分:0)

我刚刚找到了一个解决方案,涉及将功能和画布交还给Master。

class Master(object)

    def __init__(self, *args, **kwargs):
        #Things and stuff
        self.default_scroll = None

然后通过设置default_scroll保留默认参数

def setup_view_window(self):
    if self.default:
        self.canvas.bind_all('<MouseWheel>', self.on_mousewheel)

        # HERE
        self.dynamic.stuff.MASTER.default_scroll = [self.canvas, self.on_mousewheel]

    else:
        self.view_window.bind('<Enter>', self.focus_in)
        self.view_window.bind('<Leave>', self.focus_out)

然后您可以在focus_out中访问它。

def focus_out(self, *args):
    self.canvas.unbind_all('<MouseWheel>', self.on_mousewheel)

    # HERE
    if self.dynamic.stuff.MASTER.default_scroll is not None:
        self.dynamic.stuff.MASTER.default_scroll[0].bind_all('<MouseWheel>', self.dynamic.stuff.MASTER.default_scroll[1])

尽管,我很想知道是否有人知道以更简洁的方式访问它的方法,也许是tkinter中的某些东西可以让您查看整个应用程序中所有绑定的事件?

答案 1 :(得分:0)

可以说,最简单的解决方案是将变量设置为要滚动的小部件,然后设置全局绑定以滚动该小部件。

例如,您的应用将像这样完全初始化绑定一次:

self.root.bind_all("<MouseWheel>", self.scroller)

然后,在滚动器中滚动默认窗口:

def scroller(self, event):
    self.default_window.yview(...)

如果您愿意,也可以将绑定添加到画布本身,而不用调用bind_all。基本概念仍然有效,而不必在输入/离开事件上调整绑定。