3

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

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

1 回答 1

2

如果你想要一个 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中的全部内容。

于 2013-08-24T20:29:56.507 回答