0

我已经设置了一个窗口来注册鼠标运动。如果它后面没有打开其他窗口,则此方法效果很好。当我将鼠标移到窗口外时,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 抓住焦点,无论鼠标的位置如何(好像它是一个按钮按下 + 运动事件)。这样,只要窗口处于活动状态,它就永远不会停止传递事件。就我而言,这仍然是一个肮脏的把戏,如果有人有任何其他建议,请告诉我。

4

2 回答 2

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 和本地构建的主干,其他一切都相同(当然,除了更改你的importand print),一切正常。

于 2013-06-26T01:32:11.877 回答
0

这很可能是 OSX 如何处理事件的错误或怪癖。OSX 和 Tk 事件循环不能很好地结合,并且在引擎盖下有很多巫术来尝试使其全部工作。像这样的东西不起作用并不完全令人惊讶。

对于它的价值,按下按钮时跟踪运动似乎工作得很好(例如:<B1-Motion>.

于 2013-06-26T01:28:02.610 回答