Python 如果我正在导入它,为什么不定义它?

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__":

因此,我有一个模块,它创建了一个类的实例,用于打开我正在制作的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__":
    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我刚刚更新了我的答案两次,以解决您指出的问题以及我在查看您的代码时预见到的问题。我希望这两个更新将解决您的问题!美好的我让它工作了。非常感谢你的帮助