Python:如何在函数内停止循环函数?

时间:2013-10-25 12:49:06

标签: python

我写了这个代码,它在tkinter中创建了一个椭圆。当用鼠标点击时,椭圆会为自己创建新坐标,然后开始脉动。

它是这样的: 1.椭圆是默认创建的 2.单击,调用“单击”功能 3.点击功能生成新坐标,绘制椭圆,然后启动脉动循环效果。 4.现在我应该能够并且可以再次点击脉动的椭圆形,将椭圆移动到一个新的位置,然后再次循环新的椭圆形(脉动)。

    def click(event):
        pick = 2
        counter = 0
        esimene_x1 = randint(0, w-100)
        esimene_y1 = randint(0, h-100)
        teine_x1 = esimene_x1
        teine_y1 = esimene_y1
        canvas.coords(circle1, esimene_x1, esimene_y1, teine_x1, teine_y1)
        pulsate(esimene_x1, esimene_y1, teine_x1, teine_y1, pick, counter)

    def pulsate(esimene_x1, esimene_y1, teine_x1, teine_y1, pick, counter):
        if pick % 2 == 0:
            esimene_x1 -= 1
            esimene_y1 -= 1
            teine_x1 += 1
            teine_y1 += 1
            counter += 1
            if counter == 40:
                pick += 1
        elif pick % 2 != 0:
            esimene_x1 += 1
            esimene_y1 += 1
            teine_x1 -= 1
            teine_y1 -= 1
            counter -=1
            if counter == 0:
                pick += 1
        s = esimene_x1, esimene_y1, teine_x1, teine_y1, pick, counter
        canvas.coords(circle1, esimene_x1,esimene_y1,  teine_x1,teine_y1)
        raam.after(50, pulsate, *s)

然而,当我再次点击脉动的椭圆形时,它有点像虫子,它看起来像循环脉动效果的前一个功能仍在做它的事情,新的脉动开始于不同的坐标。所以,我的问题是,当函数在函数中时,如何停止循环(脉动)函数,并且我想再次启动第一个函数。 (创建,新坐标并开始脉动)

这是您可以运行的文件,看看到底发生了什么:

https://mega.co.nz/#!e5pj0brC!QW6R4X9WTshOCh3FTybLrQu_oI0OOU6wL5QI61punUE

另外,如果您看到其他任何似乎导致此错误的内容,请告诉我们。我还没有获得python中的线程和类的知识,但如果这是唯一的解决方案,请告诉我!如果可以通过一些更简单的方法进行管理,他们将不胜感激!

非常感谢!

2 个答案:

答案 0 :(得分:1)

这不是错误。您的click方法触发pulsate方法,然后再次触发自身。如果您再次致电click,它会再次触发pulsate,但这是pulsate的另一个“实例”(缺少一个更好的术语),没有引用另一个,同时运行

相反,您应该使用global变量来保存椭圆坐标。然后,您的click方法会设置这些坐标,例如global oval; oval = esimene_x1, esimene_y1, teine_x1, teine_y1,但不会触发pulsate。相反,pulsate在应用程序启动时调用一次,然后再次触发自身,就像在代码中一样。椭圆坐标不作为参数传递给pulsate,而是从全局变量读取。

答案 1 :(得分:0)

我同意@tobias_k对他出错的评估。你绝对需要你的坐标是全局的,所以每次点击都可以设置它们。但是你不一定需要马上开始搏动。您可以在第一次单击时设置坐标,然后检查全局变量“active”是否设置为true。如果不是,则开始脉动。否则,只需返回。