簡體   English   中英

關閉前 window 的平滑衰減 tkinter python

[英]Smooth fading of window before closing 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,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()應該會產生淡入淡出效果,但它並不干凈,有時如果您離開 label 並以快於 100 毫秒的速度輸入 label,則工具提示不會破壞並將永遠留在那里,直到應用程序完全完成退出。 那么有沒有什么簡單的方法(如果沒有的話)來實現此工具提示的平滑淡入淡出。 也請隨時指出代碼中的其他錯誤:)

這里的答案有淡入淡出的效果,但我似乎無法用我的代碼實現它。

先謝謝了

嘗試使用after_cancel 為了提高效率,鼠標hover這個文本時,不需要每次都創建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()

您遇到的問題是您在確定最后一個被銷毀之前創建了一個新的工具提示。 因此,您的參考有時可能會丟失。 為避免這種情況,您需要跟蹤最近的並在制作新的之前銷毀它。

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()

暫無
暫無

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

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