Python 3.x tkinter在绑定到双击事件时出现意外行为-什么是双击?

Python 3.x tkinter在绑定到双击事件时出现意外行为-什么是双击?,python-3.x,events,tkinter,double-click,Python 3.x,Events,Tkinter,Double Click,我将TK8.6与Python3.5结合使用 我正在编写一个应用程序,在这个应用程序中,我需要同时对单次和双击进行操作,有时双击可以发生在非常近的地方 tk文档指出,当您绑定到single和双击事件时,第一次单击生成一个Button-1事件,第二次单击生成一个double-Button-1事件。这就是我双击一次时观察到的 当我重复双击时,我希望看到以下事件-single,double,single,double。这就是我在两次双击之间留下明显停顿时看到的。当我一个接一个地快速重复时,我看到了单、双

我将TK8.6与Python3.5结合使用

我正在编写一个应用程序,在这个应用程序中,我需要同时对单次和双击进行操作,有时双击可以发生在非常近的地方

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

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

tkinter似乎将从另一个站点快速执行的任何单击视为双击。我本以为它会用是否是双击的第二次单击来限定第一次单击,如果是,则将“第三次”单击视为一次单击。这种行为意味着,一对双击产生的事件序列根据双延迟之间的不同而不同

我获得一致行为的解决方法是停止绑定双击,给单打计时,并为双击做我自己的延迟阈值。我认为这比试图解释双打是否是“真的”双击更清晰

这种行为是tkinter中的错误吗

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

在这种情况下应该发生什么,有没有一个定义

/编辑/我刚刚注意到tk也支持三次和四次单击。然而,我仍然认为tk的行为中有一些意想不到的东西。如果我只绑定到一次单击,那么我的“两次双击”(基本上是四次单击)将生成四个单一事件。因此,我希望在绑定到single和double only时,它应该将single和double clicks的四倍解释为single、double、single、double。我想我最终的程序文档应该提到,我不使用三次或四次单击。但是,嘿,我有我的解决办法//编辑/

/edit2/我已经绑定了三次和四次单击以查看发生了什么,并且它变得更加麻烦。我从来没有通过四次单击获得四次事件。我确实收到了一系列的单、双、三、双事件。我也有一个单,双,三,三,与AFAICS相同的输入时间。我会坚持只绑定到单打,并做我自己的时间//edit2/

超出以下范围:

双重、三重和四重修改器便于指定鼠标双击和其他重复事件。它们导致特定的事件模式重复2、3或4次,并对序列提出时间和空间要求:为了使事件序列匹配双、三或四个模式,所有事件必须 时间紧挨着发生,中间没有实质性的鼠标移动。例如,
相当于具有额外时间和空间要求的

->部分

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

(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)
def func2(事件):
打印('double')
widget.unbind(“”)
def func1(事件):
打印('单个')
widget.bind(“”,func2)
widget.bind(“”,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>', func2)

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

root.mainloop()
将tkinter作为tk导入
root=tk.tk()
向上=tk.帧(根)
grid(column=0,row=0,columnspan=3,sticky='n')
s1=tk.Label(向上,text='spacer')
s1.打包(填充=两个,展开=1)
def func4(事件):
打印(“四倍”)
s1.解除绑定(“”)
def func3(事件):
打印('triple')
s1.解除绑定(“”)
s1.绑定(“”,func4)
def func2(事件):
打印('double')
s1.解除绑定(“”)
s1.绑定(“”,func3)
def func1(事件):
打印('单个')
s1.绑定(“”,func2)
s1.绑定(“”,func1)
root.mainloop()

在Atlas435的指导下,我现在有了另一种方法来实现问题中提出的“两次双击”。我的解决方法是只绑定单个事件并手动计时,这有点不纯,因为它复制了通过操作系统设置的双击计时设置。一种分布式的干电池

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

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()
将tkinter作为tki导入
root=tki.Tk()
s1=tki.Label(根,text='click here',宽度=15,高度=3)
s1.pack()
def func2(事件):
打印('double')
s1.解除绑定(“”)
def func1(事件):
打印('单个')
s1.绑定(“”,func2)
s1.绑定(“”,func1)
root.mainloop()

我认为这不是一个意外事件,三次单击将生成两次
双击事件。@jizhaosama所以听起来我的预期是错误的。三次点击在什么系统上生成两次双击?是的,谢谢Atlas,我已经阅读了文档。看看我对这篇文章的编辑。嗯,我用python:p编辑了你的答案,所以请检查我是否真的格式化了你的文章,或者对你的文章犯了一些错误,please@Cool云看起来很完美,谢谢。不知道如何在我的手机上标记代码:D@Atlas435谢谢现在,我已经克服了动态绑定和解除绑定的恐惧,它确实代表了