我已经设置了一个窗口来注册鼠标运动。如果它后面没有打开其他窗口,则此方法效果很好。当我将鼠标移到窗口外时,Motion 事件自然会停止滚动,并且当我将鼠标悬停在窗口上时将继续注册。
但是,当我将光标悬停在 Tkinter 窗口之外并悬停在另一个窗口上时,当我将鼠标悬停回 Tkinter 窗口时,它不会注册任何 Motion 事件。我错过了一些重要的细节,还是一个错误?如果是错误,是否有已知的解决方法?
import Tkinter as tk
class CursorWindow(tk.Frame):
def __init__(self, width=640, height=400):
self.root = tk.Tk()
self.root.title('Sample application')
self.root.minsize(width, height)
self.root.maxsize(width, height)
tk.Frame.__init__(self, self.root, width=width, height=height, background='black')
self.pack()
self.bind("<Motion>", self.cb)
def cb(self, event):
print "%d, %d" % (event.x, event.y)
w = CursorWindow()
w.mainloop()
这是在 OSX 10.8.3、Python 2.7.2 上
编辑:在这个简单的情况下,解决方法是使用 Frame.grab_set() 强制 Frame 抓住焦点,无论鼠标的位置如何(好像它是一个按钮按下 + 运动事件)。这样,只要窗口处于活动状态,它就永远不会停止传递事件。就我而言,这仍然是一个肮脏的把戏,如果有人有任何其他建议,请告诉我。