2013-05-18 56 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来安排窗口在未来的某个时间隐藏。