2016-04-02 28 views
0

Tkinter Text Widgetを使用してアニメーションを作成しようとしています。テキストウィジェットの各フレームを1秒ごとに書きたいと思っています。ここに私の現在のコードです:Tkinter待機機能が動作していません

from tkinter import * 

frames = ["-o","--o","---o"] 

speed = 1000 
def clear(): 
    text.delete(0.0, END) 

def movie(event): 
    text.delete(0.0, END) 
    for frame in range(len(frames)): 
     text.insert(END, frames[frame]) 
     root.after(speed, clear) 

root = Tk() 
root.title("Animation") 
root.minsize(400,400) 
root.maxsize(width=root.winfo_screenwidth()-20, height=root.winfo_screenheight()-20) 
text = Text(root, highlightcolor="black", highlightbackground="white",width=400, insertbackground="white", height=400, foreground="white", background="black", font="Courier") 
text.pack() 
root.bind("<Return>", movie) 

はしかし、このコードの出力は

-o--o---o 

の代わりに、次のとおりです。

-o[wait a second][clear]--o[wait a second][clear]---o[wait a second][clear] 

私はこれをどのように修正することができますか?

+0

正しく '.after'メソッドを使用していません。 [この回答](http://stackoverflow.com/a/34313194/4014959)の私のコードは役に立つかもしれません。また、http://stackoverflow.com/a/32766256/4014959 –

答えて

0

私の問題が見つかりました! .after()関数はreturn関数のようにほぼ機能します。その中で、呼び出されると、現在の関数が停止されます。これは私の固定コードです:

from tkinter import * 
frame = 0 
frames = ["-o","--o","---o"] 

speed = 1000 
def clear(): 
    text.delete(0.0, END) 

def movie(event=""): 
    global frame 
    if frame < len(frames): 
     text.delete(0.0, END) 
     text.insert(END,frames[frame]) 
     frame += 1 
     root.after(speed, movie) 

def movie1(event): 
    global frame 
    frame = 0 
    movie("<Return>") 

root = Tk() 
root.title("Animation") 
root.minsize(400,400) 
root.maxsize(width=root.winfo_screenwidth()-20, height=root.winfo_screenheight()-20) 
text = Text(root, highlightcolor="black", highlightbackground="white",width=400, insertbackground="white", height=400, foreground="white", background="black", font="Courier") 
text.pack() 
root.bind("<Return>", movie) 
+1

を参照してください。それは 'after()'の仕組みではありません:-)ブロックしたり、 "戻る"ことはありません。 'after()'はある時間後に関数を実行するようにスケジュールしていますが、いくつかの条件で記述したように振る舞うかもしれませんが、明らかに同じではありません! (あなたがJavaScriptを使ったことがあるなら、 'setTimeout()'と考えてください。[this](http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.after-method)も参照してください)。 – Carpetsmoker

+0

しかし、私のoringinal問題はどうやって間違っていましたか?別の答えをしてください。 –

関連する問題