0

所以我试图将变量“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]
4

4 回答 4

3

我认为这是因为checks在主循环(发布代码的最后一行)之后设置。通过按下按钮从主循环调用该函数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)
于 2012-05-23T14:44:45.820 回答
0

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

于 2012-05-23T14:47:48.960 回答
0

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

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

于 2012-05-23T14:49:59.253 回答
0

首先,Python 不是 PHP

您需要使用关键字globalif 只有当您要分配给函数范围内的全局变量时。

global checks在顶层根本没有意义,更重要的是没有定义该变量。

global checksin 你installFunc()没有意义,因为你没有为那个变量分配任何东西,事实上你甚至没有修改它。

在 Python 中,来自外部范围的变量在本地范围内是可见的,除非您尝试分配某些东西,这将被解释为在本地范围内重新定义该变量。

您的代码的问题是您仅checks在退出主循环后定义。正确的代码看起来像这样

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()
于 2012-05-23T14:57:05.677 回答