全局变量不传递,说它不被识别?

2024-10-03 21:29:21 发布

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

我创造了一个游戏。它工作得很好,所以我想我应该添加一个屏幕来改变“子弹”的颜色。我做了一个窗口,我给变量分配了全局变量,这些变量是我需要的,但是我不断得到一个错误,说这个变量没有被定义,但是这个变量下面的其他变量被定义了,并且来自同一个'shop'函数。如果我摆脱了正常,只有火枪和激光枪,火枪是没有定义的。很难解释。所以看看代码,我已经做了很多模拟,看看你是否能找出任何错误。你知道吗

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() 

如果我按了一下火枪按钮,子弹会很好地工作,它们会像平常一样变成红色。不过,如果我想它'正常',它甚至不发射任何东西。希望这有意义。我认为这与全球经济减速有关,但我真的坚持这一点。你知道吗


Tags: textselfevent定义binddefbuttonshop
2条回答

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

我看到您希望使用singleplayergame函数中的变量,因此请考虑在所有函数之外定义这些变量,然后通过global声明导入它们。你知道吗

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

这里有一些链接可以帮助您在Python中使用scope。你知道吗

Python scoping: understanding LEGB

Setting a global variable in a function

发生了很多事情。你知道吗

你不应该这样嵌套函数。如果您试图封装数据/结构,那么只需使用一个类。你似乎想用一种方法来命名Tk()self,然后到处叫self。这实际上只是将一系列属性设置为Tk。你知道吗

您正在创建Tk()的多个实例。如果您想要新窗口,那么使用Toplevel()小部件。否则,只需使用pack_forget/grid_forget基本上隐藏所需的框架/小部件,并使用pack/grid“取消隐藏”其他框架/小部件来替换网格上的框架/小部件。你知道吗

不需要运行多个Tk()实例。你知道吗

你从不打电话给mainloop。你知道吗

您正在调用global变量,这是不必要的,您可以重新构造。如果您使用的是globals9/10,那么就有一个XY problem。一开始它们甚至都不是全球性的。它们是嵌套的函数的局部函数。 如果你真的想要这个结构,你可以使用nonlocal。同样,如果你想要一个这样的结构,只需要使用一个类并把它们作为属性。你知道吗

无需在所有按钮上使用bind,只需单击调用函数即可。这就是command参数的作用。你知道吗

相关问题 更多 >