pyqt5同一个button,第一次点击持续执行,再次点击停止
时间: 2023-06-29 22:04:47 浏览: 192
可以使用一个标志变量来实现该功能。首先,将按钮与一个槽函数绑定,该槽函数会在按钮被点击时被调用。在槽函数中,我们可以根据标志变量来判断按钮是应该继续执行还是停止执行。如果标志变量为False,则启动一个线程来执行操作,并将标志变量设置为True;如果标志变量为True,则停止线程并将标志变量设置为False。
以下是一个简单的示例代码:
```python
import sys
import threading
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
class Worker(QObject):
finished = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self.running = False
def start(self):
self.running = True
while self.running:
# 执行需要持续执行的操作
pass
self.finished.emit()
def stop(self):
self.running = False
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Button Example')
self.btn = QPushButton('Start', self)
self.btn.clicked.connect(self.on_clicked)
self.worker = Worker()
self.worker_thread = threading.Thread(target=self.worker.start)
def on_clicked(self):
if not self.worker.running:
self.btn.setText('Stop')
self.worker_thread.start()
self.worker.running = True
else:
self.btn.setText('Start')
self.worker.stop()
self.worker_thread.join()
self.worker.running = False
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
ex.show()
sys.exit(app.exec_())
```
在上面的代码中,我们定义了一个 `Worker` 类来执行需要持续执行的操作。该类继承自 `QObject` 类,因此可以使用 `pyqtSignal` 来定义一个自定义信号 `finished`。`start` 方法中使用一个循环来模拟需要持续执行的操作,同时在循环中检查标志变量 `running` 是否为 True。`stop` 方法用于停止持续执行的操作。
在 `MyApp` 类中,我们创建了一个按钮 `btn`,并将其与 `on_clicked` 槽函数绑定。在 `on_clicked` 槽函数中,我们根据标志变量 `running` 来判断按钮是应该继续执行还是停止执行。如果 `running` 为 False,则将按钮文本设为 'Stop',启动一个新的线程来执行操作,并将 `running` 设置为 True;如果 `running` 为 True,则将按钮文本设为 'Start',停止线程并将 `running` 设置为 False。注意,在停止线程时,我们使用了 `join` 方法来等待线程结束。
阅读全文