You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Tkinter中变量已赋值但对应if判断语句不生效问题

问题根源

  1. 变量作用域错误
    你在clicked函数内对loggedin赋值时没有声明全局变量,函数会默认将其识别为局部变量,你在函数内打印出的True只是局部变量的值,全局作用域下的loggedin始终保持初始的False。
  2. 代码执行时序错误
    判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:54:03