多次运行和退出PyQt应用程序

问题描述 投票:0回答:1

上下文

我正在使用PyQt创建自己的棋盘游戏版本Battleship。 PyQt主窗口包含自己的板和敌方板。棋盘由玩家可向其射击的可点击磁贴组成。该实现支持HUMANvsAI和AIvsAI游戏。我想通过仿真测试我的AI算法的强度。例如,我想循环运行1,000个AIvsAI游戏,并获得%胜利率,平均准确性等统计信息。Screenshot of the game

主要问题

我正在努力运行PyQt应用多次以收集游戏数据,例如在for循环中。具体来说,我找不到运行该应用程序,退出它并再次重新运行它的方法。从概念上讲,我正在寻找这样的东西:

# conceptual snippet
  for i in range(n):
    app = QApplication([])
    window = MainWindow(b_size, boat_dict, players)
    app.exec_()

具有在其他地方退出该应用程序并在每次游戏结束时调用的调用:

# conceptual snippet
  if is_game_over():
    sys.exit(app.exec_())

但是这个简单的解决方案打破了for循环。欢迎就顺序(例如循环方法)或并行线程多次运行和退出PyQt应用程序提供任何反馈。

python loops for-loop pyqt pyqt5
1个回答
0
投票

您不应该使用sys.exit(),因为该指令用于终止程序的执行,如果要终止Qt应用程序,则必须使用QCoreApplication::quit()(或QCoreApplication::exit(0))。另外,另一个改进将是使用多处理:

import random
from multiprocessing import Pool

from PyQt5 import QtCore, QtWidgets


def create_app(i):
    app = QtWidgets.QApplication([])
    w = QtWidgets.QMainWindow()
    w.setWindowTitle("Game-{}".format(i))
    w.show()

    # emulate end-game
    def end_game():
        QtCore.QCoreApplication.quit()

    timeout = random.randint(1000, 2000)  # 1000-2000 milliseconds
    QtCore.QTimer.singleShot(timeout, end_game)
    app.exec_()

    # emulate results
    o = {"victory": random.randint(0, 101), "average": random.randint(0, 101)}
    return o


def main():
    results = []
    pool = Pool(processes=8)
    for i in range(1000):
        r = pool.apply_async(create_app, args=(i,))
        results.append(r)
    pool.close()
    pool.join()
    print([result.get() for result in results])


if __name__ == "__main__":
    main()
© www.soinside.com 2019 - 2024. All rights reserved.