Python 如果我正在导入它,为什么不定义它?
因此,我有一个模块,它创建了一个类的实例,用于打开我正在制作的pygame游戏的主菜单,如下所示:Python 如果我正在导入它,为什么不定义它?,python,pygame,Python,Pygame,因此,我有一个模块,它创建了一个类的实例,用于打开我正在制作的pygame游戏的主菜单,如下所示: import pygame as pg #,time, os, csv, operator, sys import startup, config as C pg.init() os.environ["SDL_VIDEO_CENTERED"] = "1" pg.display.set_caption("Tower Defence") if __name__ == "__main__":
import pygame as pg #,time, os, csv, operator, sys
import startup, config as C
pg.init()
os.environ["SDL_VIDEO_CENTERED"] = "1"
pg.display.set_caption("Tower Defence")
if __name__ == "__main__":
live_menu = startup.Menu()
然后在一个名为startup
的单独模块中,我有一个事件函数,其中包含以下代码行:
实时菜单。播放按钮。事件处理程序(事件)
play_button
是菜单
类中的一个实例变量,它创建一个按钮类(在另一个模块中),该按钮类在显示器上创建一个按钮<代码>事件处理程序是运行以检查按钮是否按下的函数
我的问题是,当执行上面的代码行时,我得到了以下错误:namererror:name'live_menu'未定义
,尽管我导入了创建类的模块。为什么会这样
这是我到目前为止的全部资料。很抱歉评论太少。问题是没有执行行
live\u menu=startup.menu()
。这是因为您只导入文件而不执行文件,并且由于该行位于中,如果uuuu name_uuuuu==“uuuuuu main_uuu”:
分支,则不会执行该行
要解决此问题:
因此,您只需在main
模块中创建一个函数,并在startup
模块中调用该函数一次即可
main.py
import pygame as pg#, time, os, csv, operator, sys
import startup, config as C
from pygame.locals import *
def start():
pg.init()
os.environ["SDL_VIDEO_CENTERED"] = "1"
pg.display.set_caption("Tower Defence")
print ("Game initialising. Display size: ", C.game_screen_full_w,"x", C.game_screen_h)
live_menu = startup.Menu()
然后在startup
模块中导入文件main
,并使用以下代码调用函数start
import pygame as pg, os, sys, csv
import config as C, button as B, mapgen, main
main.start()
更新:
正如您在评论中所述,仅此一点并不能解决此问题,因为当您在文件main
中为类菜单导入文件startup
时,它会导入您不需要的其他模块,这会导致出现错误
要解决此问题,请在单独的文件中定义菜单
类。将此文件调用为类似于Menu.py
的名称,并在其中定义菜单
类,就像使用按钮
类一样
在主
模块中,使用导入菜单导入它
现在,创建类的实例将如下所示:
live\u menu=menu.menu()
更新2:
我刚刚再次查看了您的代码,我看到另一个问题将出现,即如果您将菜单
类移出启动
文件,则不会定义事件主
函数。菜单
类需要它,因此我认为最好包含它,因为它只处理与主菜单相关的事件处理
我刚刚更改了代码,以便它可以作为一种方法工作。这是全班同学
class Menu():
def __init__(self):
pg.init()
self.screen = C.screen #importing screen from config file
self.button_x = C.game_screen_full_w * 0.4
self.button_y = [C.game_screen_h * 0.30, C.game_screen_h * 0.50, C.game_screen_h * 0.70]
#create 4 buttons on screen
self.play_button = B.Button("mapgen.main()", (160, 40), (self.button_x,self.button_y[0]), C.L_BLUE, C.DARK_GREY, None, C.BLUE, C.L_BLUE, "Play")
self.lead_button = B.Button("startup.Lead()", (200, 40), (self.button_x - 20,self.button_y[1]), C.L_BLUE, C.DARK_GREY, None, C.BLUE, C.L_BLUE, "Leaderboard")
self.quit_button = B.Button("quit()", (160, 40), (self.button_x,self.button_y[2]), C.L_BLUE, C.DARK_GREY, None, C.BLUE, C.L_BLUE, "Quit")
self.vol_button = B.Button(None, (50,50), (40,40), C.L_BLUE, C.DARK_GREY, None, C.BLUE, C.L_BLUE, "♫")
self.menu_screen()
def menu_screen(self):
m_loop = False
self.screen.fill(C.BLUE)
while not m_loop:
self.play_button.draw()
self.lead_button.draw()
self.quit_button.draw()
self.vol_button.draw()
self.event_main()
pg.display.update()
def event_main():
for event in pg.event.get():
self.play_button.event_handler(event)
self.lead_button.event_handler(event)
self.quit_button.event_handler(event)
self.vol_button.event_handler(event)
if event.type == pg.QUIT:
pg.quit(); sys.exit()
我认为这是代码的最后一个问题
注意:我将行pg.quit(),sys.exit()
更改为pg.quit();sys.exit()
。据我所知,Python中的语句不能用逗号分隔。不过我相信你可以用分号
希望这个答案对你有所帮助,如果你还有任何问题,请随时在下面发表评论 语句live\u menu=startup.menu()
在当前模块中分配一个变量。它根本不会影响启动
模块。@jasonharper但是如果我将main
导入启动
模块,我难道不能使用它吗?不,如果name==“main”行仅在执行main.py时成功,而不是在导入时成功。@gout解决这个问题的最佳方法是什么?我不确定在我的代码中的哪一点我应该运行行live\u menu=startup.menu()
,是的,那是我在尝试的事情。谢谢你的回复。我尝试了使用start
函数的方法,但它导致两个文件都需要相互导入,这不利于工作。运行main.py
会导致导入启动,然后在`main.py`中运行start
函数,并返回一个错误,说明模块启动没有属性菜单
。首先运行startup.py
不起作用,因为它必须导入main
,而后者又导入startup
,并抛出类似的错误。你能更具体地解释一下它是如何工作的吗?如果我把我的观点弄砸了:我想要实现的主要想法是创建一个类菜单
实例的模块,然后我可以在包含类菜单
的模块的同一个模块中访问该模块。如果放弃这个想法并将其保存在一个文件中更好,那么这可能就是我必须要做的。好的,我明白问题所在。您应该做的(我本来应该包括答案)是在一个单独的文件中定义菜单
类。这更有意义,因此您可以导入该类,而无需导入运行其他模块负载的文件。只需定义类,不要从文件中的main
导入,更新导入,一切都应该正常。@J.Shaw我刚刚更新了我的答案两次,以解决您指出的问题以及我在查看您的代码时预见到的问题。我希望这两个更新将解决您的问题!美好的我让它工作了。非常感谢你的帮助