我的場景如下:我正在使用pyqt小部件在第二個顯示器上顯示純色全屏,並使用連續捕捉圖像的相機觀察此顯示。我做一些處理與圖像,這是我很感興趣的數據。帶IPython中和matplotlib使用qt4agg後端像這樣從線性運行的控制檯應用程序中使用pyqt小部件
% ipython -pylab
# ... import PatternDisplay, starting camera
pd = PatternDisplay(); pd.show(); pd.showColor(r=255,g=255,b=255)
imshow(cam.current_image)
交互使用,當我現在需要在控制檯腳本中的類似行爲這個偉大的工程雖然:它應該顯示PatternDisplay小部件,捕獲圖像,而不是更改PatternDisplay上的顏色並拍攝新圖像等等。
現在的問題是,PatternDisplay從未在我的腳本中更新/重繪,可能是因爲PyQt從來沒有機會運行它的事件隊列。我沒有嘗試將腳本的線性工作部分移動到QThread中,因爲我無法再與另一個線程的PatternDisplay Widget進行通信。我嘗試複製ipython/matplotlib的實現,但我沒有完全理解它,它非常複雜 - 它避免了通過猴子修補運行QApplication主循環,並以某種方式將QT移動到它自己的線程中。然後,如果用戶輸入了新命令,則使用QTimer定期檢查。
是不是有一種簡單的方法來實現我想要做的事情?如果需要,我很樂意提供更多信息。謝謝你的幫助!
我看不出如何做到這一點:主應用程序任務永遠不會空閒,永遠不會控制qts主循環。我也不知道如何「暫停」主任務的流程,因爲它需要與qt小部件位於同一個線程中; afaik沒有相當於wx.Yield。 – SirVer
@SirVer:我建議你讓Qt的主循環成爲主要的應用程序任務,並讓它定期調用你的代碼。 GUI編程是標準腳本的不同方法。 IPython/matplotlib中的聰明東西是處理GUI,而不需要用戶進行心理變換。 –
謝謝托馬斯。我知道這是適當的行爲,我需要的是超出規範的東西。然而,由於我在這裏的範例基本上是一個'標準腳本',恰好在GUI中顯示定時圖像,我搜索了一種避免GUI範例的方法。我不確定這是否可能,看起來不是這樣。現在我會堅持從ipython -pylab裏面運行我的腳本。謝謝你的幫助! – SirVer