欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

我与PyQt5有个约会系列教程(4):写一个猜数字小游戏

程序员文章站 2022-04-26 08:06:23
...

上节课,我们学习了按钮和可编辑文本框的实现。

为了巩固这两个控件知识,我们实践一下做一个小游戏。

先来看一下效果 :

我与PyQt5有个约会系列教程(4):写一个猜数字小游戏

本次课程涉及的知识点,主要是以下几点:

  • QLineEdit小部件使用
  • QMessageBox的使用
  • 关闭窗口事件触发

先上正餐源代码,欣赏一下:

# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QLineEdit
from PyQt5.QtGui import QIcon
from random import randint

class Example(QWidget):

    def __init__(self):

        super().__init__()
        self.initUI()
        self.num = randint(1,100)    

    def initUI(self):

        self.setGeometry(500, 300, 500, 220)
        self.setWindowTitle('我和PyQt5有个约会')
        self.setWindowIcon(QIcon('myico.ico'))

        self.guessQPushBtn = QPushButton('我猜', self)
        self.guessQPushBtn.setGeometry(115, 150, 70 ,30)
        self.guessQPushBtn.clicked.connect(self.showMessage)  

        self.numQLineEdit = QLineEdit('在这里输入数字', self)
        self.numQLineEdit.selectAll()
        self.numQLineEdit.setFocus()
        self.numQLineEdit.setGeometry(80, 50, 150 ,30)

        self.show()    
    
    def showMessage(self):
        if self.numQLineEdit.text().isdigit():
            guessnumber = int(self.numQLineEdit.text())
            print(self.num)    
        
            if guessnumber > self.num:
                QMessageBox.about(self, '看结果','猜大了!')
                self.numQLineEdit.setFocus()        
            elif guessnumber < self.num:
                QMessageBox.about(self, '看结果','猜小了!')
                self.numQLineEdit.setFocus()       
            else:
                QMessageBox.about(self, '看结果','答对了!进入下一轮!')
                self.num = randint(1,100)
                self.numQLineEdit.clear()
                self.numQLineEdit.setFocus()   
        else:
            QMessageBox.about(self, '提示','输入的不是数字!请重新输入......')
            self.numQLineEdit.setFocus()
             
        
    def closeEvent(self, event):

        reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()        
        else:
            event.ignore()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
    

和以往一样,我们还是根据代码来逐一讲解。

上面这个程序实现的主要功能是,系统随机产生一个1-100之间的整数,我们去猜,看看能否猜中这个数字。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QLineEdit
from PyQt5.QtGui import QIcon
from random import randint

本次程序中我们使用到的模块,较上次教程多了random模块。

def __init__(self):
    super().__init__()
    self.initUI()
    self.num = randint(1,100) 

类在进行初始化的时候,自动产生一个1-100的随机整数。

self.guessQPushBtn.clicked.connect(self.showMessage)

当按钮被单击时我们调用showMessage())方法去响应执行。

self.numQLineEdit = QLineEdit('在这里输入数字', self)
self.numQLineEdit.selectAll()
self.numQLineEdit.setFocus()
self.numQLineEdit.setGeometry(80, 50, 150 ,30)

这里建立一个QLineEdit对象,用于让玩家输入数字。“在这里输入数字”是当窗口出现时出现的默认字符;selectAll()方法则是可以理解为将“在这里输入数字”进行全选,方便输入数字,否则你还得手动全选删除默认字符,如下图:

我与PyQt5有个约会系列教程(4):写一个猜数字小游戏

setFocus()就是让焦点置于文本栏中,方便用户输入,不然还得手动在文本栏中单击一下,很是麻烦。没有焦点的效果如下:

我与PyQt5有个约会系列教程(4):写一个猜数字小游戏

def showMessage(self):
    if self.numQLineEdit.text().isdigit():
        guessnumber = int(self.numQLineEdit.text())
        print(self.num)    
        
        if guessnumber > self.num:
            QMessageBox.about(self, '看结果','猜大了!')
            self.numQLineEdit.setFocus()        
        elif guessnumber < self.num:
            QMessageBox.about(self, '看结果','猜小了!')
            self.numQLineEdit.setFocus()       
        else:
            QMessageBox.about(self, '看结果','答对了!进入下一轮!')
            self.num = randint(1,100)
            self.numQLineEdit.clear()
            self.numQLineEdit.setFocus()   
    else:
        QMessageBox.about(self, '提示','输入的不是数字!请重新输入......')
        self.numQLineEdit.setFocus()

这里就是对猜测的数字和系统随机生成的数字就行判断了。因为QLineEdit输入的内容是str类型的,所有我们要进行类型转换。

QMessageBox.about就是弹出一个对话框,告诉你结果是什么样的。如下图:

我与PyQt5有个约会系列教程(4):写一个猜数字小游戏

事实上QMessageBox除了有about外,还有我们程序中用到的QMessageBox.question :

我与PyQt5有个约会系列教程(4):写一个猜数字小游戏

还有其他的 : QMessageBox.critical, QMessageBox.warning, QMessageBox.information。

QMessageBox对话框包含类型只是图标不同其他无太大差别。

这里在说明一下,当我们回答正确的时候,调用clear()方法,将文本栏里面的内容清除,同时重新生成一个随机数,并将焦点置于文本栏中。

def closeEvent(self, event):

    reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
    if reply == QMessageBox.Yes:
        event.accept()        
    else:
        event.ignore()

如果关闭QWidget,则生成QCloseEvent。 要修改widget的行为,我们需要重新实现closeEvent()事件处理程序。

我们显示一个带有两个按钮的消息框:Yes和No。第一个字符串出现在标题栏上。 第二个字符串是对话框显示的消息文本。 第三个参数指定出现在对话框中的按钮的组合。 最后一个参数是默认按钮。 它是初始键盘焦点的按钮。 返回值存储在答复变量中。

这里我们根据返回值进行判断。 如果我们单击Yes按钮,我们接受导致关闭窗口小部件并终止应用程序的事件。 否则我们忽略关闭事件。

 

今天就到这里,待续......

相关标签: PyQt5

上一篇: 爬虫基础(1)

下一篇: python 爬虫1