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を引数として渡す必要はありません。これをどうすれば解決できますか?
ありがとう、私はファイル名を渡すためにラムダを使用し、それは動作しますが、私は理解していません、なぜラムダが必要ですか?また、** Tk()**の代わりに** Toplevel()**を使用するのはなぜですか? –
@EmmettGreenberg一般的に、tkinterアプリケーションには、正確に1つのTkマスターアプリケーションウィジェットが必要です。複数を持つことは微妙なバグにつながる可能性があります。 –
'openFile()'関数のスコープ内で定義されたリソースを 'getFile()'関数に渡すためにlambdaが使われます。 'Tk()'を使うと、最初に作成した 'ルート'ウィンドウとは独立した 'ルート'ウィンドウの別のインスタンスを初期化しますが、 'Toplevel()'は最初の 'ルート'ウィンドウの階層内にあります。両方とも同じ効果を出せると思われますが、後ろの意味は異なります。 – acw1668