2017-02-20 2 views
0

버튼을 클릭 할 때 tkinter 창을 가로 질러 객체를 계속 이동시키는 contMove() 함수가 있습니다. 그러나이 함수를 두 번 이상 실행하는 버튼을 클릭하면 첫 번째 서브 루틴이 닫히지 않았기 때문에 속도가 빨라집니다. 왜냐하면 연속적으로 실행하기를 원하기 때문이며, 서로 위로 움직여 이동 속도를 높입니다. 속도를 높이기를 원하지 않습니다. 그래서 X 또는 Y 좌표가 변경되고 있는지를 테스트하는 체크를하고 싶습니다. 속도가 원하는 속도 이상으로 증가했는지 확인하십시오. 서브 루틴. 이것은 공통적 인 것처럼 보이지만 시간 모듈에 대한 모든 정보는 날짜와 시간 또는 time.sleep을 사용합니다. 그러나 운동을 멈출 수 없기 때문에 사용할 수 없습니다. 여기How do you say x> x + y가 z 초 후에 :?

def contMove(moving): 
    global a 
    global b 
    global X, Y 
    if moving: 
     a = a + X 
     b = b + Y 
     mover.place(x = a, y = b) 
     a, b, X, Y = edgeBounce(a, b, X, Y) 
     mover.place(x = a, y = b) 
     #would be here 
     mover.after(17, lambda: contMove(moving)) 
    else: 
     return 
+0

변경'에 전화가 after'는 다음과 같이하고 있는지 그것은 도움이된다 :'mover.after (17, contMove, moving)'. –

+0

혼란 스럽네요, 그걸 넣을 수 있어요? 나는 당신이 무엇을 의미하는지 모르겠다. – Feesih0ps

+0

'mover.after (17, lambda : contMove (moving))'를 제거하고'mover.after (17, contMove, moving) '로 바꾼다. –

답변

0

를 넣어 때 내 코드의 서식을 엉망 죄송 경우는 after를 사용하는 방법을 변경해야합니다. 현재 사용중인 방법 인 after 명령은 after 명령이 실제로 명령을 실행할 때만 moving의 값을 찾습니다. 따라서 after으로 전화하는 시간과 after이 호출하는 시간 사이에 값이 변경되면 최신 버전을 얻게됩니다.

대신 원하는 값을 after으로 지정하면 함수가 실행될 때 값을 조회 할 필요가 없습니다. 다행스럽게도 after을 사용하면 함수에 전달되는 위치 인수를 제공 할 수 있습니다.

제거,이 라인 코드를 해결하려면 :

mover.after(17, lambda: contMove(moving)) 

을 ... 그리고이 라인으로 교체 :

mover.after(17, contMove, moving) 
+0

내게 말한 것은 아무 것도 바뀌지 않았다. 결국에는 서브 루틴 시작시 .after_cancel을 사용해야한다는 것을 알게되었다. – Feesih0ps

관련 문제