我创造了一款游戏。它工作得很好,所以我想我会添加一个屏幕来改变“子弹”的颜色。我做了窗口,我分配了变量我遍布那些我需要的变量,但是我不断得到一个错误,说变量没有被定义,但是变量下面的其他变量被定义并来自同一个' 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;它甚至不会发射任何东西。希望这是有道理的。我认为它与全球减速有关,但我真的坚持这个。
答案 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
声明导入它们。
在这种情况下,将normal
,fire
和laser
变量移到shop
函数之外应该可以解决问题。
以下是一些帮助Python范围的链接。