2017-11-22 2 views
0

저는 학교 프로젝트를 위해 WASD가 통제하는 거북 프로그램에 참여했습니다. 나는 W 키가 턴키를 지나치게 빨리 친다면, 거북이는 중간 턴으로 전진 할 것이고, 이동 후 턴을 완료 할 것이다. 정확하게 큰 문제는 아니지만, 내가 분류하고 싶은 버그입니다. 이벤트 처리기에서 이벤트 쌓아 피하기 위해 동안 이벤트 핸들러를 사용하지거북이가 움직이기 전에 어떻게 완료 할 수 있습니까?

from turtle import * 
    Screen() 
    move = Turtle() 

    def forkey(): 
     move.forward(50) 

    def backey(): 
     move.back(50) 

    def rigkey(): 
     move.right(45) 

    def lefkey(): 
     move.left(45) 

    onkey(forkey, "w") 
    onkey(backey, "s") 
    onkey(rigkey, "d") 
    onkey(lefkey, "a") 

    listen() 
    mainloop() 
+0

Welcome to Stackoverflow! 그러나 우리는 당신을 위해 숙제를 풀기 위해 여기에 있지 않다는 것을 기억하십시오. 당신이 시도한 것을 정교하게 노력하고, 여기에서 큰 소리로 생각하려고 시도하십시오. 그렇게하면 다른 사람들이 당신을 도우 려하고, 다른 사람들에게 더 유용하며, 더 많은 것을 배우게됩니다. –

답변

0

시도 : 문제가 해결되지 않습니다이 경우

from turtle import Turtle, Screen 

def forkey(): 
    screen.onkey(None, "w") 
    move.forward(50) 
    screen.onkey(forkey, "w") 

def backey(): 
    screen.onkey(None, "s") 
    move.back(50) 
    screen.onkey(backey, "s") 

def rigkey(): 
    screen.onkey(None, "d") 
    move.right(45) 
    screen.onkey(rigkey, "d") 

def lefkey(): 
    screen.onkey(None, "a") 
    move.left(45) 
    screen.onkey(lefkey, "a") 

move = Turtle() 

screen = Screen() 

screen.onkey(forkey, "w") 
screen.onkey(backey, "s") 
screen.onkey(rigkey, "d") 
screen.onkey(lefkey, "a") 

screen.listen() 
screen.mainloop() 

, 다음 단계는 모든 이벤트 핸들러 동안 비활성화 할 수 있습니다 모든 이벤트 핸들러가 활성화됩니다. 명시 적으로 해제하지 않고 전역 변수를 사용하여 일시적으로 비활성화 할 수 있습니다.

+0

당신의 아이디어를 전역 변수 (즉,'busy = True/False')는 더 많은 uuniversal 수 있습니다. 모든 처리기를 이동하기 전에 확인해야합니다. '거짓'이면 '참'으로 설정하고, 움직이면 '거짓'으로 설정하십시오. – furas

관련 문제