📜  如何在 PyQt5 中使用线程?

📅  最后修改于: 2022-05-13 01:55:11.966000             🧑  作者: Mango

如何在 PyQt5 中使用线程?

先决条件: PyQt5 和多线程

多线程是指通过在线程之间快速切换 CPU 的控制(称为上下文切换)来并发执行多个线程。即使机器包含多个处理器, Python全局解释器锁也会限制一次运行一个线程。

在本文中,我们将学习如何在 Pyqt5 中使用线程。在创建 GUI 时,需要在后端执行多项工作/操作。假设我们要同时执行 4 个操作。这里的问题是,每个操作都一个一个地执行。在执行一个操作期间,GUI 窗口也不会移动,这就是我们需要线程化的原因。下面给出了两种实现,这显然有助于更好地理解它们的差异。

方法

  • 需要导入库
  • 创建一个简单的窗口
  • 使用命令添加按钮
  • 执行 Pyqt5

无螺纹



在没有线程的情况下工作,会使进程延迟。此外,在完全执行之前,窗口不会移动。

Python3
# Import Module
import sys
from PyQt5.QtWidgets import *
import time
  
class ListBox(QWidget):
  
    def __init__(self):
        super().__init__()
  
        self.Button()
  
    def Button(self):
        # Add Push Button
        clear_btn = QPushButton('Click Me', self)
        clear_btn.clicked.connect(self.Operation)
  
        # Set geometry
        self.setGeometry(200, 200, 200, 200)
  
        # Display QlistWidget
        self.show()
  
    def Operation(self):
        print("time start")
        time.sleep(10)
        print("time stop")
  
  
if __name__ == '__main__':
    app = QApplication(sys.argv)
      
    # Call ListBox Class
    ex = ListBox()
  
    # Close the window
    sys.exit(app.exec_())


Python3
# Import Module
import sys
from PyQt5.QtWidgets import *
import time
from threading import *
  
class ListBox(QWidget):
  
    def __init__(self):
        super().__init__()
  
        self.Button()
  
    def Button(self):
        # Add Push Button
        clear_btn = QPushButton('Click Me', self)
        clear_btn.clicked.connect(self.thread)
  
        # Set geometry
        self.setGeometry(200, 200, 200, 200)
  
        # Display QlistWidget
        self.show()
  
    def thread(self):
        t1=Thread(target=self.Operation)
        t1.start()
  
    def Operation(self):
        print("time start")
        time.sleep(10)
        print("time stop")
  
  
if __name__ == '__main__':
    app = QApplication(sys.argv)
      
    # Call ListBox Class
    ex = ListBox()
  
    # Close the window
    sys.exit(app.exec_())


输出:

带螺纹

每当我们单击“单击我”按钮时,它都会调用thread()方法。在线程方法中,我们正在创建一个线程对象,在其中定义我们的函数名称。

蟒蛇3

# Import Module
import sys
from PyQt5.QtWidgets import *
import time
from threading import *
  
class ListBox(QWidget):
  
    def __init__(self):
        super().__init__()
  
        self.Button()
  
    def Button(self):
        # Add Push Button
        clear_btn = QPushButton('Click Me', self)
        clear_btn.clicked.connect(self.thread)
  
        # Set geometry
        self.setGeometry(200, 200, 200, 200)
  
        # Display QlistWidget
        self.show()
  
    def thread(self):
        t1=Thread(target=self.Operation)
        t1.start()
  
    def Operation(self):
        print("time start")
        time.sleep(10)
        print("time stop")
  
  
if __name__ == '__main__':
    app = QApplication(sys.argv)
      
    # Call ListBox Class
    ex = ListBox()
  
    # Close the window
    sys.exit(app.exec_())

输出: