フェードアニメーションの後でプログラムが閉じないのはなぜですか?

Aug 16 2020

私はPythonを初めて使用し、GUIプログラムのwm_attributesを制御してページをフェードアウトさせる方法についてこのアイデアを思いつきました。反復ごとに「a」の量を0.1ずつ減らすこのコードを作成し、プログラムは0.1秒間スリープ状態になり、このフェード効果を作成します。ページが完全に透明になった後、ルートを破棄するように指示しました。ただし、フェードアニメーションは完全に機能しますが、ウィンドウがフリーズし、アニメーションの完了後にウィンドウが閉じません。私はここで何が間違っているのですか?これが私のコードです:

from tkinter import *
import time


root = Tk()


def animation():
    a = 1
    while a != 0:
        a -= 0.1
        root.wm_attributes("-alpha", a)
        time.sleep(0.1)
    root.destroy()


btn = Button(root, text='Fade out', command=animation)
btn.pack()
root.mainloop()

回答

3 MasoudRahimi Aug 16 2020 at 13:26

あなたにはwhile、ループ、a変数は、正確な到達することはありません0値をので、あなたのループが終了することはありません。aが正であるかどうかを確認するか、減算に整数値を使用する必要があります。

Pythonはバイナリ浮動小数点演算を使用します。詳細については、こちらをご覧ください。

from tkinter import *
import time


root = Tk()


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


btn = Button(root, text='Fade out', command=animation)
btn.pack()
root.mainloop()