如何解决Pygame 窗口关闭时 Pexpect 挂起
我有一个 python 应用程序,它打开一个 pygame 游戏,玩了 20 次,关闭游戏,然后保存结果(游戏是物理动力学模拟)。这很好用,但我需要运行该程序 30 次(即 30 次运行 20 个游戏),每次都有不同的参数。
我正在尝试编写一个 Pexpect 程序,它可以运行我的游戏,输入参数,然后等到游戏完成并记录结果。到目前为止,我只让它运行了一个游戏,作为测试:
import pexpect
child = pexpect.spawn('python main.py')
child.expect("Trial Number: ")
child.sendline('1')
child.expect("Damping: ")
child.sendline("2")
child.expect("Acceleration: ")
child.sendline("1000")
child.expect(pexpect.EOF,timeout=None)
但是,当游戏第20次运行结束时,当pygame窗口向主程序发送pygame.QUIT时,窗口挂起,结果没有保存,程序也没有终止。
我的问题是如何让 Pexpect 知道当 pygame 窗口关闭时,main.py 程序仍在运行(即它还没有达到 EOF?)。有什么我遗漏的东西可能会导致这种行为吗?
这是我的 Pygame 基本代码:
import pygame as pg
from settings import *
class SceneManager:
def __init__(self):
pg.init()
self._screen = pg.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
pg.display.set_caption(TITLE)
self.clock = pg.time.Clock()
self.scene = None
self._running = True
def loop(self):
while self._running:
if pg.event.get(pg.QUIT): # if any QUIT event in the queue
self.quit()
self.scene.handle_events()
self.scene.update()
self.scene.draw()
pg.display.update()
def swicth_to(self,scene):
self.scene = scene
def quit(self):
self._running = False
这是我的 main.py 文件
#Entrance of the program.
from game import *
from postprocessing import *
import random
def main():
random.seed(RANDOM_SEED)
game = Game()
while game.running and game.current_generation < N_GEN:
game.reset()
game.run()
#This is the part that saves the results and reads data from the games that were just run. This bit isn't running.
if PP_FORMULA or PP_GRAPH_VISUALIZATION:
gs = [extract_computational_subgraph(ind) for ind in game.pop]
for ind in game.pop:
if ind.fitness is not None:
if PP_FORMULA:
print("Writing formula to ./pp/formula.txt ...")
with open("./pp/Trial{}/formulas.txt".format(TRIAL_NUMBER),'w') as f:
for i,g in enumerate(gs):
formula = simplify(g,['(rel_x)','(cat_velocity_angle)','(rel_x)'])
formula = round_expr(formula,PP_FORMULA_NUM_DIGITS)
print(
f"{i}\n score: {game.pop[i].fitness}\n formula: {formula}")
f.write(
f"{i}\n score: {game.pop[i].fitness}\n formula: {formula}\n")
if PP_GRAPH_VISUALIZATION:
print("Drawing graphs to files in folder ./pp ...")
for i,g in enumerate(gs):
visualize(g,f"./pp/Trial{TRIAL_NUMBER}/g{ind.fitness}.pdf",input_names=['rel_x','cat_velocity_angle','rel_x'])
if __name__ == '__main__':
main()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。