Остановка любых циклов при нажатии кнопки «X» (Закрыть) окна - PullRequest
2 голосов
/ 14 июня 2019

У меня есть программа, которая, когда нажимается кнопка начала, начинает печатать на терминал в цикле.Что хорошо.Но когда я закрываю окно, цикл продолжает печатать на терминал.который я не хочу.Поэтому мне интересно, есть ли у них способ доступа к окнам 'X' (предпочтительно с использованием PyQt5) для запуска функции, которая закрывает всю программу.

Я не знаю, нужен ли вам весь код, поэтому... Я только что добавил функцию цикла, которую я использую.

Я пытался найти решение.Однако все решения, которые я нашел, были для PyQt4 и не сработали для меня.

# I have tried using this to close the program
app.aboutToQuit.connect(self.close) # didn't work... Did nothing.

#close function    
    def close(self):
        exit()
# I am using this an infinite loop (for testing purposes.)
    def start(self, activate):
        self.activate = activate
        print(self.activate)

        self.Stop_BTN.setEnabled(True)
        self.Start_BTN.setEnabled(False)

        if (self.activate != 1):
            pass
            return
        else:
            while (self.activate == 1):
                print('IDK just needed something to put here.')
                QtTest.QTest.qWait(1000)

1 Ответ

2 голосов
/ 14 июня 2019

Когда вы говорите , когда кнопка нажата, она начинает печатать на терминале в цикле.Что хорошо кажется, что вы не знаете, как работает Qt.Это не хорошо, что в основном потоке задачи выполняются непрерывно, так как они блокируют цикл событий графического интерфейса и, следовательно, окно зависает.Наиболее приблизительным является то, что это впечатление происходит через каждый определенный интервал времени, и этот интервал времени мал (например, 1 мс) с QTimer.

from PyQt5 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.m_timer = QtCore.QTimer(self, interval=1000)

        self.m_start_button = QtWidgets.QPushButton("Start printing")
        self.m_close_button = QtWidgets.QPushButton("Close window")
        self.m_close_button.setDisabled(True)

        self.m_timer.timeout.connect(self.printing_task)
        self.m_start_button.clicked.connect(self.start_timer)
        self.m_close_button.clicked.connect(self.close)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.m_start_button)
        lay.addWidget(self.m_close_button)

    @QtCore.pyqtSlot()
    def start_timer(self):
        self.m_start_button.setDisabled(True)
        self.m_close_button.setDisabled(False)
        self.m_timer.start()

    @QtCore.pyqtSlot()
    def printing_task(self):
        print("IDK just needed something to put here.")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
...