2017-03-29 11 views
0

ゲームループを使用する通常のイベント駆動型プログラムと同様に動作するPython Turtleプログラムを作成しようとしています。プログラムは以下のようにマウス、キーボード、タイマーのイベントをミックスしようとします。Python turtleプログラムでのイベントの混合

私の問題は、pythonはontimer()ループとonkey()イベントを混在させることができないようです。実行すると、プログラムはカメをアニメーション化し、onclick()イベントが機能します。キーを押しても、マウスを最初にクリックするまで登録されません。その後、キーを押して終了すると、シェルの大きなエラーリストが表示されます。 bye()メソッドは、裕福な方法でプログラムを終了させ、優雅にシャットダウンしないようです。

私は正しい順序でコマンドがあると思います。

ご了承ください。私はあなたのコードを見

import turtle 

playGround = turtle.Screen() 
playGround.screensize(800, 600, 'light blue') 

bob = turtle.Turtle() 
bob.color('red') 
bob.pencolor('red') 
bob.ht() 

def teleport(x,y): 
    bob.goto(x,y) 

def quitThis(): 
    playGround.bye() 

def moveAround(): 
    bob.fd(10) 
    bob.rt(15) 
    playGround.ontimer(moveAround,30) 

playGround.onclick(teleport,btn=1) 
playGround.onkey(quitThis,'q') 

moveAround() 

playGround.listen() 
playGround.mainloop() 

答えて

0

一つの問題は、あなたがそうでなければ、あなたが混乱ビジュアルを取得teleport()の間に起こってからmoveAround()を維持する必要があります。私はカメと一緒に、イベントハンドラの内部でイベントハンドラを無効にし、途中で再び有効にするのに役立つことがわかります。

私はあなたの出来事を滑らかにし、それらがすべて適切な時に発射できるようになると信じています。私は活動を制御するのを助けるために状態変数を追加しました:キーが終了するために押されたとき

from turtle import Turtle, Screen 

def teleport(x, y): 
    global state 

    playGround.onclick(None) # disable handler inside handler 

    if state == "running": 
     state = "teleporting" 
     bob.goto(x, y) 
     state = "running" 

    if state != "quitting": 
     playGround.onclick(teleport) 

def quitThis(): 
    global state 

    state == "quitting" 

    playGround.onkey(None, 'q') 

    playGround.bye() 

def moveAround(): 
    if state == "running": 
     bob.fd(10) 
     bob.rt(15) 

    if state != "quitting": 
     playGround.ontimer(moveAround, 30) 

playGround = Screen() 
playGround.screensize(800, 600, 'light blue') 

bob = Turtle(visible=False) 
bob.color('red') 

playGround.onclick(teleport) 
playGround.onkey(quitThis, 'q') 
playGround.listen() 

state = "running" 

playGround.ontimer(moveAround, 100) 

playGround.mainloop() 

、私は シェルのエラーの大規模なリストを取得します。 bye()メソッドは、 brutishファッションで終了するようです。

これはタートルの典型です。それが本当にあなたを悩ませるなら、可能な解決策の1つについてはTurtle window exit errorsに関する質問への私の答えを見てください。

関連する問題