2013-06-26 57 views
0

我已經設置了一個窗口來註冊鼠標運動。如果沒有其他窗口打開,這很有效。當我將鼠標移動到窗口外時,Motion事件自然會停止滾動,並且當我將鼠標懸停在窗口上時將繼續註冊。Tkinter窗口在懸停其他窗口後停止註冊運動事件

但是,當我將光標懸停在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()。這樣,只要窗口處於活動狀態,窗口就不會停止傳遞事件。就我而言,這仍然是一個骯髒的伎倆,如果任何人有任何其他建議,請讓我知道。

+0

你可以嘗試綁定''看看你是否得到這個事件?如果你沒有得到'',Tk不會知道你的窗口是應該得到''事件的窗口,所以這就是我們必須追蹤的。如果你得到''但仍然沒有得到'',這是不同的。 – abarnert

+0

另外,請注意,儘管Tk文檔'',Tkinter沒有,並且Effbot文檔(和O'Reilly書)專門說沒有這樣的事件。 ([Shipman's Tkinter reference](http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/event-types.html)特別列出了''),但它可能是一個標誌,人們沒有太多使用它,並沒有注意到錯誤... – abarnert

+0

如果它在tk文檔中記錄(它是),那麼它幾乎肯定是由Tkinter支持的。如果Tkinter明確禁用它,唯一的方法就是不支持它,並且沒有理由爲什麼他們會這樣做。 –

回答

1

從一個位的測試,我認爲這是Tkinter的的與附帶的版本中的錯誤Python 2.7及更早版本

在OS X 10.8.3上使用Apple的Python 2.7.2和Apple的Tcl/Tk 8.5.9,並且我懷疑它是由於<Enter>通常不是直到我點擊窗口,這意味着Tk不知道將<Motion>事件發送到窗口。

蘋果公司的Python 2.6.7和2.5.6,Homebrew 2.7.3,Python.org 2.7.3和Homebrew 2.7.5也發生了同樣的情況。但是,使用自制軟件3.3.1,Python.org 3.3.2和一個本地生成樹幹,其他所有內容相同(當然,除了更改importprint),一切正常。

+0

謝謝,但我恐怕Python 3是不可能的。我可以確認Enter行爲。我會喜歡,但我還沒有足夠的業力。 – boomlinde

+0

我試圖查看錯誤報告和發佈說明,並且無法看到有關此修復程序的任何信息,所以...希望其他人可以找到它並寫出正確的答案。 (只要知道有一個修復程序不會幫助您,除非您可以升級到3.3;確切知道修復程序_does_可能會告訴我們如何解決該問題。) – abarnert

0

這很可能是OSX處理事件的一個錯誤或怪癖。 OSX和Tk事件循環不能很好地齧合,並且有很多Voodoo可以嘗試使所有的工作都能正常工作。像這樣的東西不起作用並不令人驚訝。

對於它的價值,當按下一個按鈕跟蹤運動似乎只是正常工作(如:<B1-Motion>

+0

謝謝,這似乎是一個可能的解釋。事實上,B1-Motion的運作方式應該如此。 – boomlinde