Python 名称错误:全局名称';当前';没有定义

Python 名称错误:全局名称';当前';没有定义,python,tkinter,wizard,Python,Tkinter,Wizard,下面是我为当前工作开发的应用程序中使用的部分代码。当运行以下代码时,我收到了本文标题中所述的错误。tkinter向导的代码将从中提取。我已经在它自己的窗口中运行了代码,它可以工作,但是当我把代码放在我的应用程序中时,它会遇到前面提到的错误 所以,我的问题是:发生了什么,我该如何解决 from tkinter import * #Start Code for the Introduction Wizard def wizIntro(): wizIntro = tkinter.Tk()

下面是我为当前工作开发的应用程序中使用的部分代码。当运行以下代码时,我收到了本文标题中所述的错误。tkinter向导的代码将从中提取。我已经在它自己的窗口中运行了代码,它可以工作,但是当我把代码放在我的应用程序中时,它会遇到前面提到的错误

所以,我的问题是:发生了什么,我该如何解决

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的训练制作一个教程