Python 名称错误:全局名称';当前';没有定义
下面是我为当前工作开发的应用程序中使用的部分代码。当运行以下代码时,我收到了本文标题中所述的错误。tkinter向导的代码将从中提取。我已经在它自己的窗口中运行了代码,它可以工作,但是当我把代码放在我的应用程序中时,它会遇到前面提到的错误 所以,我的问题是:发生了什么,我该如何解决Python 名称错误:全局名称';当前';没有定义,python,tkinter,wizard,Python,Tkinter,Wizard,下面是我为当前工作开发的应用程序中使用的部分代码。当运行以下代码时,我收到了本文标题中所述的错误。tkinter向导的代码将从中提取。我已经在它自己的窗口中运行了代码,它可以工作,但是当我把代码放在我的应用程序中时,它会遇到前面提到的错误 所以,我的问题是:发生了什么,我该如何解决 from tkinter import * #Start Code for the Introduction Wizard def wizIntro(): wizIntro = tkinter.Tk()
from tkinter import *
#Start Code for the Introduction Wizard
def wizIntro():
wizIntro = tkinter.Tk()
#Title:
wizIntro.title('Welcome to Training')
#Content:
page1 = Frame(wizIntro)
Label(page1, text='', width=110).pack()
Label(page1, text='--Welcome to Training--', width=85).pack()
Label(page1, text='', width=85).pack()
Label(page1, text='This tutorial will help you familiarize yourself with the program. Following it is key to understanding', width=85).pack()
Label(page1, text='the proper operation of the Laser Cutter.', width=85).pack()
Label(page1, text='', width=90).pack()
Label(page1, text='It is also important to follow every insrtuction exactly as stated, to avoid or minimize damage to the Laser', width=85).pack()
Label(page1, text='Cutter and reduce the risk of injury to the operator and those around him.', width=85).pack()
Label(page1, text='Therefore, all safety notices must be followed with extreme care.', width=110).pack()
Label(page1, text='--Failure to follow all safety notices poses a severe risk of damage to the equipment and to the operator, which can be fatal--', width=110, fg='red').pack()
Label(page1, text='', width=110).pack()
Label(page1, text='Click Next to Continue...', width=110).pack()
page1.pack()
page2 = Frame(wizIntro)
Label(page2, text='', width=110).pack()
#Commands:
pages = [page1, page2]
current = page1
def move(dirn):
global current
idx = pages.index(current) + dirn
if not 0 <= idx < len(pages):
return
current = pages[idx]
current.pack_forget()
current.pack(side = TOP)
def nex():
move(+1)
def prev():
move(-1)
Button(wizIntro, text='Previous', command=prev).pack(side = LEFT)
Button(wizIntro, text='Next', command=nex).pack(side = RIGHT)
#End Code for the Introduction Wizard
从tkinter导入*
#介绍向导的启动代码
def wizIntro():
wizIntro=tkinter.Tk()
#标题:
wizIntro.title(“欢迎参加培训”)
#内容:
第1页=帧(wizIntro)
标签(第1页,文本=“”,宽度=110).pack()
标签(第1页,文本='--欢迎参加培训--',宽度=85).pack()
标签(第1页,文本='',宽度=85).pack()
Label(第1页,text=)本教程将帮助您熟悉该程序。以下内容是理解',width=85.pack()的关键
标签(第1页,text='激光切割机的正确操作',宽度=85).pack()
标签(第1页,文本='',宽度=90).pack()
标签(第1页,text=,同样重要的是严格按照说明进行操作,以避免或尽量减少对激光器的损坏’,宽度=85)。pack()
标签(第1页,文本:“‘减少操作员及其周围人员受伤的风险’”,宽度=85)。包装()
标签(第1页,text='因此,必须极其小心地遵守所有安全注意事项。',宽度=110).pack()
标签(第1页,文本='--不遵守所有安全注意事项会对设备和操作员造成严重的损坏风险,这可能是致命的--',宽度=110,fg='red')。pack()
标签(第1页,文本=“”,宽度=110).pack()
标签(第1页,text='单击下一步继续…',宽度=110).pack()
第1页包装()
第2页=帧(wizIntro)
标签(第2页,文本='',宽度=110).pack()
#命令:
pages=[page1,page2]
当前=第1页
def移动(dirn):
全球电流
idx=页面索引(当前)+dirn
如果不是0我不确定这是否是您的问题,但它肯定至少是一个相关问题:
current = page1
def move(dirn):
global current
这两个current
变量指的不是同一事物。第一个是函数wizintro
中的局部变量。第二个是全局变量
与另一个错误相反,此特定错误的原因如下:
idx = pages.index(current) + dirn
您正在引用名为current
的变量。您说过它是全局的
,但您从未在全局范围内为它赋值。所以,它是未定义的。所以你得到了一个例外
如果只删除global current
行,那么它们在两个不同的函数中引用局部变量,这可能仍然不是您想要的。同一行将有效地给出相同的错误,现在它是一个局部变量,您使用它时没有在局部范围内为它赋值,但这并不是更好的
很明显,您希望move
从外部作用域引用当前的
如果您使用的是Python3.x,nonlocalcurrent
可能就是您想要的
如果没有,还有一些选择
您可以使用“可变默认参数值”技巧。将current
替换为一个元素的列表(current=[page1]
),然后将current=current
作为额外参数传递给move
。只要没有人覆盖默认值,move
将有一个名为current
的局部变量,尽管该变量与外部范围中的变量不同,但它是对相同值的引用,因此current[0]
是相同的变量。(有不同的技巧将局部变量绑定到闭包中,这对来自Scheme/Haskell等背景的人来说可能更友好,但效果是一样的。)
或者,您可以在两个范围内将设置为当前全局
或者,反向操作:将wizintro
转换为类,move
和friends转换为方法,current
转换为实例变量。这看起来真的很像您在这里要做的。您不能使用global
从外部范围更改非全局变量,而只能更改全局(模块级)变量。Python3.x为此提供了nonlocal
。考虑改变你的逻辑。 你所遇到的麻烦是因为<代码>当前<代码>不是一个全局变量,而是一个在你的代码> WiZiToo.<代码>函数中的局部变量。您的嵌套函数move
尝试访问它,但它的global
语句在全局命名空间中找不到该值。这意味着当您稍后尝试访问它时,会出现namererror
如果您使用的是Python2,那么从嵌套函数中访问外部函数名称空间的变量就没有什么好方法。我认为您最好在wizIntro
中将current
声明为全局(在您首次分配之前)。Python3引入了可用于当前结构的nonlocal
关键字(只需替换当前的global
语句。请更准确地定义您想要获得的内容,以及您遇到并未能克服的障碍。您是否可以复制并粘贴异常的完整回溯到问题中?这将缩小错误发生在代码中的位置。@Blckknght Tkinter中的异常回调回溯(最后一次调用):在调用返回self.func(*args)文件“I:\Documents\Python Projects\CS-LC0001.py”的第1442行,在nex move(+1)文件“I:\Documents\Python Projects\CS-LC0001.py”的第54行,在move idx=pages.index(当前)的第46行,文件“I:\Documents\Python Projects\CS-LC0001.py”+目录名称错误:全局名称“当前”不正确defined@Vladimir我正在为激光cu的训练制作一个教程