所以我有一个模块创建一个类的实例,用于调出我正在制作的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_button
是Menu
类中的一个实例变量,它创建一个按钮类(在另一个模块中),在显示屏上创建一个按钮。 event_handler
是运行以检查按钮是否被按下的函数。
我的问题是,当执行上面的代码行时,我得到以下错误:NameError: name 'live_menu' is not defined
尽管我导入了创建类的模块。这是为什么?
这是我到目前为止的完整code。很抱歉评论不足。
答案 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中的语句。我相信你可以使用分号。
希望这个答案对您有所帮助,如果您有任何其他问题,请随时在下面发表评论!