环境抉择
Qt Designer,一个成熟的C++图形用户界面程序开发框架。在Python时代,PyQt5成功整合了Qt Designer与PyCharm两大工作环境,为使用Python语言构建图形化程序提供了基础
本次功能实现
GDEYE-001 游戏欢迎界面
- 用例描述:游戏欢迎界面
- 前置条件:打开游戏程序
- 后置条件:游戏正式开始
- 参与者:游戏玩家
- 数据:信号函数
- 输出数据:无
- 事件流:
欢迎界面→点击“开始游戏”→进入游戏
使用PyQt5构建的简单开始界面。
代码如下:
#Index.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(400, 300)
MainWindow.setMaximumSize(QtCore.QSize(400, 300))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setObjectName("widget")
self.gridLayout = QtWidgets.QGridLayout(self.widget)
self.gridLayout.setObjectName("gridLayout")
self.label_2 = QtWidgets.QLabel(self.widget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
self.label_2.setSizePolicy(sizePolicy)
self.label_2.setMaximumSize(QtCore.QSize(100, 200))
font = QtGui.QFont()
font.setPointSize(19)
self.label_2.setFont(font)
self.label_2.setWordWrap(True)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 0, 2, 1, 1)
self.label = QtWidgets.QLabel(self.widget)
self.label.setMaximumSize(QtCore.QSize(400, 800))
self.label.setStyleSheet("image: url(:/goldeneye/timg.jpg);")
self.label.setText("")
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.pushButton = QtWidgets.QPushButton(self.widget)
self.pushButton.setMaximumSize(QtCore.QSize(150, 50))
self.pushButton.setObjectName("pushButton")
self.gridLayout.addWidget(self.pushButton, 1, 2, 1, 1)
self.horizontalLayout.addWidget(self.widget)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 400, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.pushButton.clicked.connect(MainWindow.close)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label_2.setText(_translate("MainWindow", "Design by Xu and Li"))
self.pushButton.setText(_translate("MainWindow", "开始游戏"))
GDEYE-007 总积分榜
- 用例描述:计算总积分榜
- 前置条件:一轮游戏结束
- 后置条件:展示总积分榜
- 参与者:游戏玩家
- 数据:无
- 输出数据:总积分榜
- 事件流:
一轮游戏结束→展示当前总积分榜
代码如下:
#game.py
def calculate(callist):
num = 0
for i in range(len(callist)):
num += callist[i].current
G = num/len(callist)*0.618
print("黄金点数值是:"+str(G))
num_group = []
for i in range(len(callist)):
num_group.append(abs(callist[i].current-G))
maxpos = num_group.index(max(num_group))
minpos = num_group.index(min(num_group))
callist[minpos].score += len(callist)
callist[maxpos].score -= 2
return callist
def show_current(currentlist):
print("当前积分榜如下:")
for i in range(len(currentlist)):
print(currentlist[i].name+":"+str(currentlist[i].score))
#main.py
def main():
current_list = infocheck.info()
game.welcome()
flag = 1
# while(flag):
# current_list = game.start_game(current_list)
# game.show_current(current_list)
# print("是否继续游戏?是请输入y,否请输入其他任意键:")
# save = input()
# if save != 'y':
# flag = 0
# return
GDEYE-008 游戏结束界面
- 用例描述:游戏结束
- 前置条件:所有游戏流程结束
- 后置条件:关闭程序
- 参与者:游戏玩家
- 数据:无
- 输出数据:无
- 事件流:
游戏结束→关闭程序
使用PyQt5构建的简单结束界面。
代码如下:
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.widget = QtWidgets.QWidget(Form)
self.widget.setGeometry(QtCore.QRect(100, 70, 202, 161))
self.widget.setObjectName("widget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.widget)
font = QtGui.QFont()
font.setPointSize(30)
self.label.setFont(font)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.pushButton = QtWidgets.QPushButton(self.widget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "游戏结束!"))
self.pushButton.setText(_translate("Form", "退出游戏"))
本次功能完善
GDEYE-002 用户信息确认
利用PyQt5设计了确认人数的对话框。
代码如下:
#Num.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(320, 120)
Form.setMaximumSize(QtCore.QSize(320, 120))
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.widget = QtWidgets.QWidget(Form)
self.widget.setObjectName("widget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.widget)
font = QtGui.QFont()
font.setPointSize(13)
self.label.setFont(font)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.spinBox = QtWidgets.QSpinBox(self.widget)
self.spinBox.setMaximumSize(QtCore.QSize(100, 50))
font = QtGui.QFont()
font.setPointSize(14)
self.spinBox.setFont(font)
self.spinBox.setObjectName("spinBox")
self.horizontalLayout.addWidget(self.spinBox)
self.pushButton = QtWidgets.QPushButton(self.widget)
self.pushButton.setMaximumSize(QtCore.QSize(100, 40))
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.horizontalLayout_2.addWidget(self.widget)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "请输入游戏人数"))
self.pushButton.setText(_translate("Form", "确认"))
多窗口流程化初步
本次黄金眼项目,大致有着欢迎界面→信息确认→游戏规则介绍→输入数字→公布排行榜这一流程。按照流程图形化的对话框也应当有相应的交互逻辑。
本次从欢迎界面到确认人数的交互逻辑实现代码如下:
#Index2Num.py
from Index import *
from Num import *
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
import sys
class ParentWindow(QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.main_ui = Ui_MainWindow()
self.main_ui.setupUi(self)
class ChildWindow(QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
self.child_ui = Ui_Form()
self.child_ui.setupUi(self)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = ParentWindow()
child = ChildWindow()
# 通过toolButton将两个窗体关联
btn = window.main_ui.pushButton
btn.clicked.connect(child.show)
# 显示
window.show()
sys.exit(app.exec_())
在按下欢迎界面的“开始游戏”按钮后,欢迎界面会消失,弹出确认人数界面,按照游戏流程继续进行下去。
阶段总结
由于这两周,两人还处于学习PyQt5的阶段,因而只在完整程序的框架下初步实行了图形化处理。接下来的两周,将对图形化程序进行信号与槽的整体布局,完成多窗口互动,在图形化界面状态下完整走完游戏流程。