基本上我有一个程序将在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_()
答案 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>