Python Tkinter绑定子窗口小部件

时间:2018-07-26 12:24:42

标签: python canvas tkinter binding

我制作了一个tkinter窗口,该窗口由两个可滚动的Canvas隔开,其中包含其小部件。 这两个画布小部件都有自己的滚动条,并且我已经将每个画布上的<MouseWheel>事件绑定到了滚动条。

这导致如果鼠标在画布上,滚动效果很好,但是如果鼠标在画布上的小部件上,则不会激活事件处理程序。 我尝试与bind_all绑定:

canvas1.bind_all("<MouseWheel>",scrollcanvas1)
canvas2.bind_all("<MouseWheel>",scrollcanvas2)

但是它会激活窗口每个部分上的两个事件处理程序,因此对我不起作用。

保持这项工作的另一种方法是使用<Motion>事件,因此,当鼠标悬停在一个画布上时,该事件将激活鼠标悬停在画布上的bind_all功能,并取消激活另一个。

def enablecanvas1():
    canvas1.bind_all("<MouseWheel>",scrollcanvas1)
    canvas2.unbind("<MouseWheel>")

def enablecanvas2():
    canvas2.bind_all("<MouseWheel>",scrollcanvas2)
    canvas1.unbind("<MouseWheel>")

canvas1.bind("<Motion>",enablecanvas1)
canvas2.bind("<Motion>",enablecanvas2)

它运作良好,但是如果画布中的小部件填充了它,事情就会变得复杂,因此它不会留下任何画布表面来将鼠标放在其上并激活处理程序。

那么,有什么方法可以将处理程序绑定到所有canvas子小部件以使其工作?

谢谢。

2 个答案:

答案 0 :(得分:1)

我会说最好的解决方案是使用bind_all。在bound函数中,您首先需要找出鼠标悬停在哪个画布上(和/或哪个画布具有焦点),然后可以滚动该画布。

答案 1 :(得分:1)

这里是如何设置多个滚动画布并将鼠标滚轮绑定到每个滚动画布的示例。我要做的方法是在包含画布的框架的鼠标输入上更改=IF(JOIN("", B2:G2)="", "", "Your Formula")

我将其设置为使每个框架和画布都随窗口扩展,并且无论鼠标在框架内的上方如何,您都可以看到内部的所有滚动方式都很好。

尝试此代码,让我知道您的想法。

bind_all