gpt4 book ai didi

python - 全局变量没有传递,说它不被识别?

转载 作者:行者123 更新时间:2023-11-30 22:56:24 24 4
gpt4 key购买 nike

我创建了一个游戏。它工作得很好,所以我想我应该添加一个屏幕来改变“子弹”的颜色。我创建了窗口,我分配了变量,我全局化了我需要的那些变量,但是我不断收到错误,说该变量尚未定义,但该变量下已定义且来自同一“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()

如果我点击 FireGun 按钮,子弹就会正常工作,并且会像平常一样显示为红色。但是,如果我想要它“正常”,它甚至不会触发任何东西。希望这是有道理的。我认为这与全局经济减速有关,但我真的坚持这一点。

最佳答案

发生了很多事情。

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

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

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

你永远不会调用mainloop

您正在对变量调用global,这是不必要的,您可以重构。如果您使用全局变量 9/10,您将获得 XY problem 。它们实际上根本就不是全局性的。它们是您嵌套的函数的本地函数。如果您确实想要这种结构,则可以使用nonlocal。再说一次,如果您想要这样的结构,只需使用一个类并将它们保留为属性。

无需在所有按钮上使用 bind 只是为了在单击时调用函数。这就是 command 参数的用途。

关于python - 全局变量没有传递,说它不被识别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36991211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com