关闭tkinter python之前,窗口的平滑褪色

问题描述

我用tkinter做了一个简单的工具提示,并添加了淡入淡出效果,但是代码有问题:

import tkinter as tk
import time

class ToolTips():
    def __init__(self,widget,text,triggerkey='<Enter>',releasekey='<Leave>'):
        self.widget = widget
        self.text = text
        self.bg = '#ffffe0'
        self.widget.bind(triggerkey,self.add)
        self.widget.bind(releasekey,self.remove)
        self.widget.bind('<ButtonPress>',self.remove)
        
    def add(self,event):
        self.master = tk.Toplevel(bg=self.bg)
        self.master.geometry(f'+{event.x_root}+{event.y_root}')
        self.master.overrideredirect(1)
        self.master.attributes('-topmost',True)
        self.frame = tk.Frame(self.master,bg=self.bg,highlightbackground="black",highlightcolor="black",highlightthickness=1)
        self.frame.pack()
        self.label = tk.Label(self.frame,text=self.text,justify=tk.LEFT)
        self.label.pack(padx=1,pady=3)
    
    def remove(self,*args):
        alpha = self.master.attributes('-alpha')
        if alpha > 0:
            alpha -= 0.5
            self.master.attributes('-alpha',alpha)
            self.master.after(100,self.remove)
        else:
            self.master.destroy()

#USAGE OF CLASS
root = tk.Tk()

l = tk.Label(root,text='Hover',font=('hevletica',21))
l.pack()
l.focus_force()

obj = ToolTips(l,text='There is alot more to this? Are you curIoUs?\nBla Bla...')

root.mainloop()

这里remove()应该会产生淡入淡出的效果,但是它并不干净,有时如果您离开标签并输入标签的时间超过100毫秒,那么工具提示不会被破坏并且会一直存在直到应用程序完全退出。因此,是否有任何简单的方法(如果没有)来实现此工具提示的平滑淡入淡出。也可以随时指出代码中的其他错误:)

答案here具有淡入淡出的效果,但是我似乎无法用我的代码实现它。

预先感谢:D

解决方法

尝试使用selected_a = 0 selected_b = 0 q1 = input(''' Question 1 a) Yes b) No ''') q2 = input(''' Question 2 a) Yes b) No ''') q3 = input(''' Question 3 a) Yes b) No ''') if q1 or q2 or q3 == 'a': selected_a += 1 else: selected_b += 1 if selected_a < 2 print('Sample a') 。 为了提高效率,每次将鼠标悬停在文本上时都无需创建after_cancel。只需将Toplevel设置为0。

-alpha
,

您遇到的问题是在确保最后一个销毁之前创建了一个新的工具提示。因此,有时您的参考文献可能会松散。为了避免这种情况,您需要跟踪最新消息并在制作新消息之前销毁它。

import tkinter as tk
import time

class ToolTips():
    def __init__(self,widget,text,triggerkey='<Enter>',releasekey='<Leave>'):
        self.widget = widget
        self.text = text
        self.bg = '#ffffe0'
        self.widget.bind(triggerkey,self.add)
        self.widget.bind(releasekey,self.remove)
        self.widget.bind('<ButtonPress>',self.remove)
        self.recent = None
        
    def add(self,event):
        if self.recent != None:
            self.recent.destroy()
        self.master = tk.Toplevel(bg=self.bg)
        self.master.geometry(f'+{event.x_root}+{event.y_root}')
        self.master.overrideredirect(1)
        self.master.attributes('-topmost',True)
        self.frame = tk.Frame(self.master,bg=self.bg,highlightbackground="black",highlightcolor="black",highlightthickness=1)
        self.frame.pack()
        self.label = tk.Label(self.frame,text=self.text,justify=tk.LEFT)
        self.label.pack(padx=1,pady=3)
        self.recent=self.master
    
    def remove(self,*args):
        alpha = self.master.attributes('-alpha')
        if alpha > 0:
            alpha -= 0.5
            self.master.attributes('-alpha',alpha)
            self.master.after(100,self.remove)
        else:
            self.master.destroy()

#USAGE OF CLASS
root = tk.Tk()

l = tk.Label(root,text='Hover',font=('hevletica',21))
l.pack()
l.focus_force()

obj = ToolTips(l,text='There is alot more to this? Are you curious?\nBla Bla...')

root.mainloop()