多线程解决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不太熟悉,以上程序结构是自己构建的,表述和程序设计不严谨之处恳请指正。
谢谢。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Python中的`threading`库可以创建多线程,并且利用`PyQt5`中的信号槽机制可以在线程中更新界面。 首先,我们需要创建一个继承自`QThread`的自定义线程类,在其中实现需要在后台运行的任务。这个任务可以是耗时的计算、网络请求等等。在任务的适当位置,我们可以通过发射信号来通知主线程更新界面。 下面是一个简单的示例代码: ```python import sys import time from PyQt5.QtCore import Qt, QThread, pyqtSignal from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget class WorkerThread(QThread): update_gui = pyqtSignal(str) # 定义一个信号,用于发送更新界面的文本 def __init__(self): super().__init__() def run(self): for i in range(5): time.sleep(1) # 模拟耗时操作 self.update_gui.emit(f"当前进度:{i+1}/5") # 发射信号,通知主线程更新界面 class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("线程更新界面示例") self.label = QLabel("等待开始") self.label.setAlignment(Qt.AlignCenter) self.setCentralWidget(self.label) self.worker_thread = WorkerThread() self.worker_thread.update_gui.connect(self.update_label) # 连接信号槽 self.worker_thread.start() # 启动线程 def update_label(self, text): self.label.setText(text) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 上述代码中,我们定义了一个继承自`QThread`的线程类`WorkerThread`,该类中有一个名为`update_gui`的信号。在`run`方法中,我们模拟了一个耗时操作,并在每次操作完成后发射信号。`MainWindow`类继承自`QMainWindow`,在其中创建了一个标签,将其设置为中心窗口,并连接了`WorkerThread`类的信号槽。在`update_label`方法中,我们更新了标签的文本。 通过运行以上示例代码,我们可以看到界面上的标签在线程中更新,展示了当前进度。这种方式可以实现在后台线程中执行耗时操作,同时保持界面的响应性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值