python - 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')
解决方案
我刚刚找到了一个解决方案,涉及将函数和画布交还给 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 中的某些东西可以让您查看整个应用程序中的所有绑定事件?
推荐阅读
- c# - 使用 ASP.NET Core MVC 项目的服务器计算
- php - 为什么符号链接在 laravel 中的 php artisan serve 中不起作用
- python - Solve for eigenvectors "manually" using Sympy
- docker - exec_start, exec_die 事件频繁发生
- html - 使用 jQuery 修改视图树
- python - Python - Pandas:如何从 url 保存 csv 文件
- node.js - 如何从节点打开屏幕键盘(tabtip.exe)上的窗口
- ruby-on-rails - 在 Rails 应用程序中找不到活动管理员 Trumbowyg @import 错误
- reactjs - useEffect localStorage 循环
- c++ - GoogleTest 编译时出现 MT_StaticRelease 错误