PyQt多线程显示(举例说明)

淩亂°似流年 2023-07-13 12:18 77阅读 0赞

问题描述:

PyQt进行界面显示使用的主线程,
如果程序中出现大量的运算,一直占用主线程,会造成界面显示卡死或者强制退出。

举个例子:

没有使用多线程:
在这里插入图片描述

  1. # coding=utf-8
  2. __author__ = 'a359680405'
  3. from PyQt5.QtCore import *
  4. from PyQt5.QtGui import *
  5. from PyQt5.QtWidgets import *
  6. global sec
  7. sec=0
  8. def setTime():
  9. global sec
  10. sec+=1
  11. lcdNumber.display(sec) #LED显示数字+1
  12. def work():
  13. timer.start(1000) #计时器每秒计数
  14. for i in range(2000000000):
  15. pass
  16. timer.stop()
  17. app=QApplication([])
  18. top=QWidget()
  19. layout=QVBoxLayout(top) #垂直布局类QVBoxLayout;
  20. lcdNumber=QLCDNumber() #加个显示屏
  21. layout.addWidget(lcdNumber)
  22. button=QPushButton("测试")
  23. layout.addWidget(button)
  24. timer=QTimer()
  25. timer.timeout.connect(setTime) #每次计时结束,触发setTime
  26. button.clicked.connect(work)
  27. top.show()
  28. app.exec()

上述例子没有调用多线程,点击按钮之后计时器应该累加,但程序进入循环语句之后,一直在循环语句中出不来,导致显示界面卡死。

改进:使用多线程
在这里插入图片描述

  1. # coding=utf-8
  2. __author__ = 'a359680405'
  3. from PyQt5.QtCore import *
  4. from PyQt5.QtGui import *
  5. from PyQt5.QtWidgets import *
  6. global sec
  7. sec=0
  8. class WorkThread(QThread):
  9. trigger = pyqtSignal()
  10. def __int__(self):
  11. super(WorkThread,self).__init__()
  12. def run(self):
  13. for i in range(203300030):
  14. print(i)
  15. self.trigger.emit() #循环完毕后发出信号
  16. def countTime():
  17. global sec
  18. sec+=1
  19. lcdNumber.display(sec) #LED显示数字+1
  20. def work():
  21. timer.start(1000) #计时器每秒计数
  22. workThread.start() #计时开始
  23. workThread.trigger.connect(timeStop) #当获得循环完毕的信号时,停止计数
  24. def timeStop():
  25. timer.stop()
  26. print("运行结束用时",lcdNumber.value())
  27. global sec
  28. sec=0
  29. app=QApplication([])
  30. top=QWidget()
  31. layout=QVBoxLayout(top) #垂直布局类QVBoxLayout;
  32. lcdNumber=QLCDNumber() #加个显示屏
  33. layout.addWidget(lcdNumber)
  34. button=QPushButton("测试")
  35. layout.addWidget(button)
  36. timer=QTimer()
  37. workThread=WorkThread()
  38. button.clicked.connect(work)
  39. timer.timeout.connect(countTime) #每次计时结束,触发setTime
  40. top.show()
  41. app.exec()

上述程序,将循环语句的计算部分放到新打开的线程里面计算,不会造成界面卡死。

注意:
1、pyqt界面显示需要使用Qtime,计算部分可调用多线程。
2、pyqtgraph界面显示同上。

发表评论

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

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

相关阅读

    相关 冒泡排序举例

    冒泡排序 思路:冒泡排序主要是比较数组中两个相邻元素间的大小,如果前一个数比后一个数大,就交换顺序 每一次比较都会产生一个最大或者最小 每下一次循环都可