首页 文章

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

提问于
浏览
0

我已经设置了一个窗口来注册鼠标移动 . 如果后面没有其他窗口打开,这很有效 . 当我将鼠标移动到窗口外时,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上

EDIT: 在这个简单的例子中,解决方法是使用Frame.grab_set()强制Frame grab 焦点,无论鼠标的位置如何(就像它是一个按钮向下运动事件) . 这样,窗口永远不会停止传递事件,只要它有关,这仍然是一个肮脏的把戏,如果有人有任何其他建议,请让我知道 .

2 回答

  • 0

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

    对于OS X 10.8.3上的Apple 's Python 2.7.2 and Apple' s 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

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

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

相关问题