python3.6结合PYQT5学习笔记3--一个简单的猜数字游戏

涉及的主要知识点:

  1. 按钮小提示
  2. QLineEdit小部件使用
  3. QMessageBox的使用
  4. 关闭窗口事件触发

第一部分

代码举例:

#!/usr/bin/python3

#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(300, 300, 300, 220)
        self.setWindowTitle('weilai--猜数字')
        self.setWindowIcon(QIcon('xdbcb8.ico'))

        self.bt1 = QPushButton('我猜', self)
        self.bt1.setGeometry(115, 150, 70 ,30)
        self.bt1.setToolTip('<b>点击这里猜数字</b>')
        self.bt1.clicked.connect(self.showMessage)  

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

        self.show()    

     def showMessage(self):

        guessnumber = int(self.text.text())
        print(self.num)    
    
        if guessnumber > self.num:
            QMessageBox.about(self, '看结果','猜大了!')
            self.text.setFocus()        
        elif guessnumber < self.num:
            QMessageBox.about(self, '看结果','猜小了!')
            self.text.setFocus()       
        else:
            QMessageBox.about(self, '看结果','答对了!进入下一轮!')
            self.num = randint(1,100)
            self.text.clear()
            self.text.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

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

 def __init__(self):

        super().__init__()

        self.initUI()

        self.num = randint(1,100)

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

self.bt1.setToolTip('<b>点击这里猜数字</b>')

要创建一个工具提示,我们调用setTooltip()方法。 我们可以使用富文本格式。鼠标停留在按钮上就会出现,如下图:
在这里插入图片描述

self.bt1.clicked.connect(self.showMessage)

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

self.text = QLineEdit('在这里输入数字', self)

self.text.selectAll()

self.text.setFocus()

self.text.setGeometry(80, 50, 150 ,30)

这里建立一个QLineEdit对象,用于让玩家输入数字。“在这里输入数字”是当窗口出现时出现的默认字符;selectAll()方法则是可以理解为将“在这里输入数字”进行全选,方便输入数字,否则你还得手动全选删除默认字符,如下图:
在这里插入图片描述
setFocus()就是让焦点置于文本栏中,方便用户输入,不然还得手动在文本栏中单击一下,很是麻烦。没有焦点的效果如下:
在这里插入图片描述
setGeometry()就是设置小部件的摆放坐标以及大小。

def showMessage(self):

        guessnumber = int(self.text.text())

            if guessnumber > self.num:

            QMessageBox.about(self, '看结果','猜大了!')

            self.text.setFocus()

        elif guessnumber < self.num:

            QMessageBox.about(self, '看结果','猜小了!')

            self.text.setFocus()

        else:

            QMessageBox.about(self, '看结果','答对了!进入下一轮!')

            self.num = randint(1,100)

            self.text.clear()

            self.text.setFocus()

这里就是对猜测的数字和系统随机生成的数字就行判断了。因为QLineEdit输入的内容是str类型的,所有我们要进行类型转换。
QMessageBox.about就是弹出一个对话框,告诉你结果是什么样的。如下图:
在这里插入图片描述
事实上QMessageBox除了有about外,还有我们程序中用到的QMessageBox.question
在这里插入图片描述
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按钮,我们接受导致关闭窗口小部件并终止应用程序的事件。 否则我们忽略关闭事件。

第二部分

我们尝试结合eric6和Qt设计师来操作一下:
我选中按钮,在右边的属性栏修改ToolTip,如下图:
在这里插入图片描述
完成后,我们编译一下,然后按下F2执行,看看运行的效果,如下图:
在这里插入图片描述
然后我们增加一个Line Edit部件,并双击写下默认显示的文字,如下图:
在这里插入图片描述
在这里插入图片描述
然后我们来自定义一下单击按钮后会产生的响应。在我们创建的UI上单击右键,选择生成对话框代码,如下图:
在这里插入图片描述
在这里插入图片描述
完成这个后,其实质就是实现了程序具体的功能和界面相分离了。后期程序在修改界面,只要功能不变,都没有什么大的影响。注意我们选择QpushButton中的clicked信号。
双击打开我们自动生成的action.py文件,我们可以看到这个文件导入了我们的UI(Ui_Ui_guess_number.py),并继承了其中的Ui_MainWindow类,如下图:
在这里插入图片描述
此时我们在自动生成"def on_pushButton_clicked(self):"函数中增加我们自定义的按钮响应函数,完成我们的小游戏。

def on_pushButton_clicked(self):

        """

        Slot documentation goes here.

        """

        # TODO: not implemented yet

        guessnumber = int(self.lineEdit.text())

        print(self.num)

        if guessnumber > self.num:

            QMessageBox.about(self, '看结果','猜大了!')

            self.lineEdit.setFocus()

        elif guessnumber < self.num:

            QMessageBox.about(self, '看结果','猜小了!')

            self.lineEdit.setFocus()

        else:

            QMessageBox.about(self, '看结果','答对了!进入下一轮!')

            self.num = randint(1,100)

            self.lineEdit.clear()

            self.lineEdit.setFocus()

当然要想顺利执行,还需要增加导入的模块,最终action.py的代码如下:

from PyQt5.QtCore import pyqtSlot

from PyQt5.QtWidgets import *

from Ui_Ui_guess_number import Ui_MainWindow

from random import randint

import sys


class Action(QMainWindow, Ui_MainWindow):

    """
    Class documentation goes here.

    """
    def __init__(self, parent=None):

        """
        Constructor

        @param parent reference to the parent widget

        @type QWidget

        """

        super(Action, self).__init__(parent)

        self.setupUi(self)

        self.num = randint(1,100)

        self.show()

    def closeEvent(self, event):

        reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()
      

    @pyqtSlot()

    def on_pushButton_clicked(self):

        """
        Slot documentation goes here.
        """
        # TODO: not implemented yet

        guessnumber = int(self.lineEdit.text())

        print(self.num)

        if guessnumber > self.num:

            QMessageBox.about(self, '看结果','猜大了!')

            self.lineEdit.setFocus()

        elif guessnumber < self.num:

            QMessageBox.about(self, '看结果','猜小了!')

            self.lineEdit.setFocus()

        else:

            QMessageBox.about(self, '看结果','答对了!进入下一轮!')

            self.num = randint(1,100)

            self.lineEdit.clear()

            self.lineEdit.setFocus()

if __name__ == "__main__":

    app = QApplication(sys.argv)

    action = Action()

    sys.exit(app.exec_())

————————————————————————————————————————————————————————
参考链接:https://zhuanlan.zhihu.com/p/28287825

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值