目录
3,网页交互(QWebEngineView和QWebChannel)
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 =