2

我是初学者使用 Tkinter 模块进行一些非常基本的 GUI 编程。我尝试运行该程序,其源代码是从另一个网页复制的。

    from Tkinter import *

    def sel():
        selection = "You selected the option " + str(var.get())
        label.config(text = selection)

    root = Tk()
    var = IntVar()
    R1 = Radiobutton(root, text="Option 1", variable=var, value=1,
              command=sel)
    R1.pack( anchor = W )

    R2 = Radiobutton(root, text="Option 2", variable=var, value=2,
              command=sel)
    R2.pack( anchor = W )

    R3 = Radiobutton(root, text="Option 3", variable=var, value=3,
              command=sel)
    R3.pack( anchor = W)

    label = Label(root)
    label.pack()
    root.mainloop()

我的疑问是,每当我们在函数中访问全局对象时,我们都必须编写

    global object_name

然后该函数正常工作,否则该函数会生成自己的局部变量副本。那么为什么我们不在函数 sel() 的定义中做同样的事情呢?我尝试在 sel() 的定义中添加以下语句?还,

    global label
    global var

并运行该程序,但它对程序的工作没有任何影响。这是为什么?

4

1 回答 1

2

global只有在修改全局变量时才需要。

考虑以下示例:

myglobal = 'myglobal'

def test_global():
    print myglobal

test_global()

myglobal #output

如果我们看一下字节码,我们会看到变量myglobal是作为全局加载的:

import dis

dis.dis(test_global)

  2           0 LOAD_GLOBAL              0 (myglobal)
              3 PRINT_ITEM
              4 PRINT_NEWLINE
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE

但是,如果我们定义myglobal,我们会看到myglobal加载为常量或局部变量。

import dis

def test_global():
    myglobal = 'mylocal'

dis.dis(test_global)

  2           0 LOAD_CONST               1 ('mylocal')
              3 STORE_FAST               0 (myglobal)
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE

如果我们改为尝试修改myglobalvs 简单地定义它:

myglobal += 'another string'

我们得到一个是UnboundLocalError因为我们没有告诉 Python 这个变量myglobal是一个全局变量。试试这样:

global myglobal
myglobal += 'another string'

这将工作得很好。

于 2013-09-30T19:20:32.363 回答