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は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()
于 2012-05-23T14:57:05.677 に答える
0

問題は、最初の「グローバル チェック」ではありません。エラーの原因は、チェックが初期化される前にアクセスされることです。

アプリケーションのメイン ループを呼び出す前に、チェックを初期化する必要があります。

于 2012-05-23T14:49:59.253 に答える
0

最初の「グローバル チェック」(グローバル レベルのもの) を「global = ...」に置き換え、適切に初期化します。「グローバル」の使用は、関数/メソッド内でのみ実際に関連しています。Python ドキュメントによると、グローバル ステートメントは、現在のコード ブロック全体を保持する宣言です。これは、リストされた識別子がグローバルとして解釈されることを意味します。自由変数は、グローバルと宣言されていなくてもグローバルを参照できますが、グローバルなしでグローバル変数に代入することは不可能です。これも読みたいと思うかもしれません-関連する情報がたくさんあります:それらを作成したもの以外の関数でグローバル変数を使用する

于 2012-05-23T14:47:48.960 に答える