2013-08-24 40 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