2015-11-13 354 views
1

當我在PyQt中關閉應用程序窗口時,控制檯仍然在後臺運行,並且python.exe進程存在,直到關閉控制檯。我認爲sys.exit(app.exec_())無法正常運行。PyQt線程在窗口關閉後仍然運行

Mainscript(這將打開Firstwindow):

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

Firstwindow

按下按鈕:

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()(建議here):

def main_window(): 
    return form 

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

爲什麼你連續兩次啓動應用程序?第二次調用'exec _()'時,它只會坐在那裏什麼也不做,因爲你已經關閉了主窗口,所以你將無法與之交互。擺脫第一個'app.exec _()'行。 – ekhumoro

+0

@ekhumoro這樣做的伎倆,你可以發佈它作爲一個答案。不過,我想知道我第二次打電話給exec的時候,因爲我不理解它。是不是exec告訴qt的引擎來處理程序的運行,然後我把exec放在sys.exit中告訴腳本在Qt這麼說的時候退出? – Prof

回答

2

的問題是,您呼叫exec_()main()函數兩次:

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

第一app.exec_()行將啓動一個事件循環,這意味着當你與gui交互時,main()函數將在那裏暫停。當您關閉頂層窗口(或在應用程序上調用quit())時,事件循環將停止,exec_()將返回,並且main()函數將繼續。

但下一行調用sys.exit(app.exec_()),這重啓事件循環,並暫停再main()功能 - 包括sys.exit()調用,它必須等待exec_()返回。但是,它將永遠等待,因爲現在沒有gui可以互動,所以除了強制終止腳本之外,沒有什麼可以做的來阻止事件循環。

+0

現在明白了,謝謝! – Prof

相關問題