【发布时间】:2015-12-28 08:28:35
【问题描述】:
让我介绍一下我正在构建的应用程序的目标:我正在使用 PySide (Qt) 为 CFD 框架中使用的基于 fortran 的应用程序创建一个前端 GUI。 fortran 应用程序被编译为 *.exe 文件,并且在执行时,它会不断提供模拟的时间流逝和其他输出细节(当我从控制台启动它时,这些数据会不断出现,直到它完成)。
例如,如果我从控制台执行外部代码,我会得到
>> myCFDapplication.exe
Initializing...
Simulation start...
Time is 0.2
Time is 0.4
Time is 0.6
Time is 0.8
Time is 1.0
Simulation finished
>>
“Time is ..”和下一行之间有相当长的时间间隔。
GUI 的目的是为外部应用程序生成初始化文件,启动外部应用程序,最后为用户提供实时的计算输出信息(作为平面文本)。 在本网站的其他类似主题中,我已经能够使用以下代码从 Python 启动我的外部应用程序
import os, sys
import subprocess
procExe = subprocess.Popen("pru", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
while procExe.poll() is None:
line = procExe.stdout.readline()
print("Print:" + line)
但只有在执行完成时才会显示输出,而且整个 GUI 会冻结到那一刻。
如果可能,我想知道如何使用 Python 启动我的外部应用程序,实时获取输出并将其即时传递到 GUI。想法是使用函数“append(each_output_line)”在“TextEdit”对话框内的不同行中打印输出。
【问题讨论】:
-
不知道这是否适用于您的特定情况,但请尝试在应用程序的事件循环启动后运行该进程,然后定期调用
qApp.processEvents()轮询循环。 -
感谢您的回答!无论如何,我无法通过使用
QCoreApplication.processevent()使其工作。我在我的函数def startSimulation(self): procExe = subprocess.Popen("pru", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) while procExe.poll() is None: QCoreApplication.processEvents() line = procExe.stdout.readline() self.console.append(line)中以以下方式包含它你是不是这个意思? -
我认为“无法使其工作”意味着它仍然会阻塞?如果是这样,您可能必须将处理移至单独的线程,然后在有新输出时从线程发出自定义信号(SO 上有几十个问题显示如何在 PyQt/PySide 中执行此操作)。但是,也不能保证这会奏效 - 在这种情况下,您需要尝试 multiprocessing。
-
是的,它仍然处于阻塞状态。谢谢,我会继续阅读...如您所见,我是这方面的新手,但我仍在了解 python 和 GUI 编程。
标签: python qt user-interface pyside