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

10 篇文章 2 订阅
4 篇文章 0 订阅

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

1.配置环境

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

2.问题描述

Python在创建GUI后,如果需要按照一定周期更新GUI状态,如图。
假设过一段时间就要刷新一下各个按钮的状态(颜色、按钮上的文字)等信息
在这里插入图片描述

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.结束语

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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hurri_cane

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值