首页 > 解决方案 > Tkinter 将多个滚动条绑定到 MouseWheel

问题描述

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

假设使用应用程序的人有 90% 的时间想要滚动某个帧(我们将称之为 main_frame),并且有 10% 的时间他们想要滚动不同的帧。(正常帧)

仅当用户将鼠标悬停在其上时才让鼠标滚轮滚动 normal_frame 是有意义的,但在所有情况下都让鼠标滚轮滚动 main_frame,除非将鼠标悬停在 normal_frame 上。

问题是,每当您在“ <Enter>”(ing)normal_frame 上调用bind_all 时,当您“ <Leave>”它时,main_frame 不再滚动。有什么建议么?

class ScrollThing(object):

    def __init__(self, some_frame, default=False):
        self.default = default
        self.canvas = tkinter.Canvas(some_frame)
        self.view_window = tkinter.Frame(self.canvas)
        #things and stuff to setup scroll bar


    def setup_view_window(self):
        if self.default:
            self.canvas.bind_all('<MouseWheel>', self.on_mousewheel)
        else:
            self.view_window.bind('<Enter>', self.focus_in)
            self.view_window.bind('<Leave>', self.focus_out)

    def focus_in(self, *args):
        del args
        # I'm a seperate ScrollThing from main_frame
        # I don't have access to the other ScrollThing because
        # we are both dynamically created. 
        # I want to save the current bound arguments somehow
        # but .bindtags() returns only MY bindings

        self.canvas.bind_all('<MouseWheel>', self.on_mousewheel)

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

    def on_mousewheel(self, event):
        self.canvas.yview_scroll(int(-1*(event.delta//120)), 'units')

标签: pythontkinter

解决方案


我刚刚找到了一个解决方案,涉及将函数和画布交还给 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 中的某些东西可以让您查看整个应用程序中的所有绑定事件?


推荐阅读