2013-05-22 134 views
0

我正在使用Pyside構建一個基於Qt的GUI。裏面誰有權訪問QMainWindow中(_theMainWindow)班這反過來通過執行Python/Pyside代碼不能順序執行?

def initiateScan(self): 
    self._theMainWindow.theScan.theScanProgress.show() 

訪問2個其他Qt控件(theScan & theScanProgress)我想show()最後一個特定的類這只是正常,出現theScanProgress小部件。

然而,當我再補充一點,使應用程序睡眠(和打印語句)的線,如下

def initiateScan(self): 
    self._theMainWindow.theScan.theScanProgress.show() 
    print("test") 
    time.sleep(3) 

程序似乎睡覺之前出現的小部件,即如果time.sleep(3)得到的之前執行self._theMainWindow.theScan.theScanProgress.show()

任何想法爲什麼會發生這種情況?

+0

你能告訴我們'theScanProgress'是什麼類型嗎? – tacaswell

+0

它是一個QDialog對象(使用QtDesigner創建並使用pyside-uic工具編譯爲一個.py文件 – pkaramol

回答

0

這是因爲處理gui事件的主循環。如果你不使用線程,你一次只能執行一個函數。我強烈懷疑show發出一個信號進入事件隊列,這個信號又被阻塞直到當前函數返回。

換句話說,Qt是事件驅動的,它一次只能執行一個事件。你曾打電話給initiateScan加入了一個事件到執行該函數的堆棧中(類似於你按下了一個按鈕,它發出了一個信號,然後觸發了該函數),並且該函數可以執行一些計算,改變內部狀態你的對象,並添加事件到堆棧。 show在下面做的是向它的所有孩子發出一個信號,讓他們向他們展示自己。要運行該代碼,它必須等待當前事件(睡眠時的函數)返回。在sleep期間,由於完全相同的原因,整個gui將無響應。

[我可能宰殺一些藝術的條款]進度部件的

+0

因此,在實踐中,事件序列是這樣的?:initiateScan被調用,然後show()發出信號放入一個隊列中,sleep(3)使進程進入休眠狀態,並且只有這樣show()實際上被處理了嗎?(或者我們應該說:從隊列中取消排隊)讓我也說通過調試器, ()以某種方式將程序帶到啓動GUI應用程序的主.py文件,更具體地說是app.exec_()調用。經過一番調查,這似乎是每個與GUI相關的方法調用的規則:所有這些將程序轉移到app.exec_() – pkaramol

0

show只安排的外觀。但是,由於您使用sleep阻止了主線程,所以主線程無法執行計劃的操作,直到您將其釋放。

你必須使用線程或找到另一種方式等待3秒鐘。