我正在构建使用多个滚动条的东西。此类实际上是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>
答案 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
。基本概念仍然有效,而不必在输入/离开事件上调整绑定。