2016-11-15 4 views
0

私はtkinterを使用してドロップダウンメニューを作成しています。サブメニュー「ファイル」とコマンド「開く」には、ユーザーが開くファイルのパスを入力してボタンをクリックして開くことができる項目があります。現在、私は以下の私のコードに示すように、ボタンがクリックされたときに、エントリのテキストを取得するには、Get()を使用しようとしています:Tkinterを使用したNameError get()

# Assign 5 
from tkinter import * 

def getFile(): 
'Displays the text in the entry' 
print(E1.get()) 

def openFile(): 
'Creates enty widget that allows user file path and open it' 
win = Tk() 
#add label 
L1 = Label(win, text="File Name") 
#display label 
L1.pack() 
#add entry widget 
E1 = Entry(win, bd = 5) 
#display entry 
E1.pack(fill=X) 
#create buttons 
b1 = Button(win, text="Open", width=10, command = getFile) 
b2 = Button(win, text = "Cancel", width=10, command=win.quit) 
#display the buttons 
b1.pack(side = LEFT) 
b2.pack(side = LEFT) 

# create a blank window 
root = Tk() 
root.title("Emmett's awesome window!") 

#create a top level menu 
menubar = Menu(root) 
# add drop down "File" menu with command "Open" to the menubar 
fileMenu = Menu(menubar, tearoff=0) 
menubar.add_cascade(label="File", menu=fileMenu) 
fileMenu.add_command(label = "Open", command = openFile)  

# display the menu 
root.config(menu=menubar) 
root.mainloop() 

しかし、私は次のようなエラーになっています:

Exception in Tkinter callback 
Traceback (most recent call last): 
File  "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/tkinter/__init__.py", line 1550, in __call__ 
return self.func(*args) 
File "/Users/emmettgreenberg/Documents/2016/CS521/assign5/assign5_2.py", line 6, in getFile 
print(E1.get()) 
NameError: name 'E1' is not defined 

を私が理解するところから、私はgetfileをと呼ぶときにE1を引数として渡す必要はありません。これをどうすれば解決できますか?

答えて

1

E1openFile()のローカル変数であるため、getFile()の内部ではアクセスできません。あなたはE1をグローバルにするかgetFile()経由E1の内容を渡す次のいずれか

def getFile(filename): 
    print(filename) 

def openFile(): 
    ... 
    b1 = Button(win, text="Open", width=10, command=lambda: getFile(E1.get())) 
    ... 

それとも、ファイル名を保持し、E1に関連付けることがグローバルStringVarを定義することができます。

def getFile(): 
    print(filename.get()) 

def openFile(): 
    ... 
    E1 = entry(win, bd=5, textvariable=filename) 
    ... 

root = Tk() 
filename = StringVar() 

ところで、より良い変更win = Tk()win = Toplevel()openFile()

+0

ありがとう、私はファイル名を渡すためにラムダを使用し、それは動作しますが、私は理解していません、なぜラムダが必要ですか?また、** Tk()**の代わりに** Toplevel()**を使用するのはなぜですか? –

+0

@EmmettGreenberg一般的に、tkinterアプリケーションには、正確に1つのTkマスターアプリケーションウィジェットが必要です。複数を持つことは微妙なバグにつながる可能性があります。 –

+0

'openFile()'関数のスコープ内で定義されたリソースを 'getFile()'関数に渡すためにlambdaが使われます。 'Tk()'を使うと、最初に作成した 'ルート'ウィンドウとは独立した 'ルート'ウィンドウの別のインスタンスを初期化しますが、 'Toplevel()'は最初の 'ルート'ウィンドウの階層内にあります。両方とも同じ効果を出せると思われますが、後ろの意味は異なります。 – acw1668

関連する問題