PyQt线程问题

雨点打透心脏的1/2处 2022-03-01 10:22 301阅读 0赞

在pyqt5中我们通常需要在子线程中处理耗时操作如网络请求,在主线程中更新UI界面,下面是一个简单的例子,运行界面如下

在这里插入图片描述

  1. # -*- coding: utf-8 -*-
  2. import sys
  3. from PyQt5.QtCore import QThread, pyqtSignal
  4. from PyQt5.QtGui import QIcon, QCloseEvent
  5. from PyQt5.QtWidgets import *
  6. class MyThread(QThread):
  7. # 定义一个传输 int类型的信号
  8. send_singal = pyqtSignal(int)
  9. def run(self):
  10. for i in range(1, 5):
  11. print("current id is: ", self.currentThreadId())
  12. self.send_singal.emit(i)
  13. QThread.sleep(1)
  14. class Window(QWidget):
  15. def __init__(self,*args, **kwargs):
  16. super(Window, self).__init__(*args, **kwargs)
  17. # 设置宽高
  18. self.resize(600, 400)
  19. # 窗口移动到指定位置
  20. self.move(660,300)
  21. # 设置标题
  22. self.setWindowTitle("标哥测试")
  23. # 设置logo
  24. # self.setWindowIcon(QIcon("logo.png"))
  25. # 初始化UI界面的控件
  26. self.setUI()
  27. # 初始化事件
  28. self.intilogic()
  29. def setUI(self):
  30. self.layout = QVBoxLayout()
  31. self.progress = QProgressBar()
  32. self.progress.setRange(0, 100)
  33. print(self.progress.width())
  34. self.button = QPushButton("点击开始线程")
  35. self.button.clicked.connect(self.start)
  36. self.layout.addWidget(self.progress)
  37. self.layout.addWidget(self.button)
  38. self.setLayout(self.layout)
  39. def intilogic(self):
  40. # 创建子线程并和当前窗口绑定
  41. self.thread = MyThread(self)
  42. # 完成循环后删除子线程
  43. self.thread.finished.connect(self.thread.deleteLater)
  44. self.thread.send_singal.connect(self.change_value)
  45. self.button.clicked.connect(self.start)
  46. def change_value(self, value):
  47. # 设置进度条
  48. self.progress.setValue(value)
  49. def start(self):
  50. print('当前主线程ID: ', int(QThread.currentThreadId()))
  51. # 线程开启后再次点击是没有用的,也不会再次重新开始线程
  52. # 但是当线程运行完毕之后,由于上面调用了
  53. # self.thread.deleteLater 所以 在子线程运行完毕之后再次点击运行这段代码会报错,需要处理
  54. try:
  55. self.thread.start()
  56. except:
  57. print("子线程开启失败")
  58. # 窗口的关闭事件
  59. def closeEvent(self, a0: QCloseEvent):
  60. print("关闭")
  61. super(Window, self).closeEvent(a0)
  62. if __name__ == "__main__":
  63. app = QApplication(sys.argv)
  64. window = Window()
  65. window.show()
  66. sys.exit(app.exec_())

发表评论

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

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

相关阅读

    相关 PyQt5篇】多线

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