单击窗口“ X”(关闭)按钮时停止任何循环

时间:2019-06-13 23:25:20

标签: python pyqt pyqt5 python-3.7

我有一个程序,当单击开始按钮时,它将开始循环打印到终端。没关系但是当我关闭窗口时,循环继续打印到终端。我不要因此,我想知道他们是否有一种方法来访问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)

1 个答案:

答案 0 :(得分:2)

单击按钮时说时,它将开始循环打印到终端。没问题,看来您不知道Qt的工作原理。在主线程中连续执行任务是不好的,因为它们阻塞了GUI的事件循环,因此窗口冻结了。最近似的是,这种印象是每隔一定的时间间隔,并且该时间间隔很小(例如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_())