全局变量没有通过,说它不被识别?

时间:2016-05-02 20:35:30

标签: python tkinter global-variables

我创造了一款游戏。它工作得很好,所以我想我会添加一个屏幕来改变“子弹”的颜色。我做了窗口,我分配了变量我遍布那些我需要的变量,但是我不断得到一个错误,说变量没有被定义,但是变量下面的其他变量被定义并来自同一个' shop& #39;功能被定义。如果我摆脱正常,只有FireGun和LaserGun FireGun没有定义。很难解释。所以看看代码,我已经大打折扣了,看看你是否可以发现任何错误。

from tkinter import *

def MainMenu():
    self = Tk()

    self.btnShops = Button(text ="Shop")
    self.btnShops.pack()

    def startShops(event):
        self.destroy()
        Shop()


    self.btnShops.bind('<Button>',startShops)



    self.geometry("830x700")
    self.title("Space Assault")
    self.configure(bg="black")



def Shop():
    self = Tk()


    normal = 1
    fire = 0
    laser = 0

    def FireGun(event):
        global fire
        global normal
        global laser
        fire = 1
        normal = 0
        laser = 0

    def LaserGun(event):
        global laser
        global fire
        global normal
        laser = 1
        fire = 0
        normal = 0


    self.btnfireGun = Button(text="Fire Gun")
    self.btnfireGun.pack()
    self.btnlaser = Button(text = "Laser Gun")
    self.btnlaser.pack()
    self.btnMainMenu = Button(text="Main Menu")
    self.btnMainMenu.pack()


#Bind
    self.btnfireGun.bind('<Button>',FireGun)
    self.btnlaser.bind('<Button>', LaserGun)
    self.btnMainMenu.bind('<Button>',StartMainMenu)

#Frame settings
    self.geometry("830x700")
    self.title("Space Assault Shop")
    self.configure(bg="black")

def singleplayergame():

    def Shoot(event):
        global normal
        global fire
        global laser

        self.shot = Canvas(bg="black",highlightthickness=0,width=10,height=10)
        self.shot.place(x=shotXpos,y=shotYpos)

        if normal == 1:
            self.shot.create_oval(0,0,10,10,fill=random.choice(COLORS))
        elif fire == 1:
            self.shot.create_oval(0,0,10,10,fill='red')
        elif laser == 1:
            self.shot.create_oval(0,0,10,10,fill='blue')

MainMenu() 

如果我点击FireGun按钮,子弹工作正常,它们会像正常情况一样呈红色。但是,如果我想要它正常&#39;它甚至不会发射任何东西。希望这是有道理的。我认为它与全球减速有关,但我真的坚持这个。

2 个答案:

答案 0 :(得分:2)

很多事情正在发生。

你不应该像这样嵌套函数。如果您正在尝试封装数据/结构,那么只需使用一个类。你似乎想要通过命名Tk() self并在整个地方调用self来使用它。这实际上只是为Tk设置了一堆属性。

您正在创建Tk()的多个实例。如果您想要新窗口,请使用Toplevel()小部件。否则,只需使用pack_forget / grid_forget来隐藏您想要的框架/小部件,并使用pack / grid“取消隐藏”其他框架/网格以替换它们。

无需运行多个Tk()实例。

您永远不会致电mainloop

您在变量上调用global,这是您无需重构的。如果您使用全局9/10,则会有XY problem。他们开始时甚至都不是全球性的。它们是您嵌套的函数的本地。 如果确实需要此结构,则可以使用nonlocal。同样,如果您要使用这样的结构,只需使用一个类并将它们保存为属性。

无需在所有按钮上使用bind,只需在点击时调用功能即可。这就是command参数的用途。

答案 1 :(得分:1)

在函数内定义一个全局变量只是告诉该函数使用同名的global变量。它本身不分配变量。如果您使用的是Python3,则可以在nonlocal函数的嵌入函数中使用声明global而不是shop来告诉嵌入式函数使用shop本地函数

我看到你想要使用singleplayergame函数中的变量,所以考虑在所有函数之外定义这些变量,然后通过global声明导入它们。

在这种情况下,将normalfirelaser变量移到shop函数之外应该可以解决问题。

以下是一些帮助Python范围的链接。

Python scoping: understanding LEGB

Setting a global variable in a function