Python3.3 Tkinter函数内部对象访问

2024-09-26 22:51:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python3.3.0上使用Tkinter为一个简单的应用程序构建一个GUI。 我偶然发现了一个编程上的小怪癖,乍一看似乎是错的。虽然这本身不是一个问题(它不会影响我的目标),但从Python的角度来说,它是没有意义的。在

所以,来源如下:

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"按钮将按预期关闭窗口。。。然而问题就在这里。如果我运行这个简化版本的代码:

^{pr2}$

我不会访问在foo()中定义的hee,也不会在bar()中创建一个新的hee。如果现在将nonlocal hee添加到bar()def的开头,则输出:

>>> eggs
>>> spam

会是预期的结果。在

所以,我这里的问题是为什么我能够在第一个示例中调用root对象,而不首先声明它是非本地的?在


Tags: fromimportfootkinterdefbarcolumnroot
1条回答
网友
1楼 · 发布于 2024-09-26 22:51:11

根据Short Description of Python Scoping Rules(另请参见The Python Tutorial),对象名范围解析根据LEGB规则(本地、封闭函数、全局变量、内置函数)进行。在

尽管如此,下面的例子说明了这一规则:

class ni:
    bar = "hello"

def foo():
    pi = ni()
    def bar():
        pi.bar = "eggs"
    pi.bar = "spam"
    print(pi.bar)
    bar()
    print(pi.bar)

ni.bar

>>> hello

foo()

>>> spam
>>> eggs

这与代码的简化版本之间的主要区别是显式地分配了一个名为hee的变量。这里,bar()中的pi.bar首先在bar()中查找{}对象。找不到它,它开始将范围缩小到foo(),其中首先声明pi对象。在

相关问题 更多 >

    热门问题