python中的定时器、线程、信号与槽的讲解

(1)定时器的操作
定时器的作用: 定时 ,定时执行某项操作
定时器的使用:
(1)导入定时器模块
(2)设置定时器:创建定时器对象
(3)定时器绑定事件,这个事件就是根据定时器设定的时间来执行的,–定时器设置1s 当开启定时器时会1s执行一次这个事件(槽函数)
(4)开启定时器,从开启的那一刻定时器就开始工作
(5)关闭定时器,从关闭那一刻定时器就会停止工作
定时器操作的伪代码:

#coding=utf8
"""
动态显示时间
"""
import Qtimer

class ShowTimeDemo(QWidget):
    def __init__(self,parent=None):
	#这里省略其他控件定义代码......
	
        # 设置定时器
        self.timer = QTimer()
        # 定时器绑定的事件,一旦开启定时器(这里会设置定时器的时间),就会定时执行链接的槽函数(比如说定时从视频中取出图片,以及图片帧的入队列操作)
        self.timer.timeout.connect(self.showtime		
        # 按下按键就会开启定时器,定时器中设置了定时时间
        self.btn1.clicked.connect(self.start)
        self.btn2.clicked.connect(self.end)

        self.setLayout(layout)
    # 定时器绑定的事件(需要定时执行的)    
    def showtime(self):
        time = QDateTime.currentDateTime()
        timeDisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd")
        self.label.setText(timeDisplay)
    # 开启定时器的操作,定时的时间是1s执行一次
    def start(self):
        self.timer.start(1000)
        self.btn1.setEnabled(False)
        self.btn2.setEnabled(True)
        
     # 关闭定时器的操作
     def end(self):
        self.timer.stop()
        self.btn1.setEnabled(True)
        self.btn2.setEnabled(False)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = ShowTimeDemo()
    window.show()
    sys.exit(app.exec_())

可以总结如下:设置定时器,定时器绑定执行定时事件,开启定时器,关闭定时器
定时器一旦开启,定时器就开始工作(根据定时的时间来执行定时器绑定的事件)-----定时器完毕

(2)线程操作
线程: 程序(进程)执行中的一个功能部分,也可以是指一个操作过程----线程中的操作和定时器的操作不太一样,但是基本的操作都是:创建、开启、操作、关闭这四个步骤

线程操作: 更像是一个独立的功能代码
以下举个例子: pyqt5中的多线程更新UI数据。
两个线程:界面线程—>也就是主线程
后台线程—>处理数据的线程
伪代码如下:

#coding=utf8
from PyQt5.QtCore import QThread,pyqtSignal,QDateTime
from PyQt5.QtWidgets import QApplication,QDialog,QLineEdit
import time
import sys
"""
多线程更新UI数据
在这里做一个2线程更新UI数据
后台线程:得到并记录数据
主线程:窗口线程
在主线程中开启后台线程,并接收后台传输过来的数据(这里使用信号来输出数据,信号在下面会介绍)
"""
# 后台线程继承自线程类
class BackendThread(QThread):
    # 定义一个信号,用于将数据传输到界面(主线程)中
    updata_date = pyqtSignal(str)
    def run(self):
        while True:
            data = QDateTime.currentDateTime()
            currentTime = data.toString("yyyy-MM-dd hh:mm:ss")
            self.updata_date.emit(str(currentTime))
            # 设置频率,python中设置while()循环的频率---while循环中设置		                    
            time.sleep(1) 1s执行一次while循环
            time.sleep(1)

class ThreadUpdataUI(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.setWindowTitle("多线程更新UI数据")
        self.resize(400,400)
        self.input = QLineEdit(self)
        self.input.resize(200,200)

        self.initUI()
    def initUI(self):
    	# 创建线程类---继承了线程类所有的操作
        self.backend = BackendThread()
        """
        后台中的信号传输数据到主界面中的控件中,使用信号传输数据
        """
        self.backend.updata_date.connect(self.handleDisplay)

        # 开启后台线程
        self.backend.start()
    # 主界面中控件接收后台线程传输过来的数据
    def handleDisplay(self,data):
        self.input.setText(data)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = ThreadUpdataUI()
    window.show()
    app.exec_()
    

线程的作用是非常强大的,必要时使用多线程会提高代码的执行效率,避免了代码执行使的冲突
总结: 创建线程(并实例化)—(线程中需要执行哪些操作)----开启线程----不需要执行相关的操作就可以关闭线程【创建、开启、关闭】

(3)信号与槽的操作-----主要介绍信号的操作
信号: 信号是pyqt中的一种数据传输的机制,用来高效的传输数据的---->在数据交互中应用广泛

信号的创建就是为数据而生
创建----带数据,在任意位置创建,创建任意类型的信号(取决于你想传输的数据)
触发----带数据(自定义触发,常用其他控件的触发中触发)
绑定----带数据的(绑定槽函数—在主界面中控件接收信号发送过来的数据)

怎么设计:根据传输的数据是什么 类型的来决定
(1)创建什么样的信号
(2)触发信号发送对应的数据
(3)信号绑定槽函数–对应控件执行数据的更新操作

信号操作的伪代码:
信号的创建
信号的触发
信号绑定的槽函数(信号一旦被触发,就会自动执行信号绑定的槽函数)

操作代码:

class DateDialog(QWidget):
    # 信号的定义 信号的定义也是多种多样的,主要就是你想传输什么样的数据,在不同的窗口之间传输
    # Signal_parp = pyqtSignal(str)
    # 信号的定义
    Signal1 = pyqtSignal(str,int)
    def __init__(self,parent=None):
        super(DateDialog,self).__init__(parent)
        self.setWindowTitle("Signal")
        layout = QVBoxLayout(self)
        self.datetime = QDateTimeEdit(self)
        self.datetime.setCalendarPopup(True)
        self.datetime.setDateTime(QDateTime.currentDateTime())

        self.Label = QLineEdit()

        self.button = QPushButton("发送")
        layout.addWidget(self.datetime)
        layout.addWidget(self.button)
        layout.addWidget(self.Label)
        self.setLayout(layout)

        self.button.clicked.connect(self.onClickButton)
        # 信号绑定的槽函数--在信号触发的时候执行
        self.Signal1.connect(self.onSignal)
    # 信号的触发可以通过其他控件来触发----控件本身就有触发机制
    def onClickButton(self):
        data_str = self.datetime.dateTime().toString()
        print("触发了")
        print(data_str)
        # 信号的触发,在这里信号是通过按键来进行触发的
        self.Signal1.emit(data_str,12)
   # 信号绑定的槽函数  
   def onSignal(self,data_str,data_int):
        self.Label.setText(data_str + str(data_int))
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DateDialog()
    window.show()
    app.exec_()
                          

信号操作的总体思路:
(1)信号的创建–根据需要传输的数据类型来创建的
(2)信号的触发----在什么时候触发(触发的时候是需要传递数据的)
(3)信号所绑定的槽函数----在信号触发完毕之后执行的代码块
记住哦----用信号来传输数据是非常方便快捷的

                                           今日分享完毕----欢迎留言交流
发布了129 篇原创文章 · 获赞 43 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/nbxuwentao/article/details/103881084