Полностью прекратить запуск приложения pyqt5 - PullRequest
0 голосов
/ 22 апреля 2019

Я хочу, чтобы мое приложение 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() и после запуска цикла он будетработать весь процесс.

1 Ответ

1 голос
/ 25 апреля 2019

Приложение закроется автоматически, когда закроется последнее окно, поэтому вы можете попробовать, изменив QWidget на QMainWindow и просто позвонив закрыть с помощью кнопки отмены.

import sys
import time

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar


class Pio(QMainWindow):
    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)

    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

        # Close window and exit application
        self.close()

    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)
    mainWindow = Pio()
    mainWindow.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...