PyQt5 界面显示无响应的实现
一、问题描述
使用PyQt5开发界面应用程序时,可能会遇到程序因为某种原因导致界面出现无响应的情况,此时需要在程序运行时进行一些操作来保证程序的正常运行,保证界面的响应性。
二、解决方案
1. QCoreApplication.processEvents()的使用
QCoreApplication.processEvents()方法可以让Qt事件处理器处理所有待处理的事件,包括鼠标/键盘事件、绘制事件等,这些事件可能会在界面出现无响应时积压起来,使用processEvents()方法可以快速的消化这些事件,使界面恢复正常。
使用示例:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import time
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('Process Events')
self.button = QPushButton('Pause', self)
self.button.move(150, 150)
self.button.clicked.connect(self.pause)
self.show()
def pause(self):
for i in range(5):
print(i)
time.sleep(1)
QCoreApplication.processEvents()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
以上代码中,当按钮按下时,程序会唤起一个循环并且每隔1秒打印一个数,此时如果不使用QCoreApplication.processEvents()方法,就无法对按钮的点击事件进行响应,制作产生“无响应”的现象。 而使用该方法后,界面可以正常响应事件,不会出现无响应的情况。
2.使用多线程处理一些耗时操作
Qt界面程序中,界面响应是通过事件循环机制实现的。事件循环是一种“处理用户事件,函数返回”的多次循环过程,当程序中包含大量D大计算等耗时操作时,时间循环会长时间占用CPU,导致界面失去响应,无法刷新。此时,使用多线程可以让耗时操作在其他的非主线程中执行,释放主线程的CPU,使界面恢复正常。具体实现步骤如下:
1、定义一个QThread的子类,并实现其中的run()方法。
2、将耗时操作移动到run()方法中执行。
3、在主线程中实例化QThread子类,并通过start()方法启动线程,进而执行run()方法中的代码。
使用示例:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import time
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('Multithreading')
self.button = QPushButton('Start', self)
self.button.move(150, 150)
self.button.clicked.connect(self.doWork)
self.show()
def doWork(self):
self.thread = WorkerThread()
self.thread.finished.connect(self.finishWork)
self.thread.start()
def finishWork(self):
QMessageBox.information(self, '完成', '工作完成!')
class WorkerThread(QThread):
def run(self):
for i in range(5):
print(i)
time.sleep(1)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
以上代码中,启动程序后点击‘Start’按钮时,会在新线程中执行循环操作,由于耗时操作在子线程中执行,主线程可以通过事件循环机制来处理其他事件,避免了界面无响应现象。
三、总结
以上就是解决PyQt5界面无响应问题的两种常见方法,分别是使用QCoreApplication.processEvents()方法和使用多线程处理耗时操作。在具体开发中,可以根据需求选择其中一种或多种方法来解决问题,以保证程序的正常运行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5 界面显示无响应的实现 - Python技术站