Python 导致错误的全局变量

Python 导致错误的全局变量,python,Python,因此,我试图将变量“checks”声明为全局变量,因为我遇到以下问题: File "C:\Python27\Projects\Automatic Installer\autoinstall.py", line 11, in installFunc if checks[0] == 1: NameError: global name 'checks' is not defined 这是我的代码,我尝试向程序主体以及installFunc函数添加全局检查。是否有其他位置我应该添加它/以其

因此,我试图将变量“checks”声明为全局变量,因为我遇到以下问题:

  File "C:\Python27\Projects\Automatic Installer\autoinstall.py", line 11, in installFunc
    if checks[0] == 1:
NameError: global name 'checks' is not defined
这是我的代码,我尝试向程序主体以及installFunc函数添加全局检查。是否有其他位置我应该添加它/以其他方式指示检查应包含程序中的信息

import urllib
import subprocess
from Tkinter import *

global checks

def installFunc():
    global checks
    subprocess.call("md c:\MGInstall", shell=True)
    subprocess.call (u"net use w: \\it01\files")
    if checks[0] == 1:
        subprocess.call(u"w:\\software\\snagitup.exe")
    if checks[1] == 1:
        subprocess.call(u"w:\\software\\camtasia.exe")
    if checks[2] == 1:
        urllib.urlretrieve(u"SUPERLONGURLLOLOLOL", u"c:\\MGinstall\\gotomeeting.exe")
        subprocess.call (u"c:\\MGinstall\\gotomeeting.exe")
    urllib.urlretrieve(u"http://ninite.com/.net-7zip-air-chrome-cutepdf-dropbox-essentials-firefox-flash-flashie-java-klitecodecs-quicktime-reader-safari-shockwave-silverlight-vlc/ninite.exe", u"c:\\MGinstall\\MGinstall.exe")
    subprocess.call (u"c:\\MGinstall\\MGinstall.exe")
    subprocess.call (u"w:\\printers\\installer\\printer.exe")

app = Tk()

w = Label(app, text="CompanyName IT Automatic Installer")
w.pack()

text = ["Snagit", "Camtasia", "GotoMeeting"]
variables = []
for name in text:
    variables.append(IntVar())
    Checkbutton(text=name, variable=variables[-1]).pack()

b = Button(text="OK", command=installFunc)
b.pack()

app.mainloop()
checks = [variable.get() for variable in variables]

我认为这是因为
检查
设置在mainloop(发布代码的最后一行)之后。函数
installFunc
通过按下按钮从主循环调用,但尚未定义检查

无论如何,在这种情况下使用全局数据不是一个好主意。您可能应该这样做:

def installFunc(checks):
    ...

checks = [variable.get() for variable in variables]
b = Button(text="OK", command=lambda : installFunc(checks))
或者,更好的是,把所有这些都集中在一节课上。。。这样你就可以做到:

self.b=Button(..., command=self.installFunc)

我认为这是因为
检查
设置在mainloop(发布代码的最后一行)之后。函数
installFunc
通过按下按钮从主循环调用,但尚未定义检查

无论如何,在这种情况下使用全局数据不是一个好主意。您可能应该这样做:

def installFunc(checks):
    ...

checks = [variable.get() for variable in variables]
b = Button(text="OK", command=lambda : installFunc(checks))
或者,更好的是,把所有这些都集中在一节课上。。。这样你就可以做到:

self.b=Button(..., command=self.installFunc)

将第一个“全局检查”(全局级别的检查)替换为“全局=…”,并对其进行适当初始化。仅在函数/方法中使用“全局”才真正相关。根据Python文档:global语句是一个声明,用于保存整个当前代码块。这意味着列出的标识符将被解释为全局标识符。如果没有全局变量,就不可能分配给全局变量,尽管自由变量可能引用全局变量而不声明为全局变量。您可能还想阅读这篇文章-有很多相关信息:

将第一个“全局检查”(全局级别的检查)替换为“全局=…”,并适当地初始化它。仅在函数/方法中使用“全局”才真正相关。根据Python文档:global语句是一个声明,用于保存整个当前代码块。这意味着列出的标识符将被解释为全局标识符。如果没有全局变量,就不可能分配给全局变量,尽管自由变量可能引用全局变量而不声明为全局变量。你可能也想读一下这篇文章-有很多相关信息:

问题不是第一次“全局检查”。导致错误的原因是在初始化之前访问了检查


在调用应用程序的主循环之前,必须初始化检查。

问题不是第一个“全局检查”。导致错误的原因是在初始化之前访问了检查


在调用应用程序的主循环之前,必须初始化检查。

首先,Python不是PHP

您需要使用关键字
global
如果是only-if,则要在函数范围内分配给全局变量

顶层的全局检查
毫无意义,更重要的是没有定义该变量

installFunc()中的
global checks
没有意义,因为您没有为该变量赋值,实际上您甚至没有修改它

在Python中,外部作用域中的变量在局部作用域中是可见的,当然,除非您尝试赋值,这将被解释为在局部作用域中重新定义该变量

代码的问题在于,您仅在退出主循环后定义
检查。正确的代码如下所示

import urllib
import subprocess
from Tkinter import *

#no global definition here...

def installFunc():
    #no global definition here...
    subprocess.call("md c:\MGInstall", shell=True)
    ...

...

#define checks before starting main loop
checks = [variable.get() for variable in variables]
app.mainloop()

首先,Python不是PHP

您需要使用关键字
global
如果是only-if,则要在函数范围内分配给全局变量

顶层的全局检查
毫无意义,更重要的是没有定义该变量

installFunc()中的
global checks
没有意义,因为您没有为该变量赋值,实际上您甚至没有修改它

在Python中,外部作用域中的变量在局部作用域中是可见的,当然,除非您尝试赋值,这将被解释为在局部作用域中重新定义该变量

代码的问题在于,您仅在退出主循环后定义
检查。正确的代码如下所示

import urllib
import subprocess
from Tkinter import *

#no global definition here...

def installFunc():
    #no global definition here...
    subprocess.call("md c:\MGInstall", shell=True)
    ...

...

#define checks before starting main loop
checks = [variable.get() for variable in variables]
app.mainloop()

全局检查
不定义名称
检查
,它只允许您修改全局检查。(无论如何,在您的用例中,这是完全不必要的,因为您甚至没有试图修改它)
全局检查
没有定义名称
检查
,它只允许您修改全局检查。(无论如何,在您的用例中,这是完全不必要的,因为您甚至没有试图修改它)不,
检查从来没有在模块级别上定义过,只是在那里标记为全局..@MartijnPieters--我想我们说的是同一件事。说
全局检查
并不定义变量。脚本的最后一行
checks=[…]
定义了变量。但是,它定义得太晚(在
installFunc
函数中引用它之后)。。。我错了吗?@MartijnPieters:再看看代码。mainloop后面的最后一行是
checks=[variable.get()for variables in variables]
。这是模块级的。我还没有用Python做过很多OOO编程!我将尝试你的lambda方法(我不确定到底发生了什么),但我最终会尝试转换到编写一个类。@AndrewAlexander:lambda本质上与执行
def func():return installFunc(checks)
相同,然后将
command=func
放入
按钮
构造函数中。我希望这有助于解释它。不,
检查
从未在模块级别定义,只标记为总账