![](/img/trans.png)
[英]Does an event loop keep running the program's code in PyQt/PySide?
[英]Where is the PyQt/PySide event-loop running?
如果我打開一個 Python 解釋器並輸入以下幾行:
from PyQt4 import QtGui
app = QtGui.QApplication([])
w = QtGui.QLineEdit()
w.show()
然后出現一個文本輸入小部件。 當我與口譯員互動時,我可以與它互動。 如果我附加了任何事件處理程序,它們也會被調用。
如果我做import time; time.sleep(10)
import time; time.sleep(10)
,Widget 將無響應 10 秒。
如果我運行app.exec_()
,該調用會阻塞,直到我關閉應用程序。
我的問題是:如果小部件已經在響應事件,那么運行app.exec_()
有什么意義? 有什么不同嗎? 這是否只是一種防止應用程序關閉的方法,同時仍然為 Qt 的事件循環提供服務( while True: pass
會導致事件循環阻塞,正如我們從time.sleep(10)
理解的那樣)
我還想了解 Qt 在哪里與 CPython 掛鈎,允許解釋器和 GUI 處於活動狀態。 我知道 Python 2(可能還有 3?)有一個所謂的PyOS_InputHook
機制,大約每秒調用 10 次。 IPython 使用它來運行 GUI(需要付出很多努力以每秒 10 次以上的速度處理 GUI 事件)。 當我實例化QApplication
時是否發生了同樣的事情? 如果是這樣,再次調用app.exec_()
當您在交互式會話中使用 PyQt/PySide 時,事件處理在后台自動設置,允許您直接與對象交互。 例如,您可以創建並顯示一個窗口,然后在窗口仍然可見時從 python shell 中向其添加其他小部件。 但是,此行為特定於交互式會話 - 它只是為了讓您可以輕松地進行實驗,而無需自己設置事件處理。
根據 PyQt 文檔, PyOS_InputHook
用於處理事件,而交互式解釋器正在等待用戶輸入(請參閱: 使用 Python Shell 中的 PyQt5 ) - 並且推測 PySide 也使用了類似的機制。
對於從腳本啟動的普通 PyQt/PySide 應用程序,您必須顯式調用app.exec_()
以啟動事件處理。 否則,腳本將在所有代碼執行完畢后立即退出(即就像任何其他 python 腳本一樣)。
(要更深入地了解 Qt 的事件處理,請參閱: 線程、事件、QObjects )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.