Поток PyQt все еще работает после закрытия окна

Когда я закрываю окно приложения в PyQt, консоль все еще работает в фоновом режиме, а процесс python.exe присутствует до тех пор, пока я не закрою консоль. Я думаю, sys.exit(app.exec_()) не может нормально работать.

Mainscript (который открывает первое окно):

if __name__ == '__main__':
    from firstwindow import main
    main()

Первое окно

При нажатии кнопки:

    self.close() #close firstprogram
    Start() #function to open mainprogram

Начинать():

def Start():
        global MainWindow
        MainWindow = QtWidgets.QMainWindow()
        ui = genui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()

main () (предлагается здесь ):

def main_window():
     return form

def main():
    global form
    app = QtWidgets.QApplication(sys.argv)  
    form = MyApp()  
    form.show()
    app.exec_()
    sys.exit(app.exec_())

person Prof    schedule 13.11.2015    source источник
comment
Почему вы запускаете приложение дважды подряд? Во второй раз, когда вы вызовете exec_(), он просто будет сидеть и ничего не делать, и вы не сможете взаимодействовать с ним, потому что вы уже закрыли главное окно. Избавьтесь от первой app.exec_() строки.   -  person ekhumoro    schedule 14.11.2015
comment
@ekhumoro Это помогло, вы можете опубликовать его в качестве ответа. Однако я хотел бы знать, где я вызываю exec во второй раз, поскольку я этого не понимаю. Разве exec не сообщает движку qt обрабатывать запуск программы, а затем я помещаю exec в sys.exit и не сообщает скрипту о завершении, когда Qt говорит об этом?   -  person Prof    schedule 14.11.2015


Ответы (1)


Проблема в том, что вы дважды вызываете exec_() в функции main():

def main():
    global form
    app = QtWidgets.QApplication(sys.argv)  
    form = MyApp()  
    form.show()
    app.exec_()
    sys.exit(app.exec_())

Первая строка app.exec_() запустит цикл событий, что означает, что функция main() остановится там, пока вы взаимодействуете с графическим интерфейсом. Когда вы закрываете окно верхнего уровня (или вызываете quit() в приложении), цикл событий останавливается, exec_() вернется, и функция main() продолжит работу.

Но следующая строка вызывает sys.exit(app.exec_()), который перезапускает цикл событий и снова приостанавливает функцию main(), включая вызов sys.exit(), который должен ждать возврата exec_(). Однако он будет ждать вечно, потому что теперь нет графического интерфейса, с которым можно было бы взаимодействовать, и поэтому вы ничего не можете сделать, чтобы остановить цикл событий, кроме принудительного завершения скрипта.

person ekhumoro    schedule 14.11.2015