首页 > 解决方案 > tkinter 在绑定到 double_click 事件时出现意外行为 - 什么是双击?

问题描述

我将 tk 8.6 与 python 3.5 一起使用。

我正在编写一个应用程序,我需要对单击和双击都进行操作,有时双击可能会非常接近地发生。

tk 文档指出,当您绑定到单击和双击事件时,第一次单击会生成 Button-1 事件,第二次单击会生成 Double-Button-1 事件。这就是我双击一次时观察到的。

当我重复双击时,我希望看到以下事件——单、双、单、双。这就是我在两次双击之间留下明显停顿时看到的内容。当我一个接一个地快速重复时,我看到单,双,双,双。当我放慢操作速度时,看到一个或另一个的阈值大致是用于区分双击和两个单曲的点击间延迟。

似乎 tkinter 将任何从另一个快速跟随的单击视为双击。我本来希望它能够通过是否是双击的第二次单击来限定第一次单击,如果是,则将“第三次”单击视为单击。此行为意味着由一对双击生成的事件序列会根据双倍间延迟而有所不同。

为了获得一致的行为,我的解决方法是停止绑定到双精度,计时单打,并为双击进行我自己的延迟阈值。我认为这比试图解释双打是否“真的”双击要干净。

这种行为是 tkinter 中的错误吗?

在这些情况下,其他 GUI 管理器会做什么?

有没有定义在这些情况下应该发生什么?

/edit/ 我刚刚注意到 tk 还支持三次和四次点击。但是,我仍然认为 tk 的行为有些出人意料。如果我只绑定到单击,那么我的“两次双击”,基本上是四次单击,会生成四个单次事件。因此,我希望仅绑定到单次和双次,它应该仅将单击和双击的四倍解释为单次、双次、单次、双次。我想我最终的程序文档应该提到我不使用三次或四次点击。但是,嘿,我有我的解决方法。//编辑/

/edit2/ 我必须点击三次和四次才能看到会发生什么,但它变得更加错误。我从来没有通过四次点击获得四次事件。我确实收到了一系列单、双、三、双事件。我也有单,双,三,三,与 AFAICS 相同的输入时序。我会坚持只绑定单曲,并做我自己的时间!//编辑2/

标签: python-3.xeventstkinterdouble-click

解决方案


在 Atlas435 的带领下,我现在有了另一种方法来实现问题中要求的“两次双击”。我的解决方法涉及仅绑定到单个事件并手动对其计时,这有点不纯,因为它复制了通过操作系统设置的双击计时设置。DRY的分布式案例。

我不确定动态绑定和解除绑定是否真的是我所追求的,但它很简单,而且确实有效。这正是我想要的一个很好的表达,即“当前一次单击是双击的第二次时,不响应双击”。

import tkinter as tki

root = tki.Tk()

s1 = tki.Label(root, text='click here', width=15, height=3)
s1.pack()

def func2(event):
    print('double')
    s1.unbind('<Double-1>')   

def func1(event):
    print('single')
    s1.bind('<Double-1>', func2)

s1.bind('<Button-1>', func1)

root.mainloop()

推荐阅读