2017-07-29 39 views
1

我正在嘗試創建一個變得越來越大的圓圈,並且爲此我需要添加一個延遲。我嘗試使用time.sleep(),但發現不起作用,我需要使用.after()。我已經嘗試過讓這個圈子成爲一個功能,但沒有成功。我曾嘗試在創建橢圓之前添加一個lambda,但那也不起作用。無論如何,我可以在新圈子製造之前添加延遲嗎? 謝謝。python 3 tkinter:如何將.after()添加到圖形

我的代碼: -

from tkinter import * 
root = Tk() 

c = Canvas(root, width = 500, height = 500) 
c.pack() 

oval = c.create_oval(0, 0, 1, 1) 

for x in range(2, 200, 5): 
    c.delete(oval) 
    root.after(100, oval = c.create_oval(0, 0, x, x)) 

回答

1

root.after()需要毫秒的延遲和延遲後運行的功能。你試圖做的是在延遲之後運行一個參數爲x(圓的半徑)的函數。問題在於你不能要求它使用輸入來運行函數。

要解決這個問題,你可以使用更新功能,然後全局變量圓等

這爲我工作半徑:

from tkinter import * 
root = Tk() 

c = Canvas(root, width = 500, height = 500, highlightthickness = 0) 
c.pack() 

oval = c.create_oval(0, 0, 1, 1) 
r = 2 

def update(): 
    global r, oval 
    if x < 200: 
     x += 5 
    c.delete(oval) 
    oval = c.create_oval(0, 0, r, r) 
    root.after(100, update) 

update() 
root.mainloop() 

我還添加了一些選項highlightthickness = 0到你的畫布上,否則座標系不匹配,你的圓圈會溢出畫布。

+0

嗨,感謝您的幫助,它解決了我的問題。 root.mainloop()又做了什麼? – Regi

+0

因爲tkinter是一個圖形用戶界面,所以說一個主要的計算程序是不同的。在一個主要的計算程序中,相互依次執行步驟以達成結果。 Tkinter是一個界面,所以必須始終準備好,等待一個不變的循環(root.mainloop),用於任何用戶鼠標點擊或按鍵等。 另外,由於我的解決方案解決了您的問題,請將其標記爲例外答案。 –