2013-10-25 37 views
2

我写了这个代码,它在tkinter中创建一个椭圆。当用鼠标点击时,椭圆形为自己创建新的坐标,然后开始脉动。Python:如何停止函数内的循环函数?

它是这样的:1, 椭圆默认情况下 2.1936点击创建一个功能“点击”被称为 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线程和类的知识,但如果这是唯一的解决方案,请让我知道!否则,将不胜感激,如果它可以用一些更简单的方法来管理!

非常感谢!

回答

1

这没什么问题。您的click方法会触发pulsate方法,然后再次自行触发。如果再次调用click,则会再次触发pulsate,但这是另一个“实例”pulsate(缺少更好的术语),而没有提及另一个,同时运行。

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

+0

嘿,伙计,非常感谢:D!作品像魅力<3 :) – user2919805

0

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