我创建了一个小程序,它显示一个窗口并询问密码,id,以检查用户是否保存在数据库中。如果密码正确,那么它会True
影响一个名为mdp_valide
的布尔值(英文中的'password_is_valid'),之前是False
,并且会破坏连接窗口。它是一个改变该值的函数,因此我在函数顶部使用了global
语句。但是,当它关闭窗口时,值mdp_valide
将返回False
这里有一些代码可以帮助您理解
首先,将调用另一个函数的主程序:
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)
然后,功能不起作用:
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
问题在于:函数verification()确实将mdp_valide的值更改为True
,但在返回值后,它又返回到False
答案 0 :(得分:2)
问题在于fenetre_connection
,mdp_valide
不是全球性的。所以它是一个局部变量。然后在verification
中使用global mdp_valide
,这样一个是全局变量。
verification
完成后,您将从fenetre_connection
返回本地变量。
在python 3中,您可以使用nonlocal
:https://docs.python.org/3/reference/simple_stmts.html#the-nonlocal-statement
在python 2中,您可以在mdp_valide
中将fenetre_connection
声明为全局,以便两个变量都在全局范围内,因此是相同的