2017-07-29 87 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),用于任何用户鼠标点击或按键等。 另外,由于我的解决方案解决了您的问题,请将其标记为例外答案。 –