PyQt学习(14):多线程(Qtimer和Qthread),网页交互(QWebEngineView,js与python的交互)

目录

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()

from PyQt5.QtWidgets import QGridLayout,QApplication,QWidget,QPushButton,QLabel
import sys
from PyQt5.QtCore import QTimer,QDateTime

class TimerDemo(QWidget):
	def __init__(self):
		super(TimerDemo, self).__init__()
		self.initUI()
	def initUI(self):
		self.setWindowTitle('demo')
		self.setGeometry(300,300,300,200)
		layout=QGridLayout(self)
		#定义计时器,并连接槽函数
		self.timer=QTimer()
		self.timer.timeout.connect(self.show_time)

		self.label=QLabel()
		layout.addWidget(self.label,0,0,1,2)

		self.btn1=QPushButton('start',self)
		layout.addWidget(self.btn1,1,0)
		self.btn1.clicked.connect(self.start_program)

		self.btn2=QPushButton('end',self)
		layout.addWidget(self.btn2,1,1)
		self.btn2.clicked.connect(self.end_program)

	def show_time(self):
		date=QDateTime.currentDateTime()
		now=date.toString('yyyy-MM--dd hh:mm:ss')
		self.label.setText(now)

	def start_program(self):
		self.timer.start(1000)
		self.btn1.setEnabled(False)
		self.btn2.setEnabled(True)
	def end_program(self):
		self.timer.stop()
		self.btn2.setEnabled(False)
		self.btn1.setEnabled(True)

if __name__=='__main__':
	app=QApplication(sys.argv)
	demo=TimerDemo()
	demo.show()
	sys.exit(app.exec_())
from PyQt5.QtWidgets import QLabel,QApplication
import sys
from PyQt5.QtCore import QTimer,Qt


if __name__ == '__main__':
	app=QApplication(sys.argv)
	label=QLabel('五秒退出')
	label.setWindowFlags(Qt.SplashScreen|Qt.FramelessWindowHint)
	label.show()
	#设置窗口无边框
	
	timer=QTimer()
	timer.singleShot(5000,app.quit)#*********
	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:当线程完成业务逻辑时,从相关线程发射此信号

流程:

class Thread(QThread):     #继承QThread
      def __init__(self):
            super(Thread,self).__init__()
      def run(self):
      #线程相关的代码
      passs
========================
#创建一个新的线程
thread=Thread()
thread.start()

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

global sec
sec = 0


class WorkThread(QThread):
    #实例化一个信号对象
    trigger = pyqtSignal()

    def __int__(self):
        super(WorkThread, self).__init__()

    def run(self):
        #开始进行循环
        for i in range(2000000000):
            pass

        # 循环完毕后发出信号
        self.trigger.emit()


def countTime():
    global sec
    sec += 1
    # LED显示数字+1
    lcdNumber.display(sec)


def work():
    # 计时器每秒计数
    timer.start(1000)
    # 计时开始
    workThread.start()
    # 当获得循环完毕的信号时,停止计数
    workThread.trigger.connect(timeStop)


def timeStop():
    #定时器停止
    timer.stop()
    print("运行结束用时", lcdNumber.value())
    global sec
    sec = 0


if __name__ == "__main__":
    app =
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值