Python Tkinter中coordenadas全局变量未定义(NameError)问题求助
Tkinter全局变量报错问题解决
问题情况
运行这段Tkinter代码时,会抛出NameError: name 'coordenadas' is not defined错误,我需要在click函数外面使用coordenadas变量,只在函数里打印满足不了需求:
from tkinter import * ronda = 0 root = Tk() root.title("Batalha Naval") root.eval('tk::PlaceWindow . center') #窗口居中 root.geometry('{}x{}'.format(500, 200)) #设置窗口大小 root.attributes('-topmost',1) #窗口一直置顶 tentativa = Label(root, text="Esta é a tua {}º tentativa".format(ronda)) instruçoes = Label(root, text="Introduz as cordenadas:") entrada = Entry(root, width=50, borderwidth=5) def click(): global coordenadas coordenadas = int(entrada.get()) root.destroy() print(coordenadas) botao = Button(root, width=10, height=2, text="Confirmar", bg='red', command=click) tentativa.pack() instruçoes.pack() entrada.pack() botao.pack() print(coordenadas) # 此处直接触发报错 mainloop()
我已经在click里声明了coordenadas是全局变量,用print(globals())也能看到它,但下面这段判断代码还是触发NameError:
if coordenadas in locals(): print("它是局部变量") elif coordenadas in globals(): print("它是全局变量") else: print("未定义")
问题原因
- 代码执行顺序错误:你把
print(coordenadas)写在mainloop()前面,此时GUI窗口刚启动,用户还未点击按钮触发click函数,coordenadas全局变量根本没被创建,直接访问必然报错。而且mainloop()是阻塞函数,窗口不关闭它不会往下执行后续代码,所以要把访问变量的代码放在mainloop()之后。 - 判断逻辑错误:检查变量是否存在时,不能直接写
coordenadas in locals()——如果变量未定义,这行代码本身就会触发NameError,必须用变量名的字符串形式去查询字典,比如'coordenadas' in locals()。
解决步骤
步骤1:提前初始化全局变量+调整代码位置
在代码开头给coordenadas设置默认值(比如None),同时把访问变量的代码移到mainloop()之后,确保用户操作完成后再读取变量:
from tkinter import * ronda = 0 coordenadas = None # 提前初始化全局变量,避免未定义报错 root = Tk() root.title("Batalha Naval") root.eval('tk::PlaceWindow . center') #窗口居中 root.geometry('{}x{}'.format(500, 200)) #设置窗口大小 root.attributes('-topmost',1) #窗口一直置顶 tentativa = Label(root, text="Esta é a tua {}º tentativa".format(ronda)) instruçoes = Label(root, text="Introduz as cordenadas:") entrada = Entry(root, width=50, borderwidth=5) def click(): global coordenadas coordenadas = int(entrada.get()) root.destroy() print(coordenadas) botao = Button(root, width=10, height=2, text="Confirmar", bg='red', command=click) tentativa.pack() instruçoes.pack() entrada.pack() botao.pack() mainloop() # 窗口关闭后执行此处,此时coordenadas已被赋值 print(coordenadas)
步骤2:修正变量存在性判断代码
将判断代码改为用字符串检查字典的形式,避免未定义时触发报错:
# 修正后的判断代码 if 'coordenadas' in locals(): print("它是局部变量") elif 'coordenadas' in globals(): print("它是全局变量") else: print("未定义")
核心注意点
- 全局变量要在函数外提前初始化,否则函数执行前访问会触发未定义错误;
- Tkinter的
mainloop()会阻塞直到窗口关闭,用户操作产生的变量必须在mainloop()之后才能正确读取; - 检查变量是否存在时,必须用变量名字符串查询
locals()或globals()字典,不能直接访问变量本身。
内容的提问来源于stack exchange,提问作者André Brito
相关产品推荐
相关产品推荐

