python - 如果我导入它,为什么没有定义它?

标签 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__":
    live_menu = startup.Menu()

然后在一个名为 startup 的单独模块中,我有一个事件函数,其中包含以下代码行:

live_menu.play_button.event_handler(事件)

play_buttonMenu 类中的一个实例变量,它创建一个按钮类(在另一个模块中),该按钮类在显示屏上创建一个按钮。 event_handler 是运行以检查按钮是否被按下的函数。

我的问题是,当执行上面的代码行时,我收到以下错误: NameError: name 'live_menu' is not Defined 尽管我导入了创建该类的模块。这是为什么?

这是完整的code我到目前为止。抱歉评论数量较少。

最佳答案

问题在于 live_menu = startup.Menu() 行没有被执行。这是因为您仅导入文件而不执行文件,并且该行位于 if __name__ == "__main__": 内。分支,它没有被执行。

要解决此问题:

因此,您只需在 main 中创建一个函数即可模块并在 startup 中调用该函数一次模块。

ma​​in.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()

更新:

正如您在评论中所述,仅此并不能解决问题,因为当您导入文件 startup 时类(class)Menu在文件main中,它会导入您不需要的其他模块,这会导致错误。

要解决此问题,请定义 Menu类在一个单独的文件中。将此文件命名为 Menu.py只需定义 Menu里面的类就像你的 Button 一样类(class)。

main模块,使用 import menu 导入它.

创建该类的实例现在看起来像这样:

live_menu = menu.Menu()

更新2:

我刚刚再次查看了您的代码,我发现会出现另一个问题,即 event_main如果移动Menu,函数将不会被定义类出startup文件。 Menu类需要这个,所以我认为最好包含它,因为它处理事件处理仅与主菜单相关

我刚刚更改了代码,以便它可以作为一种方法工作。这是完整的类(class)。

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 中不能用逗号分隔语句。我确信您可以使用分号。

希望这个回答对您有所帮助,如果您还有其他问题,请随时在下面发表评论!

关于python - 如果我导入它,为什么没有定义它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48653617/

相关文章:

python - 让 Sprite 互相弹开

python - Connect 4 Alpha-beta 修剪可能失败 :(

python - 使用 weby 将多个模板相互嵌套

python - 使用另一个列表查找配对元素列表中的元素 (Python)

python - pygame 不会 blit 内部函数吗?

python - Pygame 塔防游戏,寻找目标的问题

python - 将 int 数组转换为 chars 数组 - Python

java - 使用 .toPandas() 函数时如何修复 Py4JJavaError?

python - mac os中的pygame安装问题

python - 目前如何在Pygame中播放视频?