话不多说,直接看图。

接下来对上述流程图中的各个部分做详细说明。
GameOverPage 类继承自 QDialog 类,是弹出对话框。

成员变量:
成员函数:
gameover = pyqtSignal(str)GameOverPage 类的创建需要传入三个参数:time、step和isNewRecord。所以该类的代码框架如下:
class GameOverPage(QDialog):
""" 游戏结束页面 """
gameover = pyqtSignal(str) # 自定义信号
def __init__(self, time, step, isNewRecord):
super(GameOverPage, self).__init__()
self.time = time
self.step = step
self.playerName = ''
self.isNewRecord = isNewRecord
self.initUI(self.isNewRecord)
def initUI(self, isNewRecord):
pass
def over(self):
pass
游戏结束了,那么游戏数据是必须要进行展示的,即游戏用时和游戏步数,这属于新纪录和不是新纪录展示的共同部分。

该部分实现代码:
font = QFont()
font.setPointSize(15)
lbInfo = QLabel('您本次成绩为: \r\n时间: {}s\r\n步数: {}'.format(self.time, self.step))
lbInfo.setFont(font)
# 布局
self.vltMain.addWidget(lbInfo, 0, Qt.AlignLeft)
如果用户打破了记录,提示并让用户输入姓名:

否则提示其未打破记录:

该部分实现代码:
# 根据是否打破了记录进行布局
if self.isNewRecord:
lbSaveResult = QLabel('恭喜您打破记录,请留下姓名:')
font.setBold(True)
lbSaveResult.setFont(font)
self.letName = QLineEdit()
self.letName.setFixedSize(360, 30)
self.vltMain.addWidget(lbSaveResult, 0, Qt.AlignLeft)
self.vltMain.addWidget(self.letName, 0, Qt.AlignLeft)
else:
lbGameover = QLabel('很遗憾您没有打破纪录,再接再厉!')
font.setBold(True)
lbGameover.setFont(font)
self.vltMain.addWidget(lbGameover, 0, Qt.AlignLeft)
self.btnConfirm = QPushButton('确定')
self.btnConfirm.setFixedSize(80, 30)
self.btnConfirm.clicked.connect(self.over)
self.vltMain.addWidget(self.btnConfirm, 0, Qt.AlignRight)
self.setLayout(self.vltMain)
self.setFixedSize(380, 200)
self.setStyleSheet("background-color:lightblue;")
self.setWindowTitle('游戏结束')
self.show()
over()函数完成游戏结束时的操作:
新纪录游戏结束页面:

不是新纪录游戏结束页面:

import os
import sys
from PyQt5.QtWidgets import QLabel, QMessageBox, QVBoxLayout, QPushButton, QApplication, QLineEdit, QDialog
from PyQt5.QtGui import QPixmap, QFont
from PyQt5.QtCore import Qt, pyqtSignal
class GameOverPage(QDialog):
""" 游戏结束页面 """
gameover = pyqtSignal(str) # 自定义信号
def __init__(self, time, step, isNewRecord):
super(GameOverPage, self).__init__()
self.time = time
self.step = step
self.playerName = ''
self.isNewRecord = isNewRecord
self.vltMain = QVBoxLayout()
self.initUI(self.isNewRecord)
def initUI(self, isNewRecord):
font = QFont()
font.setPointSize(15)
lbInfo = QLabel(
'您本次成绩为: \r\n时间: {}s\r\n步数: {}'.format(self.time, self.step))
lbInfo.setFont(font)
# 布局
self.vltMain.addWidget(lbInfo, 0, Qt.AlignLeft)
# 根据是否打破了记录进行布局
if self.isNewRecord:
lbSaveResult = QLabel('恭喜您打破记录,请留下姓名:')
font.setBold(True)
lbSaveResult.setFont(font)
self.letName = QLineEdit()
self.letName.setFixedSize(360, 30)
self.vltMain.addWidget(lbSaveResult, 0, Qt.AlignLeft)
self.vltMain.addWidget(self.letName, 0, Qt.AlignLeft)
else:
lbGameover = QLabel('很遗憾您没有打破纪录,再接再厉!')
font.setBold(True)
lbGameover.setFont(font)
self.vltMain.addWidget(lbGameover, 0, Qt.AlignLeft)
self.btnConfirm = QPushButton('确定')
self.btnConfirm.setFixedSize(80, 30)
self.btnConfirm.clicked.connect(self.over)
self.vltMain.addWidget(self.btnConfirm, 0, Qt.AlignRight)
self.setLayout(self.vltMain)
self.setFixedSize(380, 200)
self.setStyleSheet("background-color:lightblue;")
self.setWindowTitle('游戏结束')
self.show()
def over(self):
if self.isNewRecord:
self.playerName = self.letName.text()
if self.playerName: # 姓名不为空
self.gameover.emit(self.playerName)
self.destroy()
else: # 姓名为空,提示用户输入
QMessageBox.information(self, '提示', '请输入姓名!')
else:
self.gameover.emit('')
self.destroy()
if __name__ == '__main__':
app = QApplication(sys.argv)
gop = GameOverPage(50, 45, False)
sys.exit(app.exec_())