2017-12-17 14 views
0

私はこのコードを、ラズベリーパイにpythonを使って書いています。しかし、私はコードに苦労しています。 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が定義されていないというエラーメッセージが返されます。それが私に初期条件を与えた理由です。私はPythonの専門家ではありません。だから私はそれをやるべきではない。ありがとう –

答えて

1

メインスクリプト本体がグローバル変数wを使用しています。ただし、定義した2つの関数には、それぞれ独自のローカル変数wがあります。これらの関数は、それぞれの関数内にとどまります。

は、両方の関数で常にグローバルwにアクセスすることを宣言していますが、それは実際には良い方法ではありません。関数の結果をグローバルwに代入する方が良いでしょう。

+0

問題は解決しました。私は変数をグローバル変数として割り当てましたが、今はうまくいきます。そのことを私に明かにしてくれてありがとう。 –

+0

私は "問題解決"とは言いません。 'global'を使うのは面倒ですし、後でもっと問題が出るかもしれません。 – Matthias

+0

チップをありがとうございます。私はコードを書くためのより良い方法を探しています。それがどうなるか見てみましょう。 –

関連する問題