大家好,欢迎来到IT知识分享网。
这一节,我们介绍如何使用 Pyqt5 实现猜数游戏界面。
游戏效果图:
一、使用 Qt Designer
首先,选择 Pycharm ->File->Settings-> Tools->External Tools,点击 + ,添加新项目。name 可以设为 ‘qt5’,Program 那项填写Qt designer 这个 exe 文件所在的位置。
这时候,Tools 菜单栏就会出现 External Tools 工具栏,点击这一项,就可以启动 Qt designer。
二、Pyuic
同样,选择 Pycharm ->File->Settings-> Tools->External Tools,点击 + ,添加新项目。name 可以设为Pyuic, Program 那项填写你的python.exe文件所在的地址。
Arguments 那项填写-m PyQt5.uic.pyuic sample.ui -o sample.py。其中sample.ui为你需要转换的ui文件,sample.py为转化得到的py文件名。
Working directory 填写 sample.ui在磁盘中的地址,我选择的位置是D:\QQPCMgr\Desktop\Pyui,这同时也是转化后的sample.py文件保存的地址。
转换得到的 py 文件可以直接继承使用。
三、制作 ui 文件
我们打开 Designer,选择相应控件,将其拖到合适的位置,保存即可 ui 文件。
这里,我选择垂直布局,从上到下分别为 QLineEdit、QLabel、QLabel、QPushButton、QPushButton、QPushButton。其中,标签名默认为空字符串,三个按钮的文字分别为:确认、退出游戏、重新开始。
这样,我们就完成猜数游戏的界面制作了,接下来将控件与功能对应起来即可。
通过 Pyuic 转化得到的 py 文件代码如下:
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(504, 551) self.layoutWidget = QtWidgets.QWidget(Form) self.layoutWidget.setGeometry(QtCore.QRect(170, 200, 137, 151)) self.layoutWidget.setObjectName("layoutWidget") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget) self.lineEdit.setObjectName("lineEdit") self.verticalLayout.addWidget(self.lineEdit) self.label = QtWidgets.QLabel(self.layoutWidget) self.label.setText("") self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.label_2 = QtWidgets.QLabel(self.layoutWidget) self.label_2.setText("") self.label_2.setObjectName("label_2") self.verticalLayout.addWidget(self.label_2) self.pushButton = QtWidgets.QPushButton(self.layoutWidget) self.pushButton.setObjectName("pushButton") self.verticalLayout.addWidget(self.pushButton) self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget) self.pushButton_2.setObjectName("pushButton_2") self.verticalLayout.addWidget(self.pushButton_2) self.verticalLayout_2.addLayout(self.verticalLayout) self.pushButton_3 = QtWidgets.QPushButton(self.layoutWidget) self.pushButton_3.setObjectName("pushButton_3") self.verticalLayout_2.addWidget(self.pushButton_3) self.label_3 = QtWidgets.QLabel(Form) self.label_3.setGeometry(QtCore.QRect(170, 60, 161, 16)) self.label_3.setObjectName("label_3") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.pushButton.setText(_translate("Form", "确认")) self.pushButton_2.setText(_translate("Form", "退出游戏")) self.pushButton_3.setText(_translate("Form", "重新开始")) self.label_3.setText(_translate("Form", "微信公众号:Python高效编程"))然后,我们让主程序继承这个基类,即可得到游戏界面。
四、实现猜数游戏
代码结构如下:
1. 初始化
第一行的列表推导式,用于生成随机数的右界,并赋值给类变量 random_choice。
前两行代码用于继承父类的 __init__ 参数,并执行 self.setupUi() 函数。其次,初始化实例变量。接着调用 self.random_num(),为以上的实例变量赋值。最后,调用 self.initUi() 函数来初始化界面。初始化的界面,会提示猜数范围。
# Python高效编程 # 生成随机数的右界 random_choice = [i * 100 for i in range(1, 20)] def __init__(self, parent=None): # 继承主窗口类 super(MyMainWindow, self).__init__(parent) self.setupUi(self) # 随机数的右界 self.guess_range = None # 生成的随机数 self.guess_num = None # 提示范围的左界 self.left = None # 提示范围的右界 self.right = None # 产生随机数 self.random_num() # 初始化功能 self.initUi()
2. 生成随机数
init_range() 函数为提示范围的左右界赋值, _random_range() 函数随机产生随机数的右界,而 random_num() 用来产生最终的随机数以及提示范围。
def init_range(self): # 为提示范围的左右界赋值 self.left = 1 self.right = self.guess_range @property def _random_range(self): # 随机产生随机数的右界 return random.choice(self.random_choice) def random_num(self): self.guess_range = self._random_range # 产生随机数 self.guess_num = random.randint(1, self.guess_range) self.init_range()
3. 初始化界面
self.label.setText() 显示标签的文本内容,标签一初始显示提示范围。self.pushButton.clicked.connect() 是说,当你摁下按钮一,会运行 self.guess() 函数。同理,按钮二、按钮三分别对应退出和重置功能。
def initUi(self): # 提示数值范围 self.label.setText('数值的范围是:{}-{}'.format(self.left, self.right)) # 按下按钮一,运行 self.guess() 函数 self.pushButton.clicked.connect(self.guess) # 按下按钮二,运行 quit() 函数 self.pushButton_2.clicked.connect(qApp.quit) # 按下按钮三,运行 self.reset() 函数 self.pushButton_3.clicked.connect(self.reset)
4. 主程序
text 用来接收 lineEdit 中的文本内容,允许浮点型的字符串。其他类型字符串会提示错误,标签一提示输入不合法,标签二提示随机数的范围,并清空 lineEdit 的文本框,将 text 赋值为空字符串。
如果字符串不为空,继续执行接下来的程序。首先,将得到的浮点数进行向下取整操作(math.floor)。比较用户输入的数值与待猜数,如果待猜数大于用户输入的数值,说明用户猜小了。此时,如果用户输入数值大于提示范围的左界,就更新提示范围的左界为用户输入的数值。此时标签一显示提示范围,标签二显示“猜小了”。如果待猜数小于用户输入的数值,说明用户猜大了,执行相反的操作。如果待猜数与用户输入的数值相同,那么说明用户猜中了数字。QMessageBox.question() 函数用来显示对话框,QMessageBox.Yes 参数是 Yes 键,并提示用户猜中的数值。
def guess(self): # text 接受文本框中的文本 text = self.lineEdit.text() # 异常处理 # 可处理数值型字符串,其他输入提示错误 try: text = float(text) except: self.label.setText(' 输入不合法') self.label_2.setText('数值的范围:{}-{}'.format(self.left, self.right)) self.lineEdit.clear() text = '' # 文本不为空继续执行文件 if text: num = math.floor(text) if self.guess_num == num: QMessageBox.question(self, '胜利', '恭喜你猜中了:{}'.format(self.guess_num), QMessageBox.Yes) self.reset() elif self.guess_num > num: if num > self.left: self.left = num self.label.setText('数值的范围:{}-{}'.format(self.left, self.right)) self.label_2.setText(' 猜小了') elif self.guess_num < num: if num < self.right: self.right = num self.label.setText('数值的范围:{}-{}'.format(self.left, self.right)) self.label_2.setText(' 猜大了') self.lineEdit.clear()5. 重置游戏
reset() 函数,用来重置游戏。首先将实例变量设为 None,并执行 self.random_num(),产生随机数,并更新提示范围的左右界。接着清空标签一和标签二的文本内容。最后,初始化界面,并显示待猜数范围。
def reset(self): # 重置游戏 self.guess_range = None self.guess_num = None self.left = None self.right = None self.random_num() self.label.setText('') self.label_2.setText('') self.initUi()
6. 设置快捷键
Qt.Key_Return 代表 Enter 键,按下 Enter 键就相当于按下按钮一,即确认键。Qt.Key_Escape 相当于 Esc 键,按下该键,就会退出游戏。Qt.Key_R 相当于 Ctrl + R 键,用来重置游戏。
def keyPressEvent(self, e): # 设置快捷键 if e.key() == Qt.Key_Return: self.guess() elif e.key() == Qt.Key_Escape: qApp.quit() elif e.key() == Qt.Key_R: self.reset()
以上便是本节的全部内容,主要介绍了如何使用 Pyqt5 实现猜数游戏界面。
关注微信公众号:安徽思恒信息科技有限公司,了解更多技术内容……
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/51920.html