专栏首页Python高效编程使用 Pyqt5 制作猜数游戏 GUI

使用 Pyqt5 制作猜数游戏 GUI

这一节,我们介绍如何使用 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 实现猜数游戏界面。如果需要获取源代码,请关注微信公众号:Python高效编程,在微信后台回复猜数即可。

本文分享自微信公众号 - Python高效编程(gh_53af3cd256b6)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PyQt5 从零开始制作 PDF 阅读器(二)

    上一篇文章中,我们实现了 PDF 阅读器的初始界面。这一次,新增了阅读功能,可以实现基本的翻页以及缩放等操作。不过,暂时只可以同时阅读一本书。(文末小程序留言)

    用户2870857
  • 超级简单的虚拟机(Python 实现)

    我们这次实现的简单虚拟机,和计算机的 cpu 有点类似。无非就是取指令,执行指令之类的操作。

    用户2870857
  • PyQt5 从零开始制作 PDF 阅读器(一)

    此前,我已经写了三篇关于 Ui 界面的文章,分别是:猜数游戏、计时器程序和天气查询软件。这次,我们使用 Python 实现 PDF 阅读器。

    用户2870857
  • python练习题-day27

    1、写一个类,用来将浮点型值转换成金额。在本练习里,我们使用美国货币,但读者也可以自选任意货币。

    郭耀华
  • python类(class)

    类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例,把所有相似的功能都封装到一个类里,最理...

    用户2398817
  • day 16 初试面试对象

                 面向对象:  大象,进冰箱 ,  此时主语是大象,我操纵的是大象,此时的大象就是对象

    用户2398817
  • Selenium&PhantomJS实战二:爬取漫画

    一般来说在线看漫画的网站都会使用JavaScript来返回页面,打开百度搜索在线漫画,如下图:

    用户2398817
  • bs4爬虫实战三:获取电影信息并存入mysql数据库

    这次爬虫的目标网站是:http://dianying.2345.com,爬虫的搜索目标仅限于今年的电影,在网站打开搜索,在年代中选择2018

    用户2398817
  • tornado学习笔记

    tornado是默认自动开启转义的,大家可以根据需求来选是否转义,但是要知道转义的本意是来防止浏览器意外执行恶意代码的,所以去掉转义的时候需要谨慎选择

    用户2398817
  • python3 - 文本读音器

    本篇分享的是使用python3制作一个文本读音器,简单点就是把指定的文本文字转语音说出来;做这么个小工具主要是为了方便自己在平时看一些文章眼累的时候,可通过语音...

    用户2398817

扫码关注云+社区

领取腾讯云代金券