pyside qapplication exec with while循环

时间:2013-08-24 20:24:01

标签: python qt loops pyside

基本上我有一个程序将在PySide qt框架中创建一个基本的hello world程序。不同之处在于它在调用print("loop")之前的while循环中exec_()。在用户完成程序之前循环不会完成的问题,所以它只会在循环完成时调用exec_()

我的问题是,如果你这样运行,print("loop")将会运行,但窗口不响应,并且不显示“Hello,loop!”)。如果您在qt_app.exec_()下缩进while running:,则窗口将响应,但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_()

1 个答案:

答案 0 :(得分:1)

如果你想拥有一个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。< / p>