Python 3.6+Tkinter+SQLite3脚本出现UnboundLocalError报错求助
解决UnboundLocalError: local variable 'fImage' referenced before assignment
这个报错的根源很清晰:你在Salvataggio函数里尝试操作全局变量fImage,但没有明确声明它是全局变量,再加上函数里有del fImage语句,Python会自动把fImage标记为该函数的局部变量。当执行if "fImage" in globals() and not(fImage==None)时,Python会去寻找局部的fImage,但此时它还没被赋值,就抛出了未绑定的错误。
具体修复步骤:
在
Salvataggio函数开头声明fImage为全局变量
这会告诉Python:我们要操作的是全局作用域里的fImage,不是局部变量。修改后的函数开头应该是:def Salvataggio(mode,nome,cognome,sitoweb,email,idx): global fImage # 新增这一行 conn=sql.connect(os.path.join(path, fn_prof),isolation_level=None) c=conn.cursor() # 后续代码保持不变(除了下面要提到的SQL优化)优化
fImage的检查逻辑
既然已经声明了全局变量,其实不需要再检查"fImage" in globals(),可以简化成更直观的判断:# 替换原来的if判断 if fImage is not None: # 执行带图片的SQL操作 else: # 执行不带图片的SQL操作另外,建议在全局作用域先初始化
fImage为None,避免出现未定义的情况,比如在脚本开头加一行:fImage = None紧急修复SQL注入风险(重要)
你的代码里用字符串格式化拼接SQL语句,这是非常危险的做法,很容易被SQL注入攻击。应该改用SQLite的参数化查询,把参数用?占位,然后将参数作为元组传给execute方法:
比如新增数据的代码可以改成:if fImage is not None: c.execute("INSERT INTO prof VALUES (?, ?, ?, ?, ?, ?)", (len(prof.keys())+1, nome.get(), cognome.get(), fImage, sitoweb.get(), email.get())) else: c.execute("INSERT INTO prof VALUES (?, ?, ?, ?, ?, ?)", (len(prof.keys())+1, nome.get(), cognome.get(), "", sitoweb.get(), email.get()))更新数据的代码同理,把
{}换成?,参数放在元组里。
额外说明
selImmagine函数里的global fImage声明是正确的,它确保了赋值操作是针对全局变量的。- 执行
del fImage之后,如果后续还要使用这个变量,记得重新初始化,否则会再次出现未定义的错误。
内容的提问来源于stack exchange,提问作者maicol07
相关产品推荐
相关产品推荐

