【问题标题】:How would one bind two different button click events to the same label, namely "<Button-1>" and "<Double-Button1>" to same label?如何将两个不同的按钮单击事件绑定到同一个标签,即“<Button-1>”和“<Double-Button1>”到同一个标签?
【发布时间】:2014-07-07 00:04:13
【问题描述】:

所以,我知道必须有办法做到这一点,因为我整天都在努力寻找解决方案,这是我最接近得到它的方法。该代码有效,但缺陷是它永远不会到达 else if 语句,因为在语句中首先单击的任何按钮都将始终为 True,因此它永远不会到达 else if。他们是否以某种方式将我的代码的前两个语句合并为一个,因为我相信这会解决它?这是使用 tkinter GUI。

    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")

【问题讨论】:

  • 你有event,打印出来看看你得到了什么。
  • 抱歉,在普通的 GUI 中,event 中有很多信息,但 Tkinter 很奇怪,没有关于双击或单击的信息。见:effbot.org/tkinterbook/tkinter-events-and-bindings.htm
  • 但也许我有其他解决方案。
  • 这是我在 0 x 0000003473 打印事件 tkinter 事件实例时得到的结果
  • 查看之前评论中的链接 - 有更多关于事件的信息。

标签: python python-2.7 events tkinter


【解决方案1】:

我在函数中使用额外的参数来识别点击。

顺便说一句:您始终可以将&lt;Button-1&gt;&lt;Double-Button1&gt; 绑定到一个小部件,但功能不同?

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

【讨论】:

  • 嗯,考虑到我试图做的事情的目的,我真的不认为这对我来说是一个选择,就像你说的那样使用两个不同的功能来相同的标签?
  • 好的,刚刚尝试了两个函数的方法,它可以工作,但只有一秒钟,然后它切换回 button-1 hmmm 并返回“break”似乎没有帮助
  • 如果您将使用if/else_two_click 一样拆分两种类型的点击,那么使用单独的函数没有区别。但是,如果您对两种类型的点击都有通用代码,那么您需要一个函数或两个只调用一个通用函数的函数:) 但这没问题 - 真正的问题是:每次双击都会生成单击。
  • 所以基本上这无法解决。我想我会开始看别人的 GUIS
  • 唯一的解决方案是在单击(之后使用)等待双击 - 如果没有双击,则可以运行单击。
猜你喜欢
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2017-12-17
相关资源
最近更新 更多