若主线程事件连接的槽函数执行时间过长,就会导致GUI界面提示无响应。
可另设一个线程,将执行时间长的代码放入新线程中执行。
- 新建一个类,继承自QThread:
from PyQt5.QtCore import QThread
class NewThread(QThread):
pass
- 为了可以将新线程中的数据返回给主线程,比如显示在标签上,需要在新线程中定义信号,信号可以引用 emit(你要传输的信息) 方法发送数据给主线程,然后在主线程中需要将接收到该信号的事件连接到相应的槽,并定义槽函数,信号发送的值将传入到该槽函数。
from PyQt5.QtCore import QThread, pyqtSignal
class NewThread(QThread):
signal1 = pyqtSignal(str) # 传送字符串信号
signal2 = pyqtSignal(int) # 传送整型信号
def run(self): # 运行线程
# 可在该函数内部发送信号
# self.signal1.emit('Running.')
# self.signal1.emit(123)
def get_par(self, a, b): # 可定义一个函数,用于获取参数
self.a = a
self.b = b
class MyWindow(QWidget, Ui):
def __init__(self):
super(MyWindow, self).__init__()
self.setupUi(self)
self.thread = NewThread() # 实例化该线程
self.thread.signal1.connect(self.Method1) # 接收到信号后执行槽函数
self.thread.signal2.connect(self.Method2)
self.Button1.clicked.connect(self.Init_par) # 按钮,控制传参
self.Button2.clicked.connect(self.Start) # 按钮,控制新线程运行
def Method1(self,sig):
# sig为收到的信号,str类型
pass
def Method2(self,sig):
# sig为收到的信号,int类型
pass
def Init_par(self): # 给新线程传参
self.thread.get_par(123, 321)
def Start(self):
self.thread.start() # 运行新线程
本人对PyQt5不太熟悉,以上程序结构是自己构建的,表述和程序设计不严谨之处恳请指正。
谢谢。