Python 2.7 Tkinter:如何单击并释放两个小部件并从两个小部件获得响应?

Python 2.7 Tkinter: how do I click & release on two widgets and get responses from both?

我希望你能帮助我解决我在 python 2.7 中遇到的问题。我在网上找不到解决方案,但老实说我不确定要搜索什么关键字,所以如果这是多余的,我很抱歉。

下面的代码是我的问题的一个例子。

import Tkinter as tk

root = tk.Tk()

#Widgets.
btn1 = tk.Label(root, text="btn1", bg="gray80")
btn2 = tk.Label(root, text="btn2", bg="gray80")
btn1.pack(side=tk.TOP, fill=tk.X)
btn2.pack(side=tk.TOP, fill=tk.X)

#Widget events.
def onClick1(event):
    print "Clicked button 1."
def onRelease1(event):
    print "Released button 1."
def onClick2(event):
    print "Clicked button 2."
def onRelease2(event):
    print "Released button 2."

#Bindings.
btn1.bind("<Button-1>", onClick1, add="+")
btn1.bind("<ButtonRelease-1>", onRelease1, add="+")
btn2.bind("<Button-1>", onClick2, add="+")
btn2.bind("<ButtonRelease-1>", onRelease2, add="+")

root.mainloop()

每当我单击一个按钮(技术上是一个标签)并按住它时,它的 onClick 事件就会触发,但是如果我将鼠标拖到另一个按钮上并释放它,我会得到与我单击的按钮相同的 onRelease ,而不是我当前将鼠标悬停的标签。这让我耽搁了一段时间,我不想在我的程序中放弃我需要它的整个功能,所以任何帮助将不胜感激。

释放事件总是在获得按下事件的同一个小部件上触发。在您的处理程序中,您可以询问 tkinter 光标下的小部件是什么。

示例:

import Tkinter as tk

root = tk.Tk()

btn1 = tk.Label(root, text="btn1", bg="gray80")
btn2 = tk.Label(root, text="btn2", bg="gray80")
btn1.pack(side=tk.TOP, fill=tk.X)
btn2.pack(side=tk.TOP, fill=tk.X)

def onRelease(event):
    x,y = event.widget.winfo_pointerxy()
    widget = event.widget.winfo_containing(x, y)
    print("widget:", widget.cget("text"))

btn1.bind("<ButtonRelease-1>", onRelease)
btn2.bind("<ButtonRelease-1>", onRelease)

root.mainloop()