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

时间:2018-02-06 23:27:45

标签: 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(event)

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

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

这是我到目前为止的完整code。很抱歉评论不足。

1 个答案:

答案 0 :(得分:1)

问题是行add_hyperref = function (x, target="http://www.google.de", style = NULL, pos = "after") { if ( is.null(style) ) style <- x$default_styles$table style_id <- x$doc_obj$get_style_id(style = style, type = "character") refID = sprintf("rId%d",x$doc_obj$relationship()$get_next_id()) x$doc_obj$relationship()$add( refID, type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", target=target, target_mode="External") xml_elt = sprintf("<w:hyperlink r:id='%s' w:history='1'><w:r w:rsidRPr='00CD112F'><w:rPr><w:rStyle w:val='Hyperlink'/></w:rPr><w:t>LINK</w:t></w:r></w:hyperlink>", refID) xml_elt = paste0(officer:::wml_with_ns("w:p"), "<w:pPr><w:pStyle w:val=\"", style_id, "\"/></w:pPr>", xml_elt, "</w:p>") body_add_xml(x = x, str = xml_elt, pos = pos) } 未被执行。这是因为您只导入文件而不执行文件,因为该行在live_menu = startup.Menu()分支内,所以它没有被执行。

解决此问题:

因此,你可以在if __name__ == "__main__":模块中创建一个函数,并在main模块中调用该函数一次。

<强> main.py

startup

然后在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导入文件Menu时,它会导入其他模块你不需要这就是造成你的错误。

要解决此问题,请在单独的文件中定义main类。将此文件称为Menu,只需在其中定义Menu.py类,只需使用Menu类即可。

Button模块中,使用main导入它。

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

import menu

更新2:

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

我刚刚更改了代码,以便它可以作为一种方法。这是全班。

Menu

我认为这是代码的最后一个问题。

注意:我将行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()。据我所知,你不能用逗号分隔Python中的语句。我相信你可以使用分号。

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