[英]Tkinter: use root.after() properly
我想創建一個射彈,使用after()函數沿其y軸每10像素移動一次。 我做的第一個嘗試是:
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))
這次的代碼運行起來就像是if而不是root.after(1000,self.muovi(root))有self.muovi(root)) ,所以我立即得到了遞歸錯誤 。
如何讓root.after()正常工作?
您的第一段代碼不起作用,因為您尚未指定將在1000 ms之后調用的函數。
第二段代碼不起作用,因為after
期望的第二個參數是一個函數,就像按鈕的command
選項一樣。
這是一個例子:
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()
這段代碼:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.