Следующий скрипт приводит к следующему выводу при запуске и нажатии Ctrl + C.
>> SIGINT or CTRL-C detected. Exiting gracefully
Clean up
Return from loop due to stop
Final clean up
Есть ли способ заставить QCoreApplicaiton выйти без возврата к l oop в infinitel oop? Я хотел бы избежать использования флага и проверки его все время в разных частях кода. Другими словами, я хочу, чтобы программа записывала системное событие, очищала его и корректно выходила, независимо от того, что она, возможно, делала.
from signal import signal, SIGINT
import sys
from PySide2.QtCore import QCoreApplication, QTimer
class App(QCoreApplication):
def __init__(self, args):
super(App, self).__init__(args)
self.__stop = False
self.aboutToQuit.connect(self.finalcleanup)
QTimer.singleShot(0, self.infiniteloop)
def finalcleanup(self):
print('Final clean up')
def cleanup(self):
print('Clean up')
def handler(self, signal_received, frame):
print('SIGINT or CTRL-C detected. Exiting gracefully')
self.__stop = True
self.cleanup()
self.quit()
def infiniteloop(self):
while 1:
if self.__stop:
print('Return from loop due to stop')
return
getinput()
def getinput():
try:
x = input('>> ')
print(x)
except:
pass
if __name__ == '__main__':
app = App(sys.argv)
signal(SIGINT, app.handler)
sys.exit(app.exec_())
Мои настройки:
- Windows 10
- Python 3.7
- PySide2 5.13.2
Я хочу использовать Qt, потому что мое окончательное приложение получит пользу от сигнала / слота модель.