python pyqt5通过按钮终止类中某个正在运行的特定函数的执行但不影响其他函数执行且不适用多线程代码例子
时间: 2023-03-25 10:04:04 浏览: 337
可以使用信号与槽机制来实现这个功能。在按钮的槽函数中,发射一个信号,然后在特定函数中连接这个信号,当接收到这个信号时,特定函数就会停止执行。以下是一个示例代码:
```python
from PyQt5.QtCore import QObject, pyqtSignal, QThread
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
import time
class Worker(QObject):
finished = pyqtSignal()
def __init__(self):
super().__init__()
def long_running(self):
for i in range(10):
print(i)
time.sleep(1)
QApplication.processEvents()
if self.isInterruptionRequested():
print("特定函数被终止")
return
self.finished.emit()
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.worker = Worker()
self.thread = QThread()
self.worker.moveToThread(self.thread)
self.thread.started.connect(self.worker.long_running)
self.worker.finished.connect(self.thread.quit)
self.worker.finished.connect(self.worker.deleteLater)
self.thread.finished.connect(self.thread.deleteLater)
layout = QVBoxLayout()
self.button = QPushButton("终止特定函数")
self.button.clicked.connect(self.worker.requestInterruption)
layout.addWidget(self.button)
self.setLayout(layout)
self.thread.start()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
在这个示例代码中,我们创建了一个 `Worker` 类来执行特定函数 `long_running`。在 `long_running` 函数中,我们使用了 `QApplication.processEvents()` 来处理事件循环,以便在运行特定函数时仍然能够响应按钮点击事件。在 `MainWindow` 类中,我们创建了一个按钮,并将其连接到 `worker.requestInterruption` 槽函数,以便在点击按钮时终止特定函数的执行。我们还使用了 `QThread` 来将 `Worker` 类的执行移动到单独的线程中,以便在执行特定函数时不会阻塞主线程。
阅读全文