在悬停其他窗口后,Tkinter窗口停止注册Motion事件

时间:2013-06-26 01:05:29

标签: python macos tkinter tk

我已经设置了一个窗口来注册鼠标移动。如果后面没有其他窗口打开,这很有效。当我将鼠标移动到窗口外时,Motion事件将自然停止,并且当我将鼠标悬停在窗口上时将继续注册。

但是,当我将光标悬停在Tkinter窗口和另一个窗口之外时,当我将鼠标悬停在其上时,Tkinter窗口将不会记录任何Motion事件。我错过了一些重要的细节,还是一个错误?如果它是一个bug,是否有一个已知的解决方法?

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无论鼠标的位置(如同按下按钮+运动事件)都使用Frame来获取焦点。 grab_set()。这样,只要窗口处于活动状态,窗口就永远不会停止传递事件。就我而言,这仍然是一个肮脏的伎俩,如果有人有任何其他建议,请告诉我。

2 个答案:

答案 0 :(得分:1)

通过一些测试,我认为这是Python 2.7及更早版本附带的Tkinter版本中的一个错误。

在OS X 10.8.3上使用Apple的Python 2.7.2和Apple的Tcl / Tk 8.5.9,我有完全相同的问题。并且,正如我所怀疑的那样,它是由<Enter>引起的,直到我点击窗口才会传递,这意味着Tk不知道将<Motion>事件传递给窗口。

Apple的Python 2.6.7和2.5.6,Homebrew 2.7.3,Python.org 2.7.3和Homebrew 2.7.5也是如此。

然而,使用Homebrew 3.3.1,Python.org 3.3.2和本地构建中继,其他一切都相同(当然,除了更改importprint之外)一切正常。

答案 1 :(得分:0)

很可能这是OSX如何处理事件的错误或怪癖。 OSX和Tk事件循环不能很好地融合,并且有很多伏都教可以尝试让它全部工作。这样的事情不起作用并不奇怪。

对于它的价值,按下按钮时跟踪动作似乎工作正常(例如:<B1-Motion>