Qt设计器实时显示python脚本的输出
我正在尝试编写的应用程序有一些问题,因此我将从对所有交互的“总体”描述开始: 我有一个用Qt设计器编写的简单UI。这将启动一系列python脚本,这些脚本对某些文件执行不同类型的操作。所有操作都通过打印通知用户,但这是在命令行中发生的。 到目前为止,所有工程均按需要/预期进行 重要提示:有时需要用户输入:值或只是“按任意键”类型的内容。同样,在cmd行中也可以按预期工作 现在我想做的是将cmd行中python脚本中的所有信息添加到Qt设计器UI中 工作原理: 我能够获得python执行的输出,并将其显示在textEdit对象中 什么不起作用: UI仅在执行结束时更新,并且在脚本执行过程中不响应 我想有一行一行更新的ui作为文本进来,而不是作为批处理 我是如何做到的:Qt设计器实时显示python脚本的输出,python,multithreading,python-3.x,subprocess,qt-designer,Python,Multithreading,Python 3.x,Subprocess,Qt Designer,我正在尝试编写的应用程序有一些问题,因此我将从对所有交互的“总体”描述开始: 我有一个用Qt设计器编写的简单UI。这将启动一系列python脚本,这些脚本对某些文件执行不同类型的操作。所有操作都通过打印通知用户,但这是在命令行中发生的。 到目前为止,所有工程均按需要/预期进行 重要提示:有时需要用户输入:值或只是“按任意键”类型的内容。同样,在cmd行中也可以按预期工作 现在我想做的是将cmd行中python脚本中的所有信息添加到Qt设计器UI中 工作原理: 我能够获得python执行的输出,并
class my_ui(QtWidgets.QMainWindow):
...
def button_pressed
self.__process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
while self.__process.poll() is None:
line = self.__process.stdout.readline()
print(line)
def main(self):
...
self.console_output_to_ui()
def write(self, text):
self.ui.textEdit.append(text)
def console_output_to_ui(self):
sys.stdout = self
现在,我获取的输出如下所示:
....
b"evaluate_condition(): '4'\r\n"
# time delay 1s
b"evaluate_condition(): '5'\r\n"
# time delay 1s
b"evaluate_condition(): '6'\r\n"
....
evaluate_condition(): '6'
evaluate_condition(): '7'
evaluate_condition(): '8'
evaluate_condition(): '9'
现在忽略错误的格式,我想
谢谢 好吧,对于任何环顾四周的人来说,第一个问题已经解决了。 如何: 删除了sys.stdout highjack并将其替换为线程写入(同时删除了不需要的写入函数,与控制台输出及其调用相同): 这样,在ui文本编辑中,我有一个如下所示的日志:
....
b"evaluate_condition(): '4'\r\n"
# time delay 1s
b"evaluate_condition(): '5'\r\n"
# time delay 1s
b"evaluate_condition(): '6'\r\n"
....
evaluate_condition(): '6'
evaluate_condition(): '7'
evaluate_condition(): '8'
evaluate_condition(): '9'
它会像cmd窗口输出一样逐行更新
现在正在研究问题2的解决方案,第二个问题已修复
process.stdin.write(my_input_data + '\n')
process.stdin.flush()
这会将其发送到子流程
最后,虽然从子流程读取数据和从UI读取数据是在一个线程中完成的。更加优雅和安全。
如果有人想知道确切的方法,只要问一下,我可以添加更多的代码示例