我使用tk 8.6和python3.5。
我正在编写一个应用程序,在这个应用程序中,我需要同时执行单次和双次单击,有时双击可以非常接近地发生在一起。
tk文档指出,当您绑定到单个和双击事件时,第一个单击将生成一个Button-1事件,而第二个则会生成一个双Button-1事件。这就是我双击一次时所观察到的。
当我重复双击时,我希望看到以下事件-单、双、单、双。当我在两次双击之间留下一个显著的停顿时,我就看到了这一点。当我快速地重复一遍又一遍时,我看到了一个,一个,两个。当我放慢操作速度时,看到其中一个或另一个的阈值大概是区分双击和两个单打的点击间延迟。
看来,tkinter将任何快速从另一个点击上的点击处理为双击。我希望它能限定第一次点击是否是双击的第二次点击,如果是的话,将“第三次”单击视为一次单击。这种行为意味着双击所产生的事件的顺序取决于双击之间的延迟。
我的解决办法,以获得一致的行为已经停止绑定到双,时间的单曲,并做我自己的延迟阈值双击。我认为这比试图解释双打是否是“真的”双击要干净。
这种行为在tkinter中是个错误吗?
在这种情况下,其他GUI管理人员会做什么呢?
在这种情况下应该发生什么,是否有定义?
/编辑/我刚刚注意到tk也支持三次和四次点击。然而,我仍然认为tk的行为有些出乎意料的东西。如果我只绑定到一次单击,那么我的“两次双击”,基本上是四次单击,就会生成四个单个事件。因此,我希望绑定到单和双,它应该解释一个四倍的单和双点击只为单,双,单,双。我想我的最终程序文档应该提到,我不使用三次或四次点击。但嘿,我有办法了。//编辑/
我一定要点击三次和四次,看看会发生什么,这样会有更多的问题发生。我从来没有得到一个四角点击事件。我确实得到了一系列的单,双,三,双事件。我也有一个单一的,双的,三重的,和AFAICS相同的输入时间。我将坚持只绑定到单曲,并做我自己的时间!//社论2/
发布于 2020-08-08 14:17:31
走出文档
“双”、“三重”和“四重”修饰符可以方便地指定双鼠标单击和其他重复事件。它们会导致特定的事件模式重复2、3或4次,并对该序列提出时间和空间要求:要使事件序列匹配双、三倍或四重模式,所有事件必须在时间上紧密地发生,并且在两者之间没有实质性的鼠标运动。例如,
<Double-Button-1>
与<Button-1><Button-1>
等价,需要额外的时间和空间。
->科https://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm#M55
如果多个绑定匹配某个特定事件,并且它们具有相同的标记,则选择最特定的绑定并对其脚本进行评估。为了确定几个匹配序列中哪一个更具体,应用了以下测试:(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>', func2)
s1.bind('<Button-1>', func1)
root.mainloop()
发布于 2020-08-08 16:26:57
在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()
https://stackoverflow.com/questions/63303203
复制相似问题