如何在Python Tkinter中指定完整的单击

Roo*_*han 1 python tkinter mouseevent

当指针位于窗口小部件上时,当用户按下鼠标按钮时,以下python行将绑定方法"click"到事件; 无论指针在释放按钮时在哪里.

self.bind('<Button-1>',self.click)
Run Code Online (Sandbox Code Playgroud)

如果我在代码中使用"ButtonRelease"而不是"Button",似乎将在按钮释放后按下鼠标的小部件调用方法"click" ; 无论你在哪里释放它.

1-只有在我的小部件上发布了鼠标按钮时才有一种简洁的方法来调用绑定方法; 无论在哪里按下?

2-是不是有简洁的方法告诉它只有在完全点击的情况下做出反应(在同一个小部件上按下并释放)?

Ale*_*lli 5

1-只有在我的小部件上发布了鼠标按钮时才有一种简洁的方法来调用绑定方法; 无论在哪里按下?

2-是不是有简洁的方法告诉它只有在完全点击的情况下做出反应(在同一个小部件上按下并释放)?

没有"整洁"的方式,因为,正如Tkinter的文档所说:

当您在窗口小部件上按下鼠标按钮时,Tkinter将自动"抓取"鼠标指针,然后只要按住鼠标按钮,鼠标事件就会发送到当前窗口小部件.

并且你的两个欲望与按下时自动抓取鼠标指针是不相容的(我不知道如何禁用 - 我认为可能无法禁用,但证明负面是很难的;-).

因此,您需要更多的工作和非"整洁"的解决方案:在按钮事件的回调中,绑定输入和离开事件(到类实例的绑定方法,您可以在其中跟踪鼠标当前是在内部还是内部该窗口以及按钮释放的感兴趣的小部件; 这样,当发布事件发生时,你知道是否执行"实际的应用程序回调"(如果在里面)或什么也不做(如果在外面) - 这给你你想要的数字2,但是把它描述为整洁将是一个伸展.

欲望数字1更难,因为您必须在每个感兴趣的小部件上跟踪进入和离开事件 - 仅仅知道一个位是不够的,无论鼠标是在内部还是外部,而是您必须跟踪哪个小部件(如果任何)它当前在,按钮释放时正确指导"实际应用程序回调"(如果有的话).

虽然内部结构不是很整洁,但每个功能都可以绑定到一个整齐的呼叫功能......稍微有点"内乱"的内部(这个术语更常用于指根管工作等,而不是编程,但是当你想要反对在框架中硬编码的功能时,这可能是合适的......这是框架的缺点 - 只要你想要表现出来,你就处于三叶草中他们支持,但是当你想要打败他们通常的行为来做一些完全不同的事情时,那几乎不可能"整洁"! - ).