概述
前言
在使用pyqt5时,程序运行时间过长可能会造成界面假死的情况,为了解决这个问题,可以采用多线程。将程序放到子线程中运行。
这里pyqt5 多线程用的方法是继承QThread类,然后重写run()函数实现。
# 多线程的实现
class MyThread(QThread):
_signal = pyqtSignal(object)
# 自定义信号,用于传递数据等
def __init__(self):
super().__init__()
# 重写run函数
def run(self):
# 需要在子线程运行的程序
...
1. 退出子线程
有时候我们不希望程序运行到结束,我们需要程序提前终止,这时候我们需要提前退出子线程。
方法:定义一个停止标志flag,重写stop函数。退出线程直接调用stop函数让flag不满足循环条件,退出循环。
# 多线程的实现
class MyThread(QThread):
_signal = pyqtSignal(object)
# 自定义信号,用于传递数据等
def __init__(self):
super().__init__()
self.stop_flag = False
# 重写run函数
def run(self):
for i in range(10):
if self.stop_flag is True:
return/(break)
else:
self._signal.emit(i)
self._signal.emit("程序运行结束!")
def stop(self):
self.stop_flag = True
class UIwindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.stop_thread)
# 提前停止线程
self.pushButton_2.clicked.connect(self.start_thread)
# 开启线程
def start_thread(self):
# 创建线程
self.thread = MyThread()
self.textBrowser.append("程序正在运行中... ")
self.thread._signal.connect(self.receive)
self.thread.stop_flag = False
self.thread.start()
def stop_thread(self):
self.thread.stop()
def receive(self, i):
"""
接收线程发射的信号
"""
precent = "■" * (i + 1) + "□" * (9 - i)
self.textBrowser.setText("生成数据中...
{}% |".format((i + 1) * 10) + precent + "|")
2. 报错 QThread :Destroyed while thread is still running!
方法1:在调用线程的时候一定要加self,因为不加self,是局部变量,函数运行后,python的垃圾自动回收机制会将局部变量回收掉。
thread = MyThread()
更改为:
self.thread = MyThread()
方法2:在线程开启后面加self.exec()
self.thread = MyThread()
self.thread.start()
self.thread.exec()
方法3:退出线程的时候报这个错误,在线程stop函数中加入下面语句
def stop(self):
self.stop_flag = True
# 加入下面语句
self.requestInterruption()
self.wait()
3. 退出线程后,再次开启线程时程序不运行
线程锁(QMutex)的问题
因为线程中用了线程锁的原因,导致退出线程后,再次开启线程后,程序不会接着运行的问题。将线程锁取消掉成功解决。
4. pyqt5不报具体的错误,直接闪退
更新:最近发现了一个调试库,可以显示pyqt的错误,而且界面也不会闪退,在代码中加入下列代码即可。
import cgitb
cgitb.enable(format='text')
解决方法:在终端(命令行)运行程序,就可以正常的显示错误了。
Pycharm的话,在Terminal处运行就可以了。
推荐可以使用try,except语句。既可以发现错误,也不会导致界面频繁闪退!
try:
...
return
except Exception as reason:
return QMessageBox.warning(self, 'Warning', str(reason))
5. 利用自定义信号传递数据和参数
_finished = pyqtSignal(object)
# 自定义信号
(int)------>传递整型数据
(str)------>传递字符型数据
(object)------>不确定类型的时候可以用这个,可以传递numpy、字典等类型数据
最后
以上就是自觉蜗牛为你收集整理的pyqt5 多线程遇到的问题总结前言的全部内容,希望文章能够帮你解决pyqt5 多线程遇到的问题总结前言所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复