如何将两个不同的按钮点击事件绑定到同一个标签,分别为 "<Button-1>" 和 "<Double-Button1>"?

1 投票
1 回答
3150 浏览
提问于 2025-04-18 12:18

我知道一定有办法解决这个问题,我今天几乎花了一整天在找解决方案,这段代码是我目前找到的最接近的。代码是可以运行的,但有个缺陷就是它永远不会到达 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()

撰写回答