我创造了一个游戏。它工作得很好,所以我想我应该添加一个屏幕来改变“子弹”的颜色。我做了一个窗口,我给变量分配了全局变量,这些变量是我需要的,但是我不断得到一个错误,说这个变量没有被定义,但是这个变量下面的其他变量被定义了,并且来自同一个'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()
如果我按了一下火枪按钮,子弹会很好地工作,它们会像平常一样变成红色。不过,如果我想它'正常',它甚至不发射任何东西。希望这有意义。我认为这与全球经济减速有关,但我真的坚持这一点。你知道吗
在函数中定义全局变量只是告诉该函数使用指定的同名
global
变量。它本身不分配变量。如果您使用的是Python3,那么可以在shop
函数的嵌入函数中使用声明nonlocal
而不是global
,来告诉嵌入函数使用shop
的本地函数。你知道吗我看到您希望使用
singleplayergame
函数中的变量,因此请考虑在所有函数之外定义这些变量,然后通过global
声明导入它们。你知道吗在这种情况下,将
normal
、fire
和laser
变量移到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
参数的作用。你知道吗相关问题 更多 >
编程相关推荐