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