Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么不是';淡入动画不工作,但淡出动画工作?_Python_Animation_Tkinter_Fadein_Fadeout - Fatal编程技术网

Python 为什么不是';淡入动画不工作,但淡出动画工作?

Python 为什么不是';淡入动画不工作,但淡出动画工作?,python,animation,tkinter,fadein,fadeout,Python,Animation,Tkinter,Fadein,Fadeout,我是python新手,我想到了如何使用tkinter和时间模块在python中制作一个简单的淡入淡出动画。我为程序定义了两个动画:一个淡入淡出。“淡出”动画效果完美,完全符合我的要求,但是,“淡入”动画根本不起作用。在while循环完成之前,程序几乎不会显示。我是做错了什么,还是根本无法在python tkinter中创建淡入效果? 以下是我的代码片段: from tkinter import * import time root = Tk() transparency = 0 while t

我是python新手,我想到了如何使用tkinter和时间模块在python中制作一个简单的淡入淡出动画。我为程序定义了两个动画:一个淡入淡出。“淡出”动画效果完美,完全符合我的要求,但是,“淡入”动画根本不起作用。在while循环完成之前,程序几乎不会显示。我是做错了什么,还是根本无法在python tkinter中创建淡入效果? 以下是我的代码片段:

from tkinter import *
import time

root = Tk()
transparency = 0
while transparency <= 1:
    transparency += 0.1
    root.wm_attributes("-alpha", transparency)
    time.sleep(0.03)


def fade():
    t = 1
    while t > 0:
        t -= 0.1
        root.wm_attributes("-alpha", t)
        time.sleep(0.03)
    root.destroy()


btn = Button(root, text='fade exit', command=fade).pack()
root.mainloop()
从tkinter导入*
导入时间
root=Tk()
透明度=0
虽然透明度为0:
t-=0.1
root.wm_属性(“-alpha”,t)
睡眠时间(0.03)
root.destroy()
btn=按钮(root,text='fade exit',command=fade).pack()
root.mainloop()

使用
后(毫秒,函数)
和递归,而不是在
循环和
时间时使用

奖金:

  • 使用函数参数自定义淡入淡出效果和行为
  • 这不会阻止根目录的更新
  • 一切都被封装起来了
  • 这些功能可用于任何
    Toplevel
    窗口
  • applyFades
    在一次调用中管理所有内容
如果您确实需要将这些功能附加到
按钮
,只需像这样分配
命令
参数:
命令=lambda:fadeOut(root)

window.py

''' Fade In
    @window ~ the window to affect
    @millis ~ the amount of milliseconds to wait before next recursion
    @inc    ~ the amount to increment alpha on each recursion
'''
def fadeIn(window, millis:int=50, inc:float=0.1):
    alpha = float(window.attributes('-alpha')) + inc
    window.attributes('-alpha', alpha)
    if alpha < 1:
        window.after(millis, lambda: fadeIn(window, millis, inc))
    else:
        window.attributes('-alpha', 1.0)


''' Fade Out
    @window, @millis ~ see: Fade In
    @dec     ~ the amount to decrement alpha on each recursion
    @destroy ~ True|False destroy the window when effect is complete
'''
def fadeOut(window, millis:int=50, dec:float=0.1, destroy:bool=True):
    alpha = float(window.attributes('-alpha')) - dec
    window.attributes('-alpha', alpha)
    if alpha > 0:
        window.after(millis, lambda: fadeOut(window, millis, dec, destroy))
    else:
        window.attributes('-alpha', 0.0)
        if destroy:
            window.destroy()
            
            
''' Assign All Fades In One Call
    @window, @millis, @inc  ~ see: Fade In
    @dec, @destroy          ~ see: Fade Out
    @close ~ True|False add fadeOut effect to window close button
'''
def applyFades(window, millis:int=50, inc:float=0.1, dec:float=0.1, destroy:bool=True, close:bool=True):
    window.attributes('-alpha', 0.0)
    window.after(millis, lambda: fadeIn(window, millis, inc))
    if close:
        window.protocol("WM_DELETE_WINDOW", lambda: fadeOut(window, millis, dec, destroy))

        

不要使用
while
循环和
时间
,而是使用
after(millis,function)
和递归

奖金:

  • 使用函数参数自定义淡入淡出效果和行为
  • 这不会阻止根目录的更新
  • 一切都被封装起来了
  • 这些功能可用于任何
    Toplevel
    窗口
  • applyFades
    在一次调用中管理所有内容
如果您确实需要将这些功能附加到
按钮
,只需像这样分配
命令
参数:
命令=lambda:fadeOut(root)

window.py

''' Fade In
    @window ~ the window to affect
    @millis ~ the amount of milliseconds to wait before next recursion
    @inc    ~ the amount to increment alpha on each recursion
'''
def fadeIn(window, millis:int=50, inc:float=0.1):
    alpha = float(window.attributes('-alpha')) + inc
    window.attributes('-alpha', alpha)
    if alpha < 1:
        window.after(millis, lambda: fadeIn(window, millis, inc))
    else:
        window.attributes('-alpha', 1.0)


''' Fade Out
    @window, @millis ~ see: Fade In
    @dec     ~ the amount to decrement alpha on each recursion
    @destroy ~ True|False destroy the window when effect is complete
'''
def fadeOut(window, millis:int=50, dec:float=0.1, destroy:bool=True):
    alpha = float(window.attributes('-alpha')) - dec
    window.attributes('-alpha', alpha)
    if alpha > 0:
        window.after(millis, lambda: fadeOut(window, millis, dec, destroy))
    else:
        window.attributes('-alpha', 0.0)
        if destroy:
            window.destroy()
            
            
''' Assign All Fades In One Call
    @window, @millis, @inc  ~ see: Fade In
    @dec, @destroy          ~ see: Fade Out
    @close ~ True|False add fadeOut effect to window close button
'''
def applyFades(window, millis:int=50, inc:float=0.1, dec:float=0.1, destroy:bool=True, close:bool=True):
    window.attributes('-alpha', 0.0)
    window.after(millis, lambda: fadeIn(window, millis, inc))
    if close:
        window.protocol("WM_DELETE_WINDOW", lambda: fadeOut(window, millis, dec, destroy))

        

让我们看看你的脚本做了什么。在开始时分配,它启动一个tcl/tk解释器并创建一个根窗口。然后控制其“不透明度”属性淡入。之后,在根窗口上放置一个按钮小部件,该窗口具有以下属性:

  • “淡出”文本写在小部件的顶部
  • 它等待鼠标单击,然后在控制根窗口的不透明度属性后淡出
最后,是一个替代品

while True:
    root.update_idletasks()
    root.update()
您可能会注意到“淡入”按钮是在根窗口未更新时创建的。这就是为什么你不能看到实际的淡入

解决方案1。每次淡入后更新根窗口:

from tkinter import *
import time

def fade():
    t = 1
    while t > 0:
        t -= 0.1
        root.wm_attributes("-alpha", t)
        time.sleep(0.03)
    root.destroy()

root = Tk()
transparency = 0
btn = Button(root, text='fade in', command=fade)
btn.pack()

while transparency <= 1:
    transparency += 0.1
    root.wm_attributes("-alpha", transparency)
    root.update_idletasks()
    root.update()
    time.sleep(0.03)

btn.configure(text='fade exit') #I guess no new button is needed and text should be replaced only
root.mainloop()
从tkinter导入*
导入时间
def fade():
t=1
当t>0时:
t-=0.1
root.wm_属性(“-alpha”,t)
睡眠时间(0.03)
root.destroy()
root=Tk()
透明度=0
btn=按钮(根,text='fade-in',command=fade)
btn.pack()

透明度让我们看看你的脚本做了什么。在开始时分配,它启动一个tcl/tk解释器并创建一个根窗口。然后控制其“不透明度”属性淡入。之后,在根窗口上放置一个按钮小部件,该窗口具有以下属性:

  • “淡出”文本写在小部件的顶部
  • 它等待鼠标单击,然后在控制根窗口的不透明度属性后淡出
最后,是一个替代品

while True:
    root.update_idletasks()
    root.update()
您可能会注意到“淡入”按钮是在根窗口未更新时创建的。这就是为什么你不能看到实际的淡入

解决方案1。每次淡入后更新根窗口:

from tkinter import *
import time

def fade():
    t = 1
    while t > 0:
        t -= 0.1
        root.wm_attributes("-alpha", t)
        time.sleep(0.03)
    root.destroy()

root = Tk()
transparency = 0
btn = Button(root, text='fade in', command=fade)
btn.pack()

while transparency <= 1:
    transparency += 0.1
    root.wm_attributes("-alpha", transparency)
    root.update_idletasks()
    root.update()
    time.sleep(0.03)

btn.configure(text='fade exit') #I guess no new button is needed and text should be replaced only
root.mainloop()
从tkinter导入*
导入时间
def fade():
t=1
当t>0时:
t-=0.1
root.wm_属性(“-alpha”,t)
睡眠时间(0.03)
root.destroy()
root=Tk()
透明度=0
btn=按钮(根,text='fade-in',command=fade)
btn.pack()

“嗨,”迈克尔!希望你有一个伟大的一天!非常感谢您提供的代码片段!这对我来说是成功的!然而,我真的想知道为什么我的代码不起作用。这仅仅是因为我使用了时间睡眠还是我的整个算法都错了?我真的很想知道。谢谢@Omid Ketabollahi是的。while循环正在停止mainloop运行,直到完成为止。实际上,您阻止了gui的更新。当您需要睡眠时,请使用
after()
。嗨,@Michael!希望你有一个伟大的一天!非常感谢您提供的代码片段!这对我来说是成功的!然而,我真的想知道为什么我的代码不起作用。这仅仅是因为我使用了时间睡眠还是我的整个算法都错了?我真的很想知道。谢谢@Omid Ketabollahi是的。while循环正在停止mainloop运行,直到完成为止。实际上,您阻止了gui的更新。当您需要睡眠时,请使用
after()
。简单的修复方法是在
time.sleep(…)
之前添加
root.update()
。简单的修复方法是在
time.sleep(…)
之前添加
root.update()