提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
用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变量用来记录计次的次数,
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())
完结。。感觉写的挺乱 第一次这么写 有错误的地方还请大佬改正 哪里不能理解的也可留言啦