造成

2012-05-23 40 views
0

所以我想聲明變量「檢查」作爲一個全局變量,因爲我得到以下問題的錯誤全局變量:造成

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] 
+2

'全局檢查'沒有定義名稱'檢查',它只是允許你修改全局。(無論如何,在你的用例中完全沒有必要,因爲你甚至不想修改它) – geoffspear

回答

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) 
+0

不,在模塊級別上從來沒有定義「檢查」,只有在那裏標記爲全局。 –

+0

@MartijnPieters - 我認爲我們說的是同樣的事情。說'全局檢查'沒有定義變量。腳本'checks = [']'的最後一行確定了變量。然而,它被定義得太晚了(在'installFunc'函數中被引用之後)......我錯了嗎? – mgilson

+0

@MartijnPieters:再次查看代碼。在mainloop之後的最後一行是'checks = [variable.get()for variable in variable]''。這是在模塊級別。 –

0

替換第一個「全球性檢查」(全球一級的人)與'全球= ...',適當地初始化它。使用'全局'只在一個函數/方法中真正相關。根據Python文檔:全局語句是一個適用於整個當前代碼塊的聲明。這意味着列出的標識符將被解釋爲全局變量。如果沒有全局變量,將不可能分配一個全局變量,儘管自由變量可能會引用全局變量而不被聲明爲全局變量。您可能還想閱讀以下內容 - 有很多相關信息:Using global variables in a function other than the one that created them

0

問題不是第一個「全局檢查」。造成錯誤的原因是檢查在初始化之前被訪問。

您必須在調用應用程序的主循環之前初始化檢查。

+0

installFunc不會在那裏被調用...它在app.mainloop()中被調用() – mgilson

+0

@mgilson ok,但在初始化校驗之前調用app.mainloop。我相應地編輯了答案。 – betabandido

+0

很好的編輯。現在好了。 – mgilson

0

首先,Python不是PHP

如果只有當您要在函數範圍內指定全局變量時,您需要使用關鍵字global

global checks在頂層毫無意義,更重要的是沒有定義那個變量。

global checks在你的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()