簡體   English   中英

根據鼠標事件將窗口放置在Tkinter中

[英]Position a window in Tkinter based off of mouse event

我正在嘗試創建一個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()

我希望它顯示在鼠標的任何位置...但是,它始終出現在屏幕的左上角...原因何在,我該如何解決?

我不知道這是否是專門的問題,但是一個問題肯定是您多次調用__init__ 實例化對象時,該方法只能自動調用一次。 我不確定幕后還發生了什么(可能沒有好處),但這每次您顯示調用提示時都會創建一個新的Toplevel窗口,從而有效地導致了內存泄漏。

另一個問題是您正在呼叫sleep 您永遠不要在GUI中調用sleep ,因為它將完全做到這一點:導致整個程序凍結。 而是使用after來安排將來隱藏窗口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM