[英]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.