Python Tkinter中变量已赋值但对应if判断语句不生效问题
问题根源
- 变量作用域错误
你在clicked函数内对loggedin赋值时没有声明全局变量,函数会默认将其识别为局部变量,你在函数内打印出的True只是局部变量的值,全局作用域下的loggedin始终保持初始的False。 - 代码执行时序错误
判断if loggedin == True的代码段是程序启动时同步执行的,此时用户还未完成密码输入和登录操作,后续就算你正确修改了全局loggedin的值,这段已经执行完毕的代码也不会重新触发,按键绑定逻辑永远没有运行机会。
修复方案
- 在
clicked函数内修改loggedin前新增global loggedin声明,确保修改的是全局作用域的变量 - 把原本放在全局位置的登录后逻辑(按键绑定部分)挪到登录验证通过的分支内,等用户登录成功后再执行
修正后的完整代码
from tkinter import * import json, threading, time window = Tk() window.title("MikuOS") window.geometry('350x200') global loggedin loggedin = False a = '' if 'false' not in open('users.json', 'r').read(): lbl = Label(window, text="Welcome to MikuOS! MikuOS is in alpha.\nPlease enter a new password: ") lbl.grid(column=0, row=0) txt = Entry(window,width=15) txt.grid(column=1, row=0) def clicked(): json.dump({'users':{'password':txt.get(), 'firsttime':False}}, open('users.json', 'w')) lbl.destroy() txt.destroy() btn.destroy() btn = Button(window, text="entr", command=clicked) btn.grid(column=2, row=0) elif 'false' in open('users.json', 'r').read() and loggedin != True: lbl = Label(window, text="Welcome to mikuOS!\nPlease enter your password to continue. ") lbl.grid(column=0, row=0) def clicked(): global loggedin # 新增全局变量声明 if txt.get() == json.load(open('users.json', 'r'))['users']['password']: loggedin = True lbl.destroy() txt.destroy() btn.destroy() print(loggedin) # 登录成功后再执行按键绑定逻辑 global a a = '' def key_pressedo(event): global a a += 'o' def olbld(): olbl.destroy() if 'owo' in a: a ='' olbl = Label(window, text="OwO mode activated! (it only displays this)") olbl.grid(column=0,row=0) olbl.after(5000, olbld) print(a) def key_pressedw(event): global a a+='w' window.bind("o",key_pressedo) window.bind("w",key_pressedw) txt = Entry(window,width=15) txt.grid(column=1, row=0) btn = Button(window, text='enter', command=clicked) btn.grid(column=1, row=1) window.mainloop()
内容的提问来源于stack exchange,提问作者Hatsune Miku
相关产品推荐
相关产品推荐

