全局变量未通过,表示未被识别



我创建了一个游戏。它运行得很好,所以我想我应该添加一个屏幕来改变"子弹"的颜色。我制作了一个窗口,我分配了变量,我全局化了我需要的变量,但我一直收到一个错误,说变量没有定义,但定义了变量下面的其他变量,这些变量来自同一个"shop"函数。如果我摆脱了正常,只有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() 

如果我点击"火枪"按钮,子弹就会正常工作,它们会像往常一样变成红色。然而,如果我想让它"正常",它甚至不会发射任何东西。希望这是有道理的。我认为这与全球减速有关,但我真的坚持了下来。

很多事情都在发生。

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

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

不需要运行多个Tk()实例。

你从来没有打过mainloop

您正在对变量调用global,这是不必要的,您可以进行重组。如果你使用的是全局9/10,那么你就有一个XY问题。它们一开始甚至不是全球性的。它们是您嵌套的函数的本地函数。如果确实需要此结构,则可以使用nonlocal。同样,如果你想要这样的结构,只需使用一个类并将其作为属性。

不需要在所有按钮上使用bind,只需在单击时调用一个函数。这就是command参数的作用。

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

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

在这种情况下,将normalfirelaser变量移动到shop函数之外就可以了。

以下是一些链接,可以帮助您了解Python中的作用域。

Python范围界定:理解LEGB

在函数中设置全局变量

最新更新