多线程解决PyQt5 GUI界面无响应问题

若主线程事件连接的槽函数执行时间过长,就会导致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不太熟悉,以上程序结构是自己构建的,表述和程序设计不严谨之处恳请指正。
谢谢。

猜你喜欢

转载自blog.csdn.net/weixin_43196818/article/details/115314403