2011-07-04 46 views
0

我的場景如下:我正在使用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定期檢查。

是不是有一種簡單的方法來實現我想要做的事情?如果需要,我很樂意提供更多信息。謝謝你的幫助!

回答

2

你需要的是比IPython的工作更容易 - IPython使Qt應用程序和命令行同時交互。

認爲在Qt中做這件事的方法是使用一個定時器,定時觸發,並將信號連接到代表你的函數的'slot',該函數獲取新圖像並將其放入widget中。所以你從事件循環中取而代之,而不是試圖推動它。

我還沒有使用過Qt,所以我不能提供具體細節,但是我越多考慮它,越是認爲這是正確的方式。

+0

我看不出如何做到這一點:主應用程序任務永遠不會空閒,永遠不會控制qts主循環。我也不知道如何「暫停」主任務的流程,因爲它需要與qt小部件位於同一個線程中; afaik沒有相當於wx.Yield。 – SirVer

+0

@SirVer:我建議你讓Qt的主循環成爲主要的應用程序任務,並讓它定期調用你的代碼。 GUI編程是標準腳本的不同方法。 IPython/matplotlib中的聰明東西是處理GUI,而不需要用戶進行心理變換。 –

+0

謝謝托馬斯。我知道這是適當的行爲,我需要的是超出規範的東西。然而,由於我在這裏的範例基本上是一個'標準腳本',恰好在GUI中顯示定時圖像,我搜索了一種避免GUI範例的方法。我不確定這是否可能,看起來不是這樣。現在我會堅持從ipython -pylab裏面運行我的腳本。謝謝你的幫助! – SirVer

1

我解決了同樣的問題(在終端即交互式的IPython控制檯,並獨立運行的GUI線程)通過以下方式與IPython的0.10(代碼here) 11.構建QApplication對象,但並沒有明確進入事件循環 2.運行嵌入式IPython實例 3.通過實例化窗口並調用show()(如hereyade.qt.Controller(),我將其別名爲F12(我沒有找到方法)嵌入式shell在會話開始時運行命令,就好像用戶鍵入了它一樣)

(You也可以先用你的窗口show(),然後運行嵌入式ipython。它會爲Qt提供事件循環)。

(順便說一句,我也嘗試從後臺線程運行Qt4(同時使用python線程模塊和Qt4.QThreads),但它拒絕以這種方式固執地運行。麻煩去那邊。)

缺點是當ipython忙時UI會被阻塞。我希望爲0.11找到更好的東西,它應該有更好的線程設備(關於如何取消阻塞UI的我asked on ipython-users)。

HTH,v。

+0

謝謝!你知道如何在沒有ipython的依賴的情況下做到這一點嗎?我想在GUI上顯示我的圖像,但保持程序的線性流動性,因爲它更易於閱讀和理解。 – SirVer

+0

我認爲如果您不需要交互式命令行,您可以創建常規QApplication並生成背景QThread進行數據採集和分析,而主UI線程將定期更新這些數據中的圖像。你只需要確保一致性,這樣你就不會顯示半舊的半新數據,如果你按順序在一些循環中更新它們。 – eudoxos

相關問題