Python 3.3.0 で Tkinter を使用して単純なアプリケーションの GUI を構築しようとしています。一見すると間違っているように見えるちょっとしたプログラミングの癖に出くわしました。それ自体は問題ではありませんが(私の目的には影響していません)、Pythonic の方法では意味がありません。
ということで、以下がソースです。
from tkinter import *
from tkinter import ttk
def foo():
def bar():
root.destroy()
root = Tk()
mainframe = ttk.Frame(root).grid(column=0, row=0)
ttk.Button(mainframe,text="Goodbye",command=bar).grid(column=1, row=1)
root.mainloop()
foo()
これを実行してボタンをクリックすると"Goodbye"
、予想どおりウィンドウが閉じます...ただし、ここに問題があります。この簡略化されたバージョンのコードを実行すると、次のようになります。
def foo():
def bar():
hee = "spam"
hee = "eggs"
print(hee)
bar()
print(hee)
foo()
>>> eggs
>>> eggs
hee
必要に応じて、定義された in にアクセスしfoo()
て新しいhee
inを作成しませんbar()
。defnonlocal hee
の先頭に追加すると、出力は次のようになります。bar()
>>> eggs
>>> spam
予想通りでしょう。
それで、ここでの私の質問はroot
、最初の例で最初に非ローカルであると宣言せずにオブジェクトを呼び出すことができるのはなぜですか?