用pyqt制作秒表程序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

用PyQt5编写一个秒表程序


一、思路

用到QLCDNumber模块来显示时间,每隔一定时间更改QLCDNumber的数据
效果就这样啦
在这里插入图片描述

二、步骤

1.引入需要用到的库和模块

代码如下:

from PyQt5.QtGui import QCursor
from PyQt5.Qt import QLCDNumber,QPushButton,QTextEdit,Qt,QTimer
import sys
from PyQt5.QtWidgets import QWidget,QApplication,QStyleFactory

2.写出函数的整体

创建一个Timer类
代码如下:

class Timer(QWidget):
    def __init__(self):
        super(Timer, self).__init__()
              
if __name__ == '__main__':
    app=QApplication(sys.argv)
    main = Timer()
    main.show()
    sys.exit(app.exec())


3.创建控件并设置控件(代码都写在__init__()函数中)

  		self.setWindowTitle('秒表')#设置窗口的标题
        self.resize(420,480)#设置窗口的大小
        self.setWindowFlags(Qt.FramelessWindowHint)#窗口无边框化


1.控件包括按钮 textEdit LCD(控件比较少就直接码字 不弄QT Desiger)

        self.startButton=QPushButton(self)
        self.startButton.setText('开始')
        self.stopButton=QPushButton(self)
        self.stopButton.setText('停止')
        self.resetButton=QPushButton(self)
        self.resetButton.setText('复位')
        self.exitButton = QPushButton(self)
        self.exitButton.setText('退出')
        self.textEdit=QTextEdit(self)#这个控件用来显示计次




2.设置他们的空间位置
 
        self.textEdit.setGeometry(40,200,300,200)
        self.startButton.setGeometry(50,20,80,30)
        self.stopButton.setGeometry(150,20,80,30)
        self.resetButton.setGeometry(250,20,80,30)
        self.exitButton.setGeometry(260, 420, 80, 30)
        



3.对每个按钮与槽函数进行绑定
  		self.startButton.clicked.connect(self.start)
        self.stopButton.clicked.connect(self.stop)
        self.resetButton.clicked.connect(self.reset)
        self.exitButton.clicked.connect(self.exit)
        



4.对按钮进行小小的设置 比如: 鼠标移到按钮上鼠标的箭头变成手形
本来想放个图片看看 算了截屏截不到鼠标箭头

		self.startButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.stopButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.resetButton.setCursor(QCursor(Qt.PointingHandCursor))


5.添加lcd控件(关于lcd样式的设置可以找相关的资料)
    	self.lcd = QLCDNumber(self)
        self.lcd.setDigitCount(10)# 设置可显示数字个数
        self.lcd.setMode(QLCDNumber.Dec)#设置数字显示模式
        self.lcd.setSegmentStyle(QLCDNumber.Flat)#设置外观和样式




6.弄个QTimer()计时器 同样需要创建,设置,绑定槽函数
 	 	self.timer = QTimer()
        self.timer.setInterval(10)#设置计时器的间隔,单位是毫秒
        self.timer.timeout.connect(self.onTimerOut)

timer对象的timeout信号绑定了onTimeOut槽函数 而上面setInterval(10)设置了时间间隔
意味着每10毫秒 就会触发onTimerOut()函数
在onTimerOut()函数中 可以设置lcd控件的数据 从而实现秒表的功能
接着往下看




7.给四个按钮和QTimer编写槽函数(在class类中)

怎么在lcd显示时间:我们给秒表设置了三个单位 即:分钟(min),秒(sec),毫秒 (secondSec) (英语渣渣, 就这样吧) 然后在__init__()函数中定义变量
      	self.min=0
        self.sec=0
        self.secondSec=0

lcd对象中有个display()函数可以在lcd中显示数据(这行代码还是放在__init__()函数中)(下面这行代码设置lcd的初始时间)
self.linetext变量是秒表的数据

	 self.linetext=str(self.min)+':'+str(self.sec)+':'+str(self.secondSec)
 	 self.lcd.display(self.linetext)

效果如下:
在这里插入图片描述
emmm 发现有点看的不太顺眼 好像应该是00:00:00 这样来着
我想了半天不知道怎么搞,弄了个最笨的方法:在每个单位前多加个零(大佬们有没有什么办法) 如下

	self.lcd.display(str(0)+str(self.min)+':'+str(0)+str(self.sec)+':'+str(0)+		str(self.secondSec))

就变成这个样子了
在这里插入图片描述


初始化的时间弄好了 接下来就要让他动起来 在前面已经定义了QTimer计时器,也绑定了槽函数 QTimer计时器每隔10毫秒就会触发槽函数 接下来写槽函数onTimeOut()(写了class类中)
    def onTimerOut(self):
        self.secondSec+=1
        if self.secondSec!=100:
            if self.secondSec<10 and self.sec<10 :
                self.linetext=str(0) + str(self.min) + ':' + str(0) + str(self.sec) + ':' + str(0) + str(self.secondSec)
                self.lcd.display(self.linetext)
            elif self.secondSec>=10 and self.sec<10 :
                self.linetext=str(0) + str(self.min) + ':' +str(0) + str(self.sec) + ':' + str(self.secondSec)
                self.lcd.display(self.linetext)
            elif self.secondSec <10 and self.sec >=10:
                self.linetext=str(0) + str(self.min) + ':'+str(self.sec) + ':' + str(0)+str(self.secondSec)
                self.lcd.display(self.linetext)
            elif self.secondSec >= 10 and self.sec >=10:
                self.linetext=str(0) + str(self.min) + ':' +str(self.sec) + ':' + str(self.secondSec)
                self.lcd.display(self.linetext)

        if self.secondSec==100:
            self.secondSec=0
            self.sec+=1

        if self.sec==60:
            self.sec=0
            self.min+=1

来说说上面代码
每个10毫秒触发一个槽函数 所以每个10秒 secondSec变量就会+1
当secondSec=100的时候就是时间过了一秒 这时候sec就会+1 同理
sec=60的时候 时间过了一分钟 min就会+1
每次调用槽函数后 再获取秒表的数据 调用display()函数显示在lcd上

 	 self.linetext=str(0) + str(self.min) + ':' + str(0) + str(self.sec) + ':' + str(0) + str(self.secondSec)
     self.lcd.display(self.linetext)

为啥有这么多if语句:其实就是为了让数据能够显示成00:00:00这样的格式
比如说 00:3:5 显示成00:03:05



怎么实现计次:当我们点击开始按钮,执行start()函数,秒表开始运行,"开始"按钮就会变成"计次"按钮

当我们点击"计次"按钮的时候,就可以获取当前秒表的数据self.linetext 并追加到textEdit控件中 同时 我也在__init__()中定义了count变量用来记录计次的次数,
startButton
jicibutton


    def start(self):
        self.timer.start()#点击开始按钮,计时器开始运行
        if self.startButton.text()=='计次':#判断当前的按钮
            self.textEdit.append('计次'+str(self.count)+'      '+self.linetext)
            self.count+=1
        self.startButton.setText('计次')#


点击停止按钮,秒表暂停 同时‘“开始”按钮变成“继续”按钮

在这里插入图片描述
点击继续按钮 又会继续执行start()函数

    def stop(self):
        self.timer.stop()
        self.startButton.setText('继续')


点击复位按钮:执行renew()函数 数据清零,count设置成1,同时startButton按钮设置成开始
    def reset(self):
        self.timer.stop()#秒表暂停
        self.sec=0#数据回0
        self.min=0
        #lcd上的数据清零
        self.lcd.display(str(0)+str(0)+':'+str(0)+str(0)+':'+str(0)+str(0))
        self.startButton.setText('开始')
        self.textEdit.clear()#清空textEidt控件显示的数据
        self.count=1


最后就是退出按钮的槽函数

    def exit(self):
        sys.exit(app.exec())

4.设置一丢丢风格(写在main函数里)

比如所窗口界面样式(部分):

app.setStyle(QStyleFactory.create("Fusion"))

在这里插入图片描述

app.setStyle(QStyleFactory.create("Window"))

在这里插入图片描述


再来设置一下按钮的风格(用到了QSS 可以去查阅相关资料 这边简单一些)(还是写在main函数中):

    qssStyle = '''
                QPushButton{
                    background-color: rgb(44, 137, 255);     
                    }
       '''

    main.setStyleSheet(qssStyle)


三、附上完整代码

from PyQt5.QtGui import QCursor
from PyQt5.Qt import QLCDNumber,QPushButton,QTextEdit,Qt,QTimer
import sys
from PyQt5.QtWidgets import QWidget,QApplication,QStyleFactory

class Timer(QWidget):
    def __init__(self):
        super(Timer, self).__init__()
        self.setWindowTitle('秒表')
        self.resize(420,480)
        self.setWindowFlags(Qt.FramelessWindowHint)
        #窗口无边框化
        self.lcd = QLCDNumber(self)
        self.lcd.setDigitCount(10)
        self.lcd.setMode(QLCDNumber.Dec)
        self.lcd.setSegmentStyle(QLCDNumber.Flat)
        self.min=0
        self.sec=0
        self.secondSec=0
        
        self.linetext=str(0)+str(self.min)+':'+str(0)+str(self.sec)+':'+str(0)+str(self.secondSec)
        self.lcd.display(self.linetext)#在lcd上显示当前时间
        self.lcd.setGeometry(40,70,300,100)


        self.startButton=QPushButton(self)
        self.startButton.setText('开始')
        self.stopButton=QPushButton(self)
        self.stopButton.setText('停止')
        self.resetButton=QPushButton(self)
        self.resetButton.setText('复位')
        self.exitButton = QPushButton(self)
        self.exitButton.setText('退出')


        self.startButton.setCursor(QCursor(Qt.PointingHandCursor))#鼠标一上去按钮变手性
        self.stopButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.resetButton.setCursor(QCursor(Qt.PointingHandCursor))

        self.textEdit=QTextEdit(self)
        self.textEdit.setGeometry(40,200,300,200)

        self.startButton.setGeometry(50,20,80,30)
        self.stopButton.setGeometry(150,20,80,30)
        self.resetButton.setGeometry(250,20,80,30)
        self.exitButton.setGeometry(260, 420, 80, 30)

        self.timer = QTimer()
        self.timer.setInterval(10)

        self.timer.timeout.connect(self.onTimerOut)

        self.startButton.clicked.connect(self.start)
        self.stopButton.clicked.connect(self.stop)
        self.resetButton.clicked.connect(self.reset)
        self.exitButton.clicked.connect(self.exit)

        self.count=1


    def onTimerOut(self):
        self.secondSec+=1
        if self.secondSec!=100:
            if self.secondSec<10 and self.sec<10 :
                self.linetext=str(0) + str(self.min) + ':' + str(0) + str(self.sec) + ':' + str(0) + str(self.secondSec)
                self.lcd.display(self.linetext)
            elif self.secondSec>=10 and self.sec<10 :
                self.linetext=str(0) + str(self.min) + ':' +str(0) + str(self.sec) + ':' + str(self.secondSec)
                self.lcd.display(self.linetext)
            elif self.secondSec <10 and self.sec >=10:
                self.linetext=str(0) + str(self.min) + ':'+str(self.sec) + ':' + str(0)+str(self.secondSec)
                self.lcd.display(self.linetext)
            elif self.secondSec >= 10 and self.sec >=10:
                self.linetext=str(0) + str(self.min) + ':' +str(self.sec) + ':' + str(self.secondSec)
                self.lcd.display(self.linetext)

        if self.secondSec==100:
            self.secondSec=0
            self.sec+=1

        if self.sec==60:
            self.sec=0
            self.min+=1

    def start(self):
        self.timer.start()
        if self.startButton.text()=='计次':
            self.textEdit.append('计次'+str(self.count)+'      '+self.linetext)
            self.count+=1
        self.startButton.setText('计次')


    def stop(self):
        self.timer.stop()
        self.startButton.setText('继续')

    def reset(self):
        self.timer.stop()
        self.sec=0
        self.min=0
        self.lcd.display(str(0)+str(0)+':'+str(0)+str(0)+':'+str(0)+str(0))
        self.startButton.setText('开始')
        self.textEdit.clear()
        self.count=1

    def exit(self):
        sys.exit(app.exec())


if __name__ == '__main__':
    app=QApplication(sys.argv)
    app.setStyle(QStyleFactory.create("Fusion"))#设置窗口界面
    main = Timer()
    qssStyle = '''
                QPushButton{
                    background-color: rgb(44, 137, 255);     
                    }
       '''

    main.setStyleSheet(qssStyle)
    main.show()
    sys.exit(app.exec())


完结。。感觉写的挺乱 第一次这么写 有错误的地方还请大佬改正 哪里不能理解的也可留言啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值