Я хочу, чтобы мое приложение pyqt останавливалось всякий раз, когда я нажимаю кнопку «Отмена».Например, это приложение должно зацикливать функции из двух таблиц.Я могу установить триггер, который всегда будет проверять его состояние (true / false) в зависимости от нажатия кнопки «отмена».Но есть ли способ установить глобальный триггер, который остановит процесс приложения в любой позиции кода?
import time
import sys
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import (QApplication, QWidget, QToolTip, QPushButton, QMessageBox, QTreeWidget, QTreeWidgetItem, QProgressBar, QLabel)
class Pio(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.launch = False
self.pbar = QProgressBar(self)
self.pbar.setGeometry(20,20,400,50)
self.okButton = QPushButton(self)
self.okButton.setGeometry(80, 20, 100, 50)
self.okButton.move(20, 80)
self.okButton.setText('launch')
self.cncl = QPushButton(self)
self.cncl.setGeometry(300, 20, 100, 50)
self.cncl.move(320, 80)
self.cncl.setText('cancel')
self.okButton.clicked.connect(self.start_loop)
self.cncl.clicked.connect(self.break_loop)
self.show()
def start_loop(self):
if not self.launch:
self.launch = True
print ('started!')
self.loop_numbers()
def break_loop(self):
print ('canceled!')
if self.launch:
print ('work in progress....')
self.launch = False
def loop_numbers(self):
print ('running')
'action #1 that takes a lot of time '
'action #2 that also takes a lot of time'
for n in range(101):
if self.launch:
self.pbar.setValue(n)
time.sleep(0.01)
QtCore.QCoreApplication.processEvents()
for n in range(11):
if self.launch:
self.pbar.setValue(n*10)
time.sleep(0.05)
QtCore.QCoreApplication.processEvents()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Pio()
sys.exit(app.exec_())
Если я переместу self.launch
в начало loop_numbers()
и после запуска цикла он будетработать весь процесс.