2015-01-21 111 views
3

如果我打開一個Python解釋器,然後輸入以下行PyQt事件循環在哪裏運行?

from PyQt4 import QtGui 
app = QtGui.QApplication([]) 
w = QtGui.QLineEdit() 
w.show() 

然後文本輸入控件出現。我可以在與口譯員互動時與其交互。如果我附加了任何事件處理程序,它們也會被調用。

如果我做的是import time; time.sleep(10),則控件在10秒內無響應。

如果我運行app.exec_(),該調用會阻塞,直到關閉應用程序。

我的問題是,如果Widget已經對事件做出響應,那麼運行app.exec_()有什麼意義?有什麼不同嗎?這是否只是一種防止關閉,同時還服務於Qt的事件循環(while True: pass將導致事件循環阻塞,因爲我們從做time.sleep(10)理解)應用程序的方式

我也想明白的地方的Qt已經勾搭成CPython的這允許解釋器和GUI活動。我知道Python 2(也可能是3?)有一個所謂的PyOS_InputHook機制,大概每秒調用10次。 IPython使用它來運行一個GUI(有很多努力來處理GUI事件的速度超過每秒10次)。當我實例化一個QApplication時是否發生同樣的事情?如果是這樣,請再次調用app.exec_()

+0

您使用的是什麼Python解釋器? IPython還是實際上直蟒蛇?如果您要將相同的代碼放在.py文件中並運行它,推測它不會得到相同的行爲? – 2015-01-21 07:07:23

+0

這與Python和IPython一起發生。如果我將代碼放入.py文件並將該文件導入到會話中,我會得到上述行爲。如果我'python script.py',腳本結束並且gui窗口幾乎立即消失。 – Gus 2015-01-21 08:58:24

回答

4

在交互式會話中使用PyQt/PySide時,事件處理在後臺自動設置,允許您直接與對象交互。因此,例如,您可以創建並顯示一個窗口,然後在窗口仍然可見的情況下,從python shell中向其中添加其他窗口小部件。但是,這種行爲是特定於交互式會話的 - 只有這樣才能讓您輕鬆實驗,而無需自行設置事件處理的麻煩。

我不知道這個魔法是如何實現的 - 而且我沒有興趣發現它,因爲它實際上與正常的PyQt/PySide應用程序的工作方式無關。這只是一個便於測試的開發工具。

對於從腳本啓動的正常PyQt/PySide應用程序,您必須必須顯式調用app.exec_()才能啓動事件處理。否則,腳本將在所有代碼執行後立即退出(即,就像其他任何python腳本一樣)。

編輯

有一個在PyQt的文檔,讓一點點的事情是如何工作的詳細信息部分:Using PyQt4 from the Python Shell