Raspberry pi でプロトタイプ的なものを作ってます。
今日つまずいていたところをシェアします。
下記のようなソースを書いたところ。
FLG_EXE = FalseFLG_ART = Falsedef display_show():if FLG_EXE :returnif FLG_ART :wb.open("Arart.html",0)FLG_EXE = Trueelse :wb.open("Normal.html" , 0)FLG_EXE = Truetry:while True:display_show()if GPIO.input(SW_ART) == GPIO.HIGHFLG_ART = TrueFLG_EXE = Falseif GPIO.input(SW_RST) == GPIO.HIGHTFLG_ART = FalseFLG_EXE = Truetime.sleep(0.1)excep Exception as e:print(e)GPIO.cleanup()
下記のエラーが表示されました。
local variable 'FLG_EXE' eferenced before assignment
print('check point 01')や、print(FLG_EXE)などを埋めまくって調査したおところ、def display_show() 内の最初の FLG_EXE を参照しにいってこけているようでした。
ググった所次の記事が役立ちました。
どうやら def 関数内でグローバル変数を使うときはglobalと明示してやらないとlocal変数として扱われてしまう事があるようです。
つまりはこのようにしないとこのエラーは発生するみたいです。
def display_show():#グローバル変数ですよと明示global FLG_EXEglobal FLG_ARTif FLG_EXE :returnif FLG_ART :wb.open("Arart.html",0)FLG_EXE = Trueelse :wb.open("Normal.html" , 0)FLG_EXE = True
ただし、こういうのはバグを生みやすい書き方らしいので、アドバイスに従い下記に変更しました。
FLG_EXE = FalseFLG_ART = Falsedef display_show(flg_art):if flg_art :wb.open("Arart.html",0)else :wb.open("Normal.html" , 0)return Truetry:while True:if FLG_EXE == FalseFLG_EXE = display_show(FLG_ART)#この処理を入れておかないとブラウザが開きまくる。#表示まちで1秒待つtime.sleep(1)if GPIO.input(SW_ART) == GPIO.HIGH :FLG_ART = TrueFLG_EXE = Falseif GPIO.input(SW_RST) == GPIO.HIGHT :FLG_ART = FalseFLG_EXE = Truetime.sleep(0.1)except Exception as e:print(e)GPIO.cleanup()
グローバル変数を弄るのではなく、関数の引数と返り値で処理するやり方です。
これで問題なく動くようになりました!