pyside2中避坑tip-防止GUI卡死\阻塞

pyside2中避坑tip-防止GUI卡死\阻塞

  • 1.配置环境
  • 2.问题描述
  • 3.坑点
  • 4.填坑
  • 5.结束语

1.配置环境

使用环境:python3.8
平台:Windows10
IDE:PyCharm

2.问题描述

Python在创建GUI后,如果需要按照一定周期更新GUI状态,如图。
假设过一段时间就要刷新一下各个按钮的状态(颜色、按钮上的文字)等信息
pyside2中避坑tip-防止GUI卡死\阻塞_第1张图片

3.坑点

解决上面的问题很容易想到的一个方法就是设置一个循环,循环中不断更新按钮状态,如果通过一个线程来包住整个循环,让其在后台运行而不阻碍总体进程

	def loop(self):
		while True:
			# print(self.connect_status)
			# print("LOOP已运行")
			if self.connect_status:
				self.ui.pushButton_v_connect_status.setStyleSheet("background-color:rgb(85, 170, 127)")
				self.ui.pushButton_v_connect_status.setText("连接成功")
			else:
				self.ui.pushButton_v_connect_status.setStyleSheet("background-color:rgb(255, 85, 127)")
				self.ui.pushButton_v_connect_status.setText("连接失败")

			if self.start:
				self.ui.pushButton_v_work_status.setStyleSheet("background-color:rgb(85, 170, 127)")
				self.ui.pushButton_v_work_status.setText("运行中")
			else:
				self.ui.pushButton_v_work_status.setStyleSheet("background-color:rgb(255, 85, 127)")
				self.ui.pushButton_v_work_status.setText("运行中止")

			if self.camera_cato == "front":
				self.ui.pushButton_camera_front.setStyleSheet("background-color:rgb(85, 170, 127)")
				self.ui.pushButton_camera_behind.setStyleSheet("background-color:rgb(139, 163, 158)")
			elif self.camera_cato == "behind":
				self.ui.pushButton_camera_behind.setStyleSheet("background-color:rgb(85, 170, 127)")
				self.ui.pushButton_camera_front.setStyleSheet("background-color:rgb(139, 163, 158)")
	
	def connect(self):
		self.task_Proce_loop = Thread(target=self.loop)
		# 设置为守护线程,当主线程结束后,此子线程也会随之结束
		self.task_Proce_loop.setDaemon(True)
		self.task_Proce_loop.start()		

然后调用connect函数即可,但是使用时会发现整个GUI都卡住了,无法运行

4.填坑

这里面的原因是由于一个循环在不断更新GUI状态,虽然这个循环在子线程中运行,但是GUI的状态改变是一个在主进程中显示的,所以会导致GUI阻塞,解决方法很简单,在循环里面加上一个time.sleep(0.3)就可以了,给GUI更新留一个短暂的时间窗口即可。完整代码如下:

	def loop(self):
		while True:
			# print(self.connect_status)
			# print("LOOP已运行")
			if self.connect_status:
				self.ui.pushButton_v_connect_status.setStyleSheet("background-color:rgb(85, 170, 127)")
				self.ui.pushButton_v_connect_status.setText("连接成功")
			else:
				self.ui.pushButton_v_connect_status.setStyleSheet("background-color:rgb(255, 85, 127)")
				self.ui.pushButton_v_connect_status.setText("连接失败")

			if self.start:
				self.ui.pushButton_v_work_status.setStyleSheet("background-color:rgb(85, 170, 127)")
				self.ui.pushButton_v_work_status.setText("运行中")
			else:
				self.ui.pushButton_v_work_status.setStyleSheet("background-color:rgb(255, 85, 127)")
				self.ui.pushButton_v_work_status.setText("运行中止")

			if self.camera_cato == "front":
				self.ui.pushButton_camera_front.setStyleSheet("background-color:rgb(85, 170, 127)")
				self.ui.pushButton_camera_behind.setStyleSheet("background-color:rgb(139, 163, 158)")
			elif self.camera_cato == "behind":
				self.ui.pushButton_camera_behind.setStyleSheet("background-color:rgb(85, 170, 127)")
				self.ui.pushButton_camera_front.setStyleSheet("background-color:rgb(139, 163, 158)")
			time.sleep(0.3)
	def connect(self):
		self.task_Proce_loop = Thread(target=self.loop)
		# 设置为守护线程,当主线程结束后,此子线程也会随之结束
		self.task_Proce_loop.setDaemon(True)
		self.task_Proce_loop.start()		

5.结束语

如果本文对你有帮助的话还请点赞、收藏一键带走哦,你的支持是我最大的动力!(づ。◕ᴗᴗ◕。)づ
在这里插入图片描述

你可能感兴趣的:(Pyside2,Python,Tips,python,多线程,pyside2,GUI,阻塞)