2

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のスレッドやクラスの知識はまだありませんが、それしか解決方法がなければ教えてください!それ以外の場合は、より簡単な方法で管理できれば幸いです!

どうもありがとうございました!

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 に同意します。クリックするたびに座標を設定できるように、必ず座標をグローバルにする必要があります。しかし、必ずしもすぐに脈動を開始する必要はありません。最初のクリックで座標を設定し、グローバル変数「アクティブ」が true に設定されているかどうかを確認できます。そうでない場合は、脈動を開始します。そうでなければ、ただ戻ってください。

于 2013-10-25T13:20:46.827 に答える