我写了这个代码,它在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中的线程和类的知识,但如果这是唯一的解决方案,请告诉我!如果可以通过一些更简单的方法进行管理,他们将不胜感激!
非常感谢!
答案 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。如果不是,则开始脉动。否则,只需返回。