2017-01-15 17 views
0

after()関数を使用してy軸に沿って10ピクセルごとに を移動させる発射体を作成したいとします。 私がやった最初の試みはこれです:Tkinter:root.after()を適切に使用する

def muovi(self, root): 
    i = 0 
    while i < 10: 
     i += 1 
     self.parent.move(self.colpo, 0, 10) 
     root.after(1000) 

問題は、それが完全にのみの終わりに働くself.parent.move(self.colpo、0、10) を、無視するということですループ。 はその後、私はこれを試してみました:

def muovi(self, root): 
     self.parent.move(self.colpo, 0, 10) 
     root.after(1000, self.muovi(root)) 

コードがあれば代わりのroot.after(1000年、self.muovi(ルート))self.muovi(ルート))があるように実行この時間は、だから私は再帰エラーを即座に得る。

root.after()は正常に動作しますか?

答えて

1

このコード:

root.after(1000, self.muovi(root)) 

は、このコードと機能的に同じです:

result = self.muovi(root) 
root.after(1000, result) 

あなたが問題を参照していますか?あなたはであり、self.muoviとなり、結果はafterになります。代わりに、の参照self.muoviを指定する必要があります。追加の位置指定引数は、参照に続く引数として使用できます。

root.after(1000, self.muovi, root) 
1

1000ミリ秒後に呼び出される関数が指定されていないため、最初のコードが機能しません。

afterで期待される第2引数がボタンのcommandオプションのように機能するため、2番目のコードが機能しません。ここで

は一例です:

from tkinter import Tk, Canvas, Button 

def move(): 
    canvas.move(circle, 0, 10) 
    root.after(1000, move) # the second argument as to be a function, not move() 

root = Tk() 

canvas = Canvas(root) 
canvas.pack(fill='both', expand=True) 
circle = canvas.create_oval(10,10,30,30, fill='red') 

Button(root, text="Start", command=move).pack() 

root.mainloop()