如何将两个不同的按钮点击事件绑定到同一个标签,分别为 "<Button-1>" 和 "<Double-Button1>"?
我知道一定有办法解决这个问题,我今天几乎花了一整天在找解决方案,这段代码是我目前找到的最接近的。代码是可以运行的,但有个缺陷就是它永远不会到达 else if 语句,因为在语句中第一个被点击的按钮总是会被判断为真,所以它根本不会走到 else if 的部分。有没有办法把我代码中的前两个语句合并成一个?我觉得这样就能解决这个问题。这段代码是用 tkinter 图形界面库写的。
self.label1.bind("<Double-Button-1>",self._two_click)
self.label1.bind("<Button-1>", self._two_click)
def _two_click(self,event):
if self.label1.bind("<Button-1>"):
self.label1.configure(self.my_timeBB())
elif self.label1.bind("<Double-Button-1>"):
self.label1.configure(text="Blue")
1 个回答
2
我在函数里加了额外的参数来识别点击事件。
顺便说一下,你可以把 <Button-1>
(单击)和 <Double-Button1>
(双击)都绑定到同一个控件上,但用不同的函数来处理吗?
import Tkinter as tk
def test(event, extra=None):
print extra
master = tk.Tk()
b1 = tk.Button(master, text="QUIT", command=master.destroy, width=20, heigh=5)
b1.pack()
b2 = tk.Label(master, text="OK", width=20, heigh=5)
b2.pack()
b2.bind('<Double-Button-1>', lambda event:test(event,101))
b2.bind('<Button-1>', lambda event:test(event,1))
b2.bind('<Button-2>', lambda event:test(event,2))
b2.bind('<Button-3>', lambda event:test(event,3))
master.mainloop()
但是我发现一个(大)问题——当我用鼠标双击的时候,总是会收到两个文本:第一个是单击的,第二个是双击的。
唯一的解决办法是测量点击之间的时间,然后决定是单击还是双击。但这可能还需要用到 after()
函数。
编辑:
只运行单击或双击
import Tkinter as tk
#----------------------------------------------------------------------
single = False
def test(event, extra=None):
global single
#print 'event-num:', event.num
#print 'extra:', extra
if extra == 1:
single = True
master.after(200, single_click)
elif extra == 101:
single = False
click('double click')
def single_click():
global single
if single:
single = False
click('single click')
def click(msg):
print 'It was', msg
#----------------------------------------------------------------------
master = tk.Tk()
b1 = tk.Button(master, text="QUIT", command=master.destroy, width=20, heigh=5)
b1.pack()
b2 = tk.Label(master, text="OK", width=20, heigh=5)
b2.pack()
b2.bind('<Double-Button-1>', lambda event:test(event,101))
b2.bind('<Button-1>', lambda event:test(event,1))
master.mainloop()