使用环境:python3.8
平台:Windows10
IDE:PyCharm
Python在创建GUI后,如果需要按照一定周期更新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)")
def connect(self):
self.task_Proce_loop = Thread(target=self.loop)
# 设置为守护线程,当主线程结束后,此子线程也会随之结束
self.task_Proce_loop.setDaemon(True)
self.task_Proce_loop.start()
然后调用connect
函数即可,但是使用时会发现整个GUI都卡住了,无法运行
这里面的原因是由于一个循环在不断更新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()
如果本文对你有帮助的话还请点赞、收藏一键带走哦,你的支持是我最大的动力!(づ。◕ᴗᴗ◕。)づ