2

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

它是这样的: 1.默认创建椭圆 2.单击时,调用函数“click” 3.click函数生成新坐标,绘制椭圆,然后开始脉动循环效果。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中的线程和类的知识,但如果这是唯一的解决方案,请告诉我!如果可以使用一些更简单的方法进行管理,其他人将不胜感激!

非常感谢!

4

2 回答 2

1

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

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

于 2013-10-25T13:13:43.220 回答
0

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

于 2013-10-25T13:20:46.827 回答