带有while循环的pyside qapplication exec



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

我的问题是,如果你这样运行它,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_()

如果您想要一个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_()

但这是一个糟糕的示例,因为您不应该在没有锁定等情况下在线程中使用全局可变变量……但这些都在文档中。

最新更新