2017-12-17 6 views
0

나는 파이썬을 사용하여이 코드를 작성했습니다. 하지만 코드에 어려움을 겪고 있습니다. while 루프가 중단되지 않습니다.While 루프가 실시간 업데이트되지 않습니다

w=1 
z=0 

def auto_1(w,z): 
    w=1 
    z=0 
    return w,z 

def manual_1(w,z): 
    w=0 
    z=1 
    return w,z 

GPIO.add_event_detect(Manual, GPIO.RISING, callback=lambda *i: manual_1(w,z), bouncetime=300) 
GPIO.add_event_detect(Auto, GPIO.RISING, callback=lambda *i: auto_1(w,z), bouncetime=300) 

while w==1: 
     print("Auto") 
     pfr_mains_1(PFRMains,PFRGen,GenStartOut,MainsCont,GenCont) 
     pfr_mains_0(PFRMains,PFRGen,GenStartOut,MainsCont,GenCont) 
     time.sleep(3) 
     if w==0: 
     break 

"수동"이벤트가 감지 되더라도 while 루프가 중단되지 않습니다. 코드는 제대로 실행되지만 이벤트가 감지되면 루프가 중단되지 않습니다. w 값이 초기 값에서 업데이트되지 않는 것 같습니다. 그러나 나는 무엇을 해야할지 전혀 모른다. 이걸 도와주세요. 고마워요.

+0

어떻게'w'가 바뀔 것으로 기대합니까? 루프에서 함수 호출을위한 매개 변수로 사용하기 만하면됩니다. – Matthias

+0

초기 변수 선언 없이는 w 및 z가 정의되지 않았 음을 오류 메시지로 표시합니다. 그래서 초기 조건을 부여했습니다. 나는 파이썬 전문가가 아니다. 그래서 나는 그걸 어떻게 할 수 없는지 모르겠습니다. 감사합니다 –

답변

1

기본 스크립트 본문에 전역 변수 w가 사용됩니다. 그러나 정의한 두 함수에는 각각 자체 로컬 변수 w가 있습니다. 이 함수들이 각각의 함수 내부에 머물러있는 모든 것들.

은 항상 글로벌 w에 액세스 할 수있는 두 가지 기능 모두에서 전역으로 선언 할 수 있지만 실제로 좋지는 않습니다. 함수의 결과를 전역 w에 할당하는 것이 더 낫습니다.

+0

문제가 해결되었습니다. 변수를 전역 변수로 지정 했으므로 이제는 정상적으로 작동합니다. 저 한테 분명히 해주셔서 고마워요. –

+0

나는 "문제 해결"이라고 말하지 않을 것입니다. 'global'을 사용하는 것은 더러운 방법이며 나중에 더 많은 문제를 일으킬 수 있습니다. – Matthias

+0

팁 주셔서 감사합니다. 나는 코드를 작성하는 더 좋은 방법을 찾고있다. 그것이 어떻게되는지 보자. –