添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
天涯  ·  python - Get protocol ...·  11 月前    · 
瘦瘦的刺猬  ·  口碑榜 | ...·  1 年前    · 
狂野的水煮鱼  ·  Amazon Live·  1 年前    · 

示例中,初始化一个定时器,把定时器的timeout信号与showTime()槽函数连接起来。使用连接的槽函数显示当前时间,并在标签上显示系统现在的时间。单击“开始"按钮,启动定时器,并使"开始"按钮失效。单击“结束"按钮,停止定时器,并使“结束"按钮失效。

实现代码如下所示:

from PyQt5.QtWidgets import QWidget,  QPushButton ,  QApplication ,QListWidget,  QGridLayout , QLabel

from PyQt5.QtCore import QTimer ,QDateTime

import sys

class WinForm(QWidget):

def __init__(self,parent=None):

super(WinForm,self).__init__(parent)

self.setWindowTitle("QTimer demo")

self.listFile= QListWidget()

self.label = QLabel('显示当前时间')

self.startBtn = QPushButton('开始')

self.endBtn = QPushButton('结束')

layout = QGridLayout(self)

# 初始化一个定时器

self.timer = QTimer(self)

# showTime()方法

self.timer.timeout.connect(self.showTime)

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

layout.addWidget(self.startBtn,1,0)

layout.addWidget(self.endBtn,1,1)

self.startBtn.clicked.connect( self.startTimer)

self.endBtn.clicked.connect( self.endTimer)

self.setLayout(layout)

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.startBtn.setEnabled(False)

self.endBtn.setEnabled(True)

def endTimer(self):

self.timer.stop()

self.startBtn.setEnabled(True)

self.endBtn.setEnabled(False)

if __name__ == "__main__":

app = QApplication(sys.argv)

form = WinForm()

form.show()

sys.exit(app.exec_())

2、QThread多线程类

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

在使用线程时可以直接得到Thread实例,调用其start()函数即可启动线程。线程启动之后,会自动调用其实现的run方法,该方法就是线程的执行函数。

业务的线程任务就写在run()函数中,当run()退出之后线程基本就结束了。QThread有started和finished信号,可以为这两个信号指定槽函数,在线程启动和结束时执行一段代码进行资源的初始化和释放操作。更灵活的使用方法是,在自定义的QThread实例中自定义信号,并将信号连接到指定的槽函数,当满足一定的业务条件后发射此信号。

QThread类中的常用方法如下表所示:

示例中,在主界面中有一个用于显示时间的LCD数字面板,还有一个用于启动任务的按钮。用户单击"测试"按钮后,将开始一次非常耗时的计算(在程序中用一个2000 000 000次的循环来模拟这次非常耗时的工作,在真实的程序中可能是一个网络下载操作,从网络上下载一个很大的视频文件),同时LCD数字面板开始显示所用的毫秒数,并通过一个计时器进行更新。但是单击”测试“按钮后可见窗口卡死无法操作。此时在PyQt中所有的窗口都在UI主线程中(就是执行了QApplication.exec()的线程),在这个线程中执行耗时的操作会阻塞UI线程,从而让窗口停止响应。如果窗口长时间没有响应,则会影响用户体验,更严重的会导致程序崩溃。所以,为了避免出现这样的问题,要使用QThread开启一个新的线程,在这个线程中完成耗时的操作。

实现代码如下所示:

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 = QApplication(sys.argv)

top = QWidget()

top.resize(300,120)

# 垂直布局类QVBoxLayout

layout = QVBoxLayout(top)

# 加个显示屏

lcdNumber = QLCDNumber()

layout.addWidget(lcdNumber)

button = QPushButton("测试")

layout.addWidget(button)

timer = QTimer()

workThread = WorkThread()

button.clicked.connect(work)

# 每次计时结束,触发 countTime

timer.timeout.connect(countTime)

top.show()

sys.exit(app.exec_())

3、事件处理类

PyQt为事件处理提供了两种机制:高级的信号与槽机制以及低级的事件处理程序。本篇文博只介绍低级的事件处理程序即:processEvents()函数的使用方法,它的作用是处理事件,简单地说,就是刷新页面。

对于执行很耗时的程序来说,由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿。而如果在执行这个耗时程序时不断地运行

QApplication.processEvents(),那么就可以实现一边执行耗时程序,一边刷新页面的功能,给人的感觉就是程序运行很流畅。

因此QApplication.processEvents()的使用方法就是,在主函数执行耗时操作的地方,加入QApplication.processEvents()。

通过一个示例,了解事件处理类的使用方法,效果如下所示: