2013-08-24 42 views
3

基本上我有一個程序將在PySide qt框架中創建一個基本的Hello World程序。不同之處在於它在調用exec_()之前在while循環中執行print("loop")。直到用戶完成該程序後,循環纔會完成,因此循環完成時只會調用exec_()pyside qapplication exec while while循環

我的問題是,如果你這樣運行,print("loop")會運行,但窗口不會響應,並且不顯示「Hello,loop!」)。如果您在while running:下縮進qt_app.exec_(),則該窗口將響應,但print("loop")僅在關閉窗口之前執行一次,並在關閉該窗口後僅執行一次。

我需要能夠讓主窗口響應多次打印「循環」到控制檯。

import sys 

from PySide.QtCore import * 
from PySide.QtGui import * 
qt_app = QApplication(sys.argv) 
label = QLabel('Hello, loop!') 
label.show() 

running = True #only set to False when user is done with app in the real code. 

while running: 

    #I am handling connections here that MUST be in continual while loop 
    print("loop") 

qt_app.exec_() 

回答

0

如果你想有一個GUI應用程序,你必須讓GUI事件循環接管主線程。

你的問題的解決方案是創建一個單獨的線程,當你讓qt事件循環接管主線程時將執行打印。

你的線程將在後臺運行,做它的東西,並且(因爲我將它設置爲守護進程)它將在應用程序完成時停止,或者running變量設置爲False

import sys 
import time 
import threading 

from PySide.QtCore import * 
from PySide.QtGui import * 
qt_app = QApplication(sys.argv) 
label = QLabel('Hello, loop!') 
label.show() 

running = True #only set to False when user is done with app in the real code. 

def worker(): 
    global running 
    while running: 
     #I am handling connections here that MUST be in continual while loop 
     print("loop") 
     time.sleep(0.5) 

thread = threading.Thread(target=worker) 
thread.setDaemon(True) 
thread.start() 

qt_app.exec_() 

但是,這是一個不好的例如,因爲你不應該在沒有鎖定,等等,等等等,在線程中使用全局可變的變量......但是,這一切都在docs

+0

我曾考慮過使用線程作爲最後的手段,因爲我認爲它是一個補丁而不是修復,也就是說,如果沒有其他「正確」的方式來處理它。別擔心,我沒有這樣的全局變量,所有東西都是在類中定義的,這僅僅是爲了構造目的。 – cellsheet

+0

因爲您必須將對主python線程的控制交給Qt事件循環,所以沒有其他「正確」方法。 –

+0

有沒有一種方法可以在該事件循環內設置代碼,或者它幾乎卡在它所在的位置? – cellsheet