单击 windows 'X'(关闭)按钮时停止任何循环

Stopping any loops when the windows 'X' (Close) button is clicked

我有一个程序,当单击开始按钮时,它开始循环打印到终端。这很好。但是当我关闭 window 时,循环继续打印到终端。我不想要。所以我想知道他们是否有一种方法可以访问 windows '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)

当你说 单击按钮时,它开始循环打印到终端。哪个好看来你不知道Qt是怎么工作的。在主线程中连续执行任务是不好的,因为它们阻塞了 GUI 的事件循环,因此 window 冻结。最近似的是,这个印象是每隔一定的时间间隔,那个时间间隔很小(比如1ms),用一个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_())