在使用pyqt5时,程序运行时间过长可能会造成界面假死的情况,为了解决这个问题,可以采用Qthread多线程。将耗时的程序放到子线程中运行。
pyqt5 多线程用法是继承QThread类,然后重写run()函数实现。
如下函数仅仅是举例子,根据自己的程序做相应的更改就可以,将耗时操作的函数放在多线程中进行调用即可。
下面使用多线程时,还使用了自定义槽函数,也可以不使用,直接定义一个类,将print输出的语句直接打印到相应的显示窗口即可
class RunConnect(QThread):
# 设置发射信号类型为str
_connect_status = pyqtSignal(str) # 信号类型 str
def __init__(self, telnetObj, host, port):
super(RunConnect, self).__init__()
self.telnetObj = telnetObj
self.host = host
self.port = port
def run(self):
try:
# 耗时操作的函数,放在这里执行
self.telnetObj.open(host=self.host, port=self.port, timeout=10)
self._connect_status.emit('Connect successfully\r')
except Exception as e:
self._connect_status.emit(f'连接失败:{e}\r')
# return '连接失败'
定义完成后,在主程序中进行调用时,参照如下
这里有一个坑要注意,在主程序实例化多线程时,一定要加self,因为不加self,是局部变量,函数运行后,python的垃圾自动回收机制会将局部变量回收掉。
程序会直接crash,这个错误也不好排查
一定注意!!!
一定注意!!!
一定注意!!!
class test():
def __init__():
pass
def demo():
self.connectObj = RunConnect(self.tn, host, port) # 创建一个线程
self.connectObj._connect_status.connect(self.ptePrintText) # 线程连接到槽函数
self.connectObj.start() # 启动
# QPlainTextEdit更新信息的槽函数
def ptePrintText(self, newText):
cursor = self.show_pte.textCursor()
cursor.movePosition(QTextCursor.End)
cursor.insertText(str(newText)) # 该方法只可以插入文本,不会显示HTML标签
# cursor.insertHtml(text)
self.show_pte.setTextCursor(cursor)
self.show_pte.ensureCursorVisible()
如果想关闭窗口时,做某些操作,例如,保存配置,或者其他等等,一定不要执行耗时的操作,大量参数的比较,这样会使关闭动作延迟,使用感受不好,如果想关闭窗口时,保存配置,最好不管参数有没有变化,都直接写入到配置文件即可,不进行比较操作,这样反而会降低效率。
参考:pyqt5 多线程遇到的问题总结_来一打雪碧-CSDN博客_pyqt5多线程崩溃