#动态显示时间 主线程完成任务,容易阻塞,为了提高程序运行效率,使用多线程,QTimer QThread,多任务可以用QThread ,如果完成周期性的任务可以用QTimer
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class ScrollBarDemo(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(300,300,300,200)
self.initUI()
def initUI(self):
self.setWindowTitle('动态显示当前时间')
self.label = QLabel('显示当前时间')
self.btnStart = QPushButton('start')
self.btnEnd = QPushButton('end')
layout = QGridLayout(self)
self.timer = QTimer()
self.timer.timeout.connect(self.showTime)
layout.addWidget(self.label,0,0,1,2)
layout.addWidget(self.btnStart,1,0)
layout.addWidget(self.btnEnd,1,1)
self.btnStart.clicked.connect(self.startTimer)
self.btnEnd.clicked.connect(self.endTimer)
def showTime(self):
time = QDateTime.currentDateTime()
timeDisplay = time.toString('yyyy-MM-dd hh:mm:ss dddd')
self.label.setText(timeDisplay)
def startTimer(self):
self.timer.start(1000)
self.btnStart.setEnabled(False)
self.btnEnd.setEnabled(True)
def endTimer(self):
self.timer.stop()
self.btnStart.setEnabled(True)
self.btnEnd.setEnabled(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ScrollBarDemo()
main.show()
sys.exit(app.exec_())
#让程序定时关闭
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
if __name__ == '__main__':
app = QApplication(sys.argv)
label = QLabel('5s以后自动关闭')
label.setWindowFlags(Qt.SplashScreen | Qt.FramelessWindowHint) #单纯显示label,SplashScreen是启动画面,FramelessWindowHint是无框架的
label.show()
QTimer.singleShot(5000,app.quit)#single shot 单发枪,单次发射
sys.exit(app.exec_())
#使用线程类编写计数器QThread,这里用到自定义信号
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
sec = 0
#定义一个工作线程(类似控件,只不过没有实体),里面定义信号,之前信号都是由有形的控件单击 双击等发出,现在信号是由时间触发,信号载体是一个线程类继承类(MyThread)
#当然这个虚拟的载体(MyThread)要在主程序(窗口进程Counter)中实例化,就像self.label button 等一样,然后绑定信号到主窗口类中的方法,
# 这些自定义信号当然是虚拟载体MyThread自己的属性
class MyThread(QThread):
running = pyqtSignal() #创建一个信号 遵循是什么->怎么办->为什么?的学习方法
stoped = pyqtSignal()
def run(self): #这个信号载体MyThread不是有形的,没法单击或者双击触发,可以用时间来触发,当时间到了某个值
while 1:
self.sleep(1)
if sec ==5:
self.stoped.emit() #emit(发射) 信号触发
break
else:self.running.emit()
class Counter(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('使用线程类QThread编写定时器')
self.resize(300,120)
layout = QVBoxLayout(self)
self.lcdnumber = QLCDNumber() #实例化一个QLCDNumber控件,就像LED灯一样
self.btn = QPushButton('start')
layout.addWidget(self.lcdnumber)
layout.addWidget(self.btn)
self.btn.clicked.connect(self.start)
self.thread1 = MyThread()
self.thread1.running.connect(self.run)
self.thread1.stoped.connect(self.stop)
def run(self):
global sec
sec+=1
self.lcdnumber.display(str(sec)) #lcd灯有一个display控件,可以动态设置显示的内容
def stop(self):
QMessageBox.information(self,'info','计时器停止',QMessageBox.Ok)
def start(self):
self.thread1.start()#开启线程,使得自定义信号持续监听
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Counter()
main.show()
sys.exit(app.exec_())