#动态显示时间 主线程完成任务,容易阻塞,为了提高程序运行效率,使用多线程,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_())
posted on 2020-09-02 18:23  94小渣渣  阅读(237)  评论(0编辑  收藏  举报