【问题标题】:Smooth fading of window before closing tkinter python在关闭 tkinter python 之前平滑淡入窗口
【发布时间】:2021-01-06 19:47:29
【问题描述】:

我用 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,bg=self.bg,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

【问题讨论】:

    标签: python tkinter widget fade


    【解决方案1】:

    尝试使用after_cancel。 为提高效率,鼠标悬停该文本时无需每次创建Toplevel,只需将-alpha设置为0即可。

    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.hide_status = None
    
            self.master = tk.Toplevel(bg=self.bg)
            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, bg=self.bg, justify=tk.LEFT)
            self.label.pack(padx=1, pady=3)
            self.master.attributes('-alpha', 0)
    
        def add(self, event):
            self.master.attributes('-alpha', 1)
            self.master.geometry(f'+{event.x_root}+{event.y_root}')
    
        def remove(self, event, alpha=1):
            if alpha > 0:
                alpha -= 0.01
                self.master.attributes('-alpha', alpha)
                if self.hide_status:
                    self.master.after_cancel(self.hide_status)
                self.hide_status = self.master.after(10, lambda : self.remove(event=None, alpha=alpha))
            else:
                self.master.attributes('-alpha', 0)
    
    
    # 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()
    
    

    【讨论】:

    • 哦,是的,我现在明白了效率部分,谢谢,但是渐变看起来很漂亮,你知道的……不平滑。有什么想法吗?
    • @CoolCloud 如果是这样,只是减少延迟并改变alpha的变化,我已经编辑了。
    【解决方案2】:

    您遇到的问题是您在确定最后一个被销毁之前创建了一个新的工具提示。因此,您的参考资料有时可能会丢失。为避免这种情况,您需要跟踪最近的并在制作新的之前将其销毁。

    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,bg=self.bg,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()
    

    【讨论】:

    • 感谢您的回答,非常感谢!
    • 不客气。刚刚回答以明确问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多