Это вызвано давней проблемой, которая должна быть исправлена в следующем выпуске (возможно, PyQt-5.14). Если вы используете PyQt-5.13.1, вы можете протестировать исправление с помощью следующего временного API:
from PyQt5.QtCore import pyqt5_enable_new_onexit_scheme
pyqt5_enable_new_onexit_scheme(True)
Если проблем с этим нет, то в конечном итоге это станет поведением по умолчанию (поэтомуне будет необходимости включать его явно). Основная проблема, которая вызывает проблему, задокументирована здесь:
По сути, схема сбора мусора в Python удаляетобъекты в непредсказуемом порядке, и это иногда может привести к тому, что Qt попытается удалить объекты, которые больше не существуют (что приведет к сбою). Таким образом, пример в вопросе также может быть исправлен следующим образом:
def main():
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
app.exec_()
# ensure correct deletion order
del main_window, app
Предстоящие изменения, отмеченные выше, будут означать, что такого рода код очистки больше не понадобится.