我创建了一个游戏。它运行得很好,所以我想我应该添加一个屏幕来改变"子弹"的颜色。我制作了一个窗口,我分配了变量,我全局化了我需要的变量,但我一直收到一个错误,说变量没有定义,但定义了变量下面的其他变量,这些变量来自同一个"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
声明导入它们。
在这种情况下,将normal
、fire
和laser
变量移动到shop
函数之外就可以了。
以下是一些链接,可以帮助您了解Python中的作用域。
Python范围界定:理解LEGB
在函数中设置全局变量