如何在PyQt5中销毁和重新创建窗口?
如何在PyQt5中销毁和重新创建窗口?
我正在练习多文件编程,并正在实现一个简单的扫雷游戏。当用户开始新游戏时,我会在窗口主体创建一个QPushButtons的网格。
问题在于,每当玩家想要开始新的扫雷游戏时,我不知道如何调整窗口大小和重置我的QPushButtons网格,以便可以玩新的扫雷游戏。我的初始方法是使用以下代码销毁原始窗口并创建全新的窗口:
def newEasyGame(self): app = QApplication([]) window = minesweeperWindow(10, 10, "easy") window.show() app.exec()
我收到错误信息:QCoreApplication::exec:事件循环已在运行中。
编辑:根据要求,以下是一个更完整的代码块,更详细地描述了我正在尝试做的事情:
from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * class minesweeperDemoWindow(QMainWindow): def __init__(self, rows, cols, difficulty): super(minesweeperDemoWindow, self).__init__() #Central widget that is everything is contained within widget = QWidget() self.setCentralWidget(widget) #Vertical layout with a grid of buttons inside of it layout = QVBoxLayout() widget.setLayout(layout) #create a grid of QPushButtons that act as the playing field self.playingField = [[0 for x in range(rows)] for y in range(cols)] grid = QGridLayout() #for every row and column, add a button for r in range(0, rows): for c in range(0, cols): button = QPushButton() button.setFixedSize(30, 30) #keep track of each button's position with myRow and myCol button.setProperty("myRow", r) button.setProperty("myCol", c) button.clicked.connect(self.buttonClicked) self.playingField[r][c] = button grid.addWidget(self.playingField[r][c], r, c) layout.addLayout(grid) grid.setSpacing(0) #How a user is going to start a new game menu = self.menuBar().addMenu("&Start new Game") newEasy = QAction("Easy", self, shortcut=QKeySequence.New, triggered=self.newEasyGame) #when the Easy menu item is selected, destroy the window and create a new easy game def newEasyGame(self): app = QApplication([]) window = minesweeperWindow(10, 10, "easy") window.show() app.exec_()
admin 更改状态以发布 2023年5月21日
你不必摧毁窗口。在这种情况下,可能的解决方案是消除包含QGridLayout的小部件。为此,必须创建一个方法,如果需要,实现销毁逻辑和创建按钮。\n
from PyQt5 import QtCore, QtGui, QtWidgets class MinesweeperDemoWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super(MinesweeperDemoWindow, self).__init__(parent) levels = [ (4, 4, "level1"), (8, 8, "level2"), (16, 16, "level3"), (32, 32, "level4"), ] menu = self.menuBar().addMenu("&Start new Game") for r, c, name in levels: action = menu.addAction(name) action.setData((r, c)) action.triggered.connect(self.on_triggered) r, c, _ = levels[0] self.setSize(r, c) @QtCore.pyqtSlot() def on_triggered(self): action = self.sender() r, c = action.data() self.setSize(r, c) def setSize(self, rows, cols): # delete the old container widget = self.centralWidget() if widget is not None: widget.deleteLater() # create new container widget = QtWidgets.QWidget() self.setCentralWidget(widget) grid = QtWidgets.QGridLayout(widget) self.playingField = [[0 for x in range(rows)] for y in range(cols)] for r in range(rows): for c in range(cols): button = QtWidgets.QPushButton() button.setFixedSize(30, 30) # keep track of each button's position with myRow and myCol button.setProperty("myRow", r) button.setProperty("myCol", c) # button.clicked.connect(self.buttonClicked) self.playingField[r][c] = button grid.addWidget(button, r, c) self.setFixedSize(widget.sizeHint()) @QtCore.pyqtSlot() def buttonClicked(self): pass if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) w = MinesweeperDemoWindow() w.setSize(4, 4) w.show() sys.exit(app.exec_())