我正在尝试创建一个Calltip(当你输入并保持一个左括号时,IDLE会创建什么):
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()
我想让它显示鼠标在哪里...但是,它总是出现在我的屏幕的左下角...任何原因,我该如何解决这个问题?
答案 0 :(得分:1)
我不知道这是否特别是问题,但一个问题肯定是你不止一次打电话给__init__
。只有在实例化对象时才能自动调用该方法。我不确定在幕后还发生了什么(可能没什么好处),但这会导致每次显示calltip时都会创建一个新的Toplevel窗口,从而有效地创建内存泄漏。
另一个问题是你正在呼叫sleep
。你永远不应该在GUI中调用sleep
因为它会这样做:导致整个程序冻结。相反,使用after
来安排在将来的某个时刻隐藏窗口。