2017-04-10 10 views
0

私は、ウィンドウを表示し、パスワードidsにユーザーがデータベースに保存されているかどうかを確認する小さなプログラムを作成しました。パスワードが正しい場合は、Truemdp_valideというブール値(英語の「password_is_valid」)に影響し、前にはFalseでしたが、接続のウィンドウが破棄されます。この値を変更する関数なので、関数の先頭にglobalステートメントを使用しました。その後Pythonでのグローバル変数の問題

while 1: 
    mdp_valide, utilisateur_en_cours = fenetre_connection(False, None) 
    print ('in the main', mdp_valide, utilisateur_en_cours) 
    if not mdp_valide: 
     sys.exit() 
    else : 
     lancer_messagerie(utilisateur_en_cours) 

、機能:しかし、それはウィンドウを閉じたときに、値mdp_valideが戻っFalse にあるここでは、

まず、他の関数を呼び出します、メインプログラムを理解するのに役立ついくつかのコードですこれは動作していない:

def fenetre_connection (mdp_val, utilisateur): 
    mdp_valide = mdp_val 
    utilisateur_en_cours = utilisateur 

    root_co = Tk() 

    # .... Lots of stuff 

    def verification(): 
     mdp_co = mot_de_passe.get() 
     global mdp_valide 
     global utilisateur_en_cours 

     if mdp_co == recuperer_donnee_utilisateur (identifiant_utilisateur_co, 'mot_de_passe'): # check if the password is the one of the database 

      print ('condition checked') 
      mdp_valide = True 
      utilisateur_en_cours = identifiant_utilisateur_co 
      print ("before destroying : ", mdp_valide, utilisateur_en_cours) 
      root_co.destroy() 
      print ("after destroying : ", mdp_valide, utilisateur_en_cours) 
     else: 
      return 1 

    Button(Frameboutons_co, text="Valider", font='Cambria', command = verification).pack(side=RIGHT) #Bouton qui verifie la validité du pseudo et du mot de passe 


    root_co.mainloop() 

    print ('before return : ', mdp_valide) 

    return mdp_valide 

テスト:

before destroying: True guil23 
after destroying : True guil23 
before return : False None 
in the main : False None 

問題はここにある:機能検証()Trueにmdp_valideの値を変更し、その値を返した後、それが戻っFalse

+2

同じになるようにパイソン2ではhttps://docs.python.org/3/reference/simple_stmts.html#the-nonlocal-statement

を、あなたは」fenetre_connectionにグローバルとしてmdp_valideを宣言することができます'fenetre_connection'関数で' global mdp_valide'を参照してください。それはあなたの問題かもしれません。 –

+0

私はそれを削除しました、申し訳ありません。しかし、それは元の投稿にあった。私はそれを戻した – Guil23

+0

実際には、それはすでにそこにあったが、間違った押し込みによって誤解されるかもしれない。私はそれを修正しました – Guil23

答えて

2

のだ問題はfenetre_connectionで、mdp_valideがグローバルではないということです。それはローカル変数です。次に、verificationにはglobal mdp_valideを使用します。その結果、グローバル変数になります。

verificationが終了すると、fenetre_connectionからローカル変数が返されます。

あなたが nonlocal使用できるのpython 3では

:両方の変数はグローバルスコープであり、それゆえ私はドン

+0

ありがとう、それは再び働いているようです。 (私は非ローカルが少し複雑だったので、私はグローバルを使用しました:))。 – Guil23

+0

しかし、まだ、私はそれがどのように可能であるか理解していません。グローバルは、 "上の"どこかの変数を取ることになっていませんか? – Guil23

+1

@ Guil23 - 'global'は上記の"どこか "を意味するのではなく、モジュールレベルの*特に*を意味します。 –

関連する問題