如何在 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_())
输出: