PyQt5多线程刷新界面防假死

ゞ 浴缸里的玫瑰 2022-03-11 04:58 652阅读 0赞

在做GUI界面时我们希望后台任务能够与UI分开,在PyQt中,主线程用来重绘界面。而子线程里边的实时处理结果需要反馈到界面,子线程里边不能执行界面更新操作。

wxpython多线程刷新界面转到

http://www.omegaxyz.com/2017/10/31/wxpython_thread_sendmessage/

下面给出类Python3+PyQt5多线程防假死动态刷新界面的模板

  1. from PyQt5 import QtWidgets, QtCore
  2. import sys
  3. from PyQt5.QtCore import *
  4. import time
  5. # 继承QThread
  6. class Runthread(QtCore.QThread):
  7. # 通过类成员对象定义信号对象
  8. _signal = pyqtSignal(str)
  9. def __init__(self):
  10. super(Runthread, self).__init__()
  11. def __del__(self):
  12. self.wait()
  13. def run(self):
  14. for i in range(100):
  15. time.sleep(0.2)
  16. self._signal.emit(str(i)) # 注意这里与_signal = pyqtSignal(str)中的类型相同
  17. class Example(QtWidgets.QWidget):
  18. def __init__(self):
  19. super().__init__()
  20. # 按钮初始化
  21. self.button = QtWidgets.QPushButton('开始', self)
  22. self.button.setToolTip('这是一个 <b>QPushButton</b> widget')
  23. self.button.resize(self.button.sizeHint())
  24. self.button.move(120, 80)
  25. self.button.clicked.connect(self.start_login) # 绑定多线程触发事件
  26. # 进度条设置
  27. self.pbar = QtWidgets.QProgressBar(self)
  28. self.pbar.setGeometry(50, 50, 210, 25)
  29. self.pbar.setValue(0)
  30. # 窗口初始化
  31. self.setGeometry(300, 300, 300, 200)
  32. self.setWindowTitle('OmegaXYZ.com')
  33. self.show()
  34. self.thread = None # 初始化线程
  35. def start_login(self):
  36. # 创建线程
  37. self.thread = Runthread()
  38. # 连接信号
  39. self.thread._signal.connect(self.call_backlog) # 进程连接回传到GUI的事件
  40. # 开始线程
  41. self.thread.start()
  42. def call_backlog(self, msg):
  43. self.pbar.setValue(int(msg)) # 将线程的参数传入进度条
  44. if __name__ == "__main__":
  45. app = QtWidgets.QApplication(sys.argv)
  46. myshow = Example()
  47. myshow.show()
  48. sys.exit(app.exec_())

效果

在这里插入图片描述
**更多pyqt5多线程细节参考:**http://www.omegaxyz.com/2019/03/07/pyqt5-multi-threading/

更多内容访问omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2019 • OmegaXYZ-版权所有 转载请注明出处

发表评论

表情:
评论列表 (有 0 条评论,652人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PyQt5篇】线

    这是因为QThread类提供了一个事件循环,可以在后台处理线程的任务,而不会影响到线程的响应性。,当在主线程中执行耗时操作时(例如click_1方法中的for循环),它。...

    相关 线

    峨眉山月半轮秋,影入平羌江水流 Java线程的死锁一直都是经典的多线程问题;因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都不能继续执行; 示例代码:

    相关 线

    同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。这种情况能避免就避免掉。