Tkinter退出按钮触发NameError错误,请求技术解决方案
解决方法
原因分析
你用了from tkinter import *的导入方式,这种方式会把tkinter库中的所有公开成员直接导入到当前代码的命名空间,但tkinter模块本身并没有被导入,所以无法通过tkinter.askyesno这种模块前缀的方式调用函数,这就是触发NameError的原因。另外你的代码里还存在一个问题:函数名是iExit,但你又给self.iExit赋值,这会覆盖掉函数的引用,可能导致后续调用出错。
修正方案(两种可选)
方案一:直接使用导入的函数名
既然已经用了from tkinter import *,直接调用askyesno即可,同时修改变量名避免覆盖函数:
from tkinter import* from tkinter import ttk from PIL import Image,ImageTk import os def iExit(self): # 换个变量名,避免和函数名iExit冲突 exit_confirm = askyesno("Face Recognition","Are you sure you want to exit?") if exit_confirm: # askyesno返回布尔值True/False,无需和0比较 self.root.destroy() else: return
方案二:修改导入方式,保留模块前缀
如果习惯用模块前缀调用,可以改成导入tkinter模块本身,推荐用别名tk让代码更清晰:
import tkinter as tk from tkinter import ttk from PIL import Image,ImageTk import os def iExit(self): exit_confirm = tk.askyesno("Face Recognition","Are you sure you want to exit?") if exit_confirm: self.root.destroy() else: return
额外说明
askyesno函数返回的是布尔值(点击"是"返回True,"否"返回False),直接用if exit_confirm:判断即可,不需要和0比较,这样代码更易读。
内容的提问来源于stack exchange,提问作者CatJeff
相关产品推荐
相关产品推荐

