簡體   English   中英

Tkinter:正確使用root.after()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM