绑定到double_click事件时,tkinter的行为异常-什么是双击?

我正在将tk 8.6与python 3.5配合使用。

我正在编写一个需要同时单击和双击的应用程序,有时双击可能会非常靠近地发生。

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

当我重复双击时,我希望看到以下事件-单,双,单,双。这是我在两次双击之间留出明显的停顿时所看到的。当我一个接一个地重复时,我看到一个,一个,一个,一个,另一个。当我放慢操作速度时,看到一个或另一个的阈值大约是区分两次单击与两次单击的单击间延迟。

看来,tkinter会将快速跟随另一个点击的任何点击视为双击。我本来希望它可以通过双击来确定第一次单击是否合格,如果是,则将“第三次”单击视为一次单击。这种行为意味着,两次双击产生的事件顺序会根据两次间隔间的延迟而变化。

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

此行为是tkinter中的错误吗?

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

在这种情况下应该怎么办?

/ edit /我刚刚引起了我的注意,tk也支持三重和四重单击。但是,我仍然认为tk的行为出乎意料。如果仅绑定一次单击,则我的“两次双击”(基本上是四次单击)会生成四个单事件。因此,我希望仅绑定到单击和双击,它应该将单击和双击的四元组仅解释为单击,双击,单个,双击。我想我最终的程序文档应该提到我不使用三次或三次点击。但是,嘿,我有解决方法。 // edit /

/ edit2 /我已经绑定了三次和四次点击,以查看会发生什么,并且它会出现更多的错误。我从来没有四次点击四次事件。我确实收到了一系列的单,双,三,双事件。我也有一个单一,双重,三重,三重,而AFAICS的输入时间相同。我会坚持只绑定单打,并按自己的时间安排! // edit2 /

iCMS 回答:绑定到double_click事件时,tkinter的行为异常-什么是双击?

继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()
,

docs中退出:

“ Double”,“ Triple”和“ Quadruple”修饰符可方便地指定双击鼠标和其他重复事件。它们会导致特定事件模式重复2、3或4次,并在序列上设置时间和空间要求:对于与Double,Triple或Quadruple pattern 模式匹配的事件序列,所有事件必须 发生在时间上靠得很近并且之间没有实质的鼠标移动。例如,<Double-Button-1>等同于<Button-1><Button-1>,但需要更多的时间和空间。

->第 Multiple matches

如果一个特定的事件与多个绑定匹配,并且它们具有相同的标记,则选择最具体的绑定并评估其脚本。为了确定几个匹配序列中的哪一个更具体,应用了以下测试:

(c)如果在一个模式中指定的修饰符是另一模式中修饰符的子集,则具有更多修饰符的模式更为具体。

这应该可行:

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

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

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

修改

它有效,请尝试:

import tkinter as tk

root = tk.Tk()

up = tk.Frame(root)
up.grid(column=0,row=0,columnspan=3,sticky='n')
s1 = tk.Label(up,text='spacer')
s1.pack(fill='both',expand=1)

def func4(event):
    print('Quadruple')
    s1.unbind('<Quadruple-1>')

def func3(event):
    print('triple')
    s1.unbind('<Triple-1>')
    s1.bind('<Quadruple-1>',func4)

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

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

root.mainloop()
本文链接:https://www.f2er.com/1786588.html

大家都在问