当前位置:   article > 正文

PyQt学习(14):多线程(Qtimer和Qthread),网页交互(QWebEngineView,js与python的交互)_python qtimer在qthread中使用

python qtimer在qthread中使用

目录

1,QTimer

2,QThread

3,网页交互(QWebEngineView和QWebChannel)

3.1显示网页页面

3.2,JS与Pyqt交互(QwebEngineView 和QwebChannel)

3.2.1,PyQt调用js (runJavaSCript)

3.2.2 js调用python程序(QwebChannel)比较复杂。其实是实现了js与python程序调用

3.2.3 runjavaScript和 Qwebchannel传递信息的不同用处


 

多线程技术涉及三种方法,其中一个是使用计时器模块QTimer,一种是使用多线程模块QThread,还有一种是使用事件处理的功能

1,QTimer

如果在应用程序中周期性地进行某项操作,使用QTimer,Qtimer类提供了重复的和单次的定时器要是用定时器,需要先创建一个QTimer实例,将其timeout信号连接到相应的槽,并调用start()。然后,定时器以恒定的间隔发出timeout信号

Qtimer类中常用方法:

start(millseconds):启动或重新自动定时器,时间间隔为毫秒,如果定时已经运行,它将被停止并重新启动,如果sigleShot信号为真,定时器将被激活一次

stop()停止计时器

常用的信号:

signalShot:在给定的时间间隔调用一个槽函数时发射此信号

timeout:当定时器超时时发射此信号

注意:start()之后,每秒都会调用update()

  1. from PyQt5.QtWidgets import QGridLayout,QApplication,QWidget,QPushButton,QLabel
  2. import sys
  3. from PyQt5.QtCore import QTimer,QDateTime
  4. class TimerDemo(QWidget):
  5. def __init__(self):
  6. super(TimerDemo, self).__init__()
  7. self.initUI()
  8. def initUI(self):
  9. self.setWindowTitle('demo')
  10. self.setGeometry(300,300,300,200)
  11. layout=QGridLayout(self)
  12. #定义计时器,并连接槽函数
  13. self.timer=QTimer()
  14. self.timer.timeout.connect(self.show_time)
  15. self.label=QLabel()
  16. layout.addWidget(self.label,0,0,1,2)
  17. self.btn1=QPushButton('start',self)
  18. layout.addWidget(self.btn1,1,0)
  19. self.btn1.clicked.connect(self.start_program)
  20. self.btn2=QPushButton('end',self)
  21. layout.addWidget(self.btn2,1,1)
  22. self.btn2.clicked.connect(self.end_program)
  23. def show_time(self):
  24. date=QDateTime.currentDateTime()
  25. now=date.toString('yyyy-MM--dd hh:mm:ss')
  26. self.label.setText(now)
  27. def start_program(self):
  28. self.timer.start(1000)
  29. self.btn1.setEnabled(False)
  30. self.btn2.setEnabled(True)
  31. def end_program(self):
  32. self.timer.stop()
  33. self.btn2.setEnabled(False)
  34. self.btn1.setEnabled(True)
  35. if __name__=='__main__':
  36. app=QApplication(sys.argv)
  37. demo=TimerDemo()
  38. demo.show()
  39. sys.exit(app.exec_())
  1. from PyQt5.QtWidgets import QLabel,QApplication
  2. import sys
  3. from PyQt5.QtCore import QTimer,Qt
  4. if __name__ == '__main__':
  5. app=QApplication(sys.argv)
  6. label=QLabel('五秒退出')
  7. label.setWindowFlags(Qt.SplashScreen|Qt.FramelessWindowHint)
  8. label.show()
  9. #设置窗口无边框
  10. timer=QTimer()
  11. timer.singleShot(5000,app.quit)#*********
  12. sys.exit(app.exec_())

2,QThread

QThread是Qt线程类中最核心的底层类,由于PyQt的跨平台特性,QThread隐藏所有与平台相关的代码

要使用QThread开始一个线程,可以创建它的一个子类,然后覆盖其QThread.run()函数

QThread类中常用的方法和信号:

start():启动线程

wait():阻止线程,知道满足如下条件之一,*与此QThread对象关联的线程已完成执行,即从run()返回时。如果线程

完成执行,此函数将返回True:如果线程尚未启动,此函数也返回True。*等待时间的单位是毫秒,如果事件是ULONG_MAX(默认值)。则等待,永远不会超时。如果等待超时,此函数将返回False

QThread类中常用的信号

started:在开始执行run()函数之前,从相关线程发射此信号

finished:当线程完成业务逻辑时,从相关线程发射此信号

流程:

  1. class Thread(QThread): #继承QThread
  2. def __init__(self):
  3. super(Thread,self).__init__()
  4. def run(self):
  5. #线程相关的代码
  6. passs
  7. ========================
  8. #创建一个新的线程
  9. thread=Thread()
  10. thread.start()
  1. import sys
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import *
  4. from PyQt5.QtWidgets import *
  5. global sec
  6. sec = 0
  7. class WorkThread(QThread):
  8. #实例化一个信号对象
  9. trigger = pyqtSignal()
  10. def __int__(self):
  11. super(WorkThread, self).__init__()
  12. def run(self):
  13. #开始进行循环
  14. for i in range(2000000000):
  15. pass
  16. # 循环完毕后发出信号
  17. self.trigger.emit()
  18. def countTime():
  19. global sec
  20. sec += 1
  21. # LED显示数字+1
  22. lcdNumber.display(sec)
  23. def work():
  24. # 计时器每秒计数
  25. timer.start(1000)
  26. # 计时开始
  27. workThread.start()
  28. # 当获得循环完毕的信号时,停止计数
  29. workThread.trigger.connect(timeStop)
  30. def timeStop():
  31. #定时器停止
  32. timer.stop()
  33. print("运行结束用时", lcdNumber.value())
  34. global sec
  35. sec &#
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号