有没有办法从函数内部更改全局值?

问题描述

我目前正在玩蛇游戏,但首先要显示一个设置窗口。为此,我使用了tkinter。在较小的项目中,我只是将所有代码写入了pressButton函数中,但是我现在想拥有非spagetti代码,所以我不打算这样做。问题是,我不知道如何从pressButton函数和settingsWin函数获取进入括号中的输入值作为全局变量到我的主代码中。问题是我将函数用作Button的命令,因此无法使用“ return”。您可以从函数内部直接更改主代码中的全局变量吗?如果是,怎么办?还是有解决此问题的另一种方法? 我的代码

def settingsWin():

    def pressButton():
        len = entryLen.get()
        wid = entryWid.get()
        speed = entrySpeed.get()
        print(len+wid+speed)
        SettingsWin.destroy()
        return len

    SettingsWin = Tk()
    SettingsWin.geometry("600x600")
    SettingsWin.title("Settings")
    label1 = Label(SettingsWin,text="playing field [tiles]")
    label1.pack()
    entryLen = Entry(SettingsWin,bd=2,width=20)
    entryLen.pack()
    label2 = Label(SettingsWin,text="X")
    label2.pack()
    entryWid = Entry(SettingsWin,width=20)
    entryWid.pack()
    labelblanc = Label(SettingsWin,text="")
    labelblanc.pack()
    label3 = Label(SettingsWin,text="Speed [ms per tick]")
    label3.pack()
    entrySpeed = Entry(SettingsWin,width="20")
    entrySpeed.pack()
    okButton = Button(SettingsWin,text="OK",command=pressButton)
    okButton.pack()


    SettingsWin.mainloop()

len = "len"
wid = "wid"
speed = "speed"

解决方法

通常要求代码在函数外部的范围内更改变量(除非在闭包的情况下,这很有用),这通常表示代码有异味,可以使用global来做到这一点。关键字:

greeting = "Hello world!"

def greet():
    global greeting
    greeting = "Goodbye world!"

print(greeting)

greet()

print(greeting)

通过声明变量greeting在全局范围内,在函数定义内更改变量可以使函数影响全局变量。

如果您在嵌套的子项中工作,则nonlocal关键字将在内部子项中提供对外部子项中变量的访问。它与global相似,但它用于更广泛的词法范围,而不是全局范围。