2014-04-17 68 views
4

下面的代碼我有看起來類似的代碼:PyQt的:app.exec_()停止所有運行

app = QApplication(sys.argv) 
self.interface = Interface() 

# The figure 
self.fig = self.interface.fig 
self.ax = self.fig.add_subplot(111) 

self.interface.show() 
app.exec_() 

print 'this is not printed' 

的問題是,一旦app.exec_()執行,沒有什麼,直到我關閉彈出的窗口。

我該如何繼續運行代碼?

回答

5

這是打算。你需要做的是使用信號/插槽,Qt類中的代碼,或者在調用app.exec()之前產生線程。

信號和槽是使用Qt交互的事實上的方式。基本上信號是任何「事件」或自定義「事件」,插槽可以被認爲是「事件處理程序」。例如,當某人在GUI上點擊一個按鈕時,它會創建一個信號來查找連接到它的任何處理程序。您可以將每個信號連接一個,一個或多個插槽(甚至可以多次連接相同的插槽)! Here is a good reference這個在Python中。

編碼你的Qt類中通常意味着創建爲你做無用功插槽。記住你不想讓事件循環時間過長,所以如果你這樣做了一個新的線程。

提供給你的第三個選擇是分拆其他線程。要小心與線程中的Qt進行交互,如果你確實需要我們的信號和插槽。執行線程爲suggested in this SO

+0

我很抱歉,但我很新的這一點,所以你能不能請稍微詳細了我應該做的,或至少點我到一些網上例子解釋一下嗎? PyQt的例子很少,不幸的是... – cgf

+0

當然,正在努力。 – Jack

+0

太棒了,謝謝。 – cgf

3

app.exec_()不鎖定任何東西,它運行一個GUI事件循環,等待用戶操作(事件)並將它們分派到正確的小部件進行處理。它會這樣做,直到沒有頂層窗口打開;如果您至少保留了一個應用程序的頂層窗口,那麼exec()永遠不會返回,它不會(您的應用程序在系統關閉期間終止)。當沒有更多頂級窗口的應用程序清理並從exec()返回。此時,GUI不再處於事件循環中。

無論你想在exec()之後想要做什麼,它都可能會將它放在QThread或信號處理程序中(例如,您將連接到一個「Go!」按鈕;您將連接一個「取消」按鈕到關閉應用程序窗口的處理程序)。

您可以在exec()之後放置代碼,但它會非常不典型:如果出現任何問題,由於GUI不再可見,用戶不太可能看到問題,GUI應用程序通常不會打開控制檯終端其中,可能會被視爲錯誤,不會有通常是一個GUI應用程序控制臺(即你將通過pythonw.exe而不是python.exe運行的應用程序),或者你要打開一個新的窗口和exec()再次以顯示一個錯誤消息,並等待用戶單擊確定,銷燬消息窗口中的確定處理程序,以便app.exec()再次返回。

+0

gui啓動後是否有信號發出? –

+0

QApplication發出了十幾個信號,其中一個可能會訣竅(http://doc.qt.io/qt-5/qapplication.html)。 QMainWindow可能有一些事件方法(大多數在QWidget中定義)可以捕獲(通過覆蓋方法)。有關更多詳細信息,請在SO上發佈具體問題。 – Schollii

3

除了以前的答案,而不是在所有的窗口都關閉每次做的GUI事件循環,通過app.exec_()運行,停止。如果你想手動終止它,你可以在任何事件處理程序中使用app.quit()。它會停止GUI事件循環並在app.exec_()之後啓動您的代碼。

第一個答案是很多關於什麼的話。