使用pygame,我已经制作了一个主菜单,上面有几个按钮。我可以检测到按下按钮的时间并对其采取措施。
然而,控制按下按钮时发生的事情的代码是在另一个文件中(使用getattr),这似乎导致了一些问题。
我正在使用变量menu_open
来控制何时应该完成与菜单相关的事情。当游戏启动并且在一次性开发警告显示(工作正常)之后,它被设置为True。一切都按预期工作,直到我点击我的new game
按钮。这应该只是创建一个空白屏幕。没有任何反应。
我发现menu_open
仍然是True
。似乎正在发生的事情是控制new game
按钮的代码在另一个文件中,并且由于我无法理解的原因,似乎使用了与我的主文件不同的menu_open
版本。 (它没有将我的主文件menu_open
设置为False
,尽管它的测试打印语句打印False
)
控制按下按钮时发生的事情的代码:
def new_game():
print('starting a new game')
import main
main.menu_open=False
print(2,main.menu_open)
我的计划开始:
import pygame,commands #line 1
done = False
menu_open= False #deceleration of menu_open at start of program
game_playing = False
更新菜单的代码(当menu_open
为假时应创建白屏):
def display_frame(self,screen):
global menu_open
print(1,menu_open)
screen.fill(WHITE)
if menu_open:
screen.blit(menu_image,[0,0])
for button in button_list:
button.draw()
pygame.display.flip()
导致按钮控件的代码:
def run_logic(self): #worth noting this is called right before display_frame()
global mouse_pos,mouse_press
mouse_pos = pygame.mouse.get_pos()
mouse_press = pygame.mouse.get_pressed()
for button in button_list:
button.check() #runs the following:
def check(self):
if self.hovered:
if mouse_press[0] == True:
try:
command_to_call = getattr(commands,self.command)
command_to_call()
except:
print('[DEV]: invalid command')
打印陈述的结果:
1 True # button not pressed
1 True # True here is my main files 'menu_open'
1 True
1 True
1 True
1 True
starting a new game #button pressed
2 False #false is the other files 'menu open'
1 True # True here is my main files 'menu_open'
starting a new game
2 False
1 True
starting a new game
2 False
1 True
starting a new game
2 False
1 True #button released, menu still normal
1 True
1 True
1 True
我对多文件编程不是很有经验,所以感谢任何帮助。 也许值得注意我的IDE(pyscripter)错误很多pygame。 到目前为止,按钮控制工作正常。我已经使用它退出了按钮。
如果您需要我的程序中的更多代码,请随时问:) 如果我的代码很好,这只是python / pyscripter / pygame的错误,请说出来。
答案 0 :(得分:0)
解决此问题的正确方法是将变量移动到单独的模块中。但无论如何,我都会解释你做错了什么。
大概是[...]程序的开始"位于名为main.py
的文件中。通常当您想要访问模块时,可以通过路径/文件名导入它,在本例中为main
。但是,解释器调用的第一个脚本不以其路径/文件名命名,而是 始终 ,名为__main__
,无论如何其他任何事情。因此,导入它的正确方法不是你应该这样做,是使用import __main__
然后通过该名称访问它。