在Tkinter中基于鼠标的位置调整窗口

2024-05-29 03:43:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个调用提示(当您输入并保留一个左括号时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()

我想让它显示鼠标在哪里。。。但是,它总是出现在我屏幕的左角。。。有什么原因吗?我该怎么解决这个问题?在


Tags: textselfmastereventinitdefwidgetlabel
1条回答
网友
1楼 · 发布于 2024-05-29 03:43:42

我不知道这是否是具体的问题,但有一个问题肯定是您多次调用__init__。该方法只应在对象实例化时自动调用一次。我不确定在幕后发生了什么(可能没有什么好消息),但这会导致每次显示调用提示时都会创建一个新的顶层窗口,从而导致内存泄漏。在

另一个问题是您正在调用sleep。永远不要在GUI中调用sleep,因为它确实会这样做:导致整个程序冻结。相反,使用after来安排在将来某个时间隐藏窗口。在

相关问题 更多 >

    热门问题