如何在tkinter中追踪鼠标移动?<Motion>事件绑定无输出问题求解
问题原因分析
- 第一版代码失效的核心原因是事件绑定对象错误:你将
<Motion>事件绑定到了MyGUI这个Frame子类的实例上,但Frame内部放置的Canvas组件完全填充了Frame的可视区域。鼠标在网格区域移动时,事件只会被当前悬停的Canvas组件捕获,不会触发上层Frame的绑定回调,因此motion方法永远不会执行,自然没有输出也不会抛出错误。 - 修改后的代码能正常运行,是因为你将事件绑定到了顶层窗口
Tk实例上,顶层窗口可以接收其内部所有子组件上触发的鼠标移动事件,所以不管鼠标在窗口内哪个区域移动,都会触发回调逻辑。
符合封装规范的修正方案
你不需要把事件绑定逻辑放到类的外部,也不需要绑定到顶层窗口,只需要把事件绑定到实际需要监听的Canvas组件上即可,既保证所有逻辑都封装在MyGUI类内,也能精准监听网格区域的鼠标动作:
将第一版代码中的self.bind('<Motion>', self.motion)修改为self.canvas.bind('<Motion>', self.motion)即可,其余代码无需调整,运行后就能在鼠标移动过网格时正常输出坐标。
内容的提问来源于stack exchange,提问作者kostas1335
相关产品推荐
相关产品推荐

