2013-05-18 93 views
0

我想創建一個Calltip的(什麼IDLE,當你進入,並保持開放的括號創建):位置設在Tkinter的一個窗口關閉鼠標事件

class Calltip: 
    '''Creates a window similar to IDLE's call-tips''' 
    def __init__(self, widget, text, howLong = 100): 
     self.widget, self.text, self.howLong = widget, text, howLong 
     self.master = Toplevel(self.widget) 
     self.master.wm_overrideredirect(1) 
     self.label = Label(self.master, text = self.text) 
     self.label.pack() 
     self.label.update() 
     self.x, self.y, self.posX, self.posY = self.label.winfo_width(), self.label.winfo_height(), self.widget.winfo_rootx(), self.widget.winfo_rooty() 
     self.master.geometry("{xSize}x{ySize}+{x}+{y}".format(xSize = self.y, ySize = self.x, x = self.posX, y = self.posY)) 
     self.widget.bind("<Enter>", (lambda event: self.show(event))) 

    def show(self, event): 
     '''Shows the calltip''' 
     print 'called' 
     self.__init__(self.widget, self.text, self.howLong) 
     self.master.geometry("+{x}+{y}".format(x = event.x_root, y = event.y_root)) 
     time.sleep(self.howLong/100) 
     self.hide() 

    def hide(self): 
     '''Hides the calltip''' 
     self.master.destroy() 

我想讓它顯示無論鼠標...但是,它總是出現在我的屏幕的左下角......任何原因,以及如何解決這個問題?

回答

1

我不知道這是否是特別的問題,但有一個問題肯定是你不止一次地致電__init__。該方法應該只在實例化對象時自動調用一次。我不確定封面下面還發生了什麼(可能沒有什麼好處),但是這會導致每次顯示calltip時都會創建一個新的Toplevel窗口,從而有效地創建內存泄漏。

另一個問題是您打電話給sleep。您不應該在GUI中調用sleep,因爲它會這樣做:導致您的整個程序凍結。相反,使用after來安排窗口在未來的某個時間隱藏。