Qt设计器实时显示python脚本的输出

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执行的输出,并

我正在尝试编写的应用程序有一些问题,因此我将从对所有交互的“总体”描述开始:

我有一个用Qt设计器编写的简单UI。这将启动一系列python脚本,这些脚本对某些文件执行不同类型的操作。所有操作都通过打印通知用户,但这是在命令行中发生的。 到目前为止,所有工程均按需要/预期进行

重要提示:有时需要用户输入:值或只是“按任意键”类型的内容。同样,在cmd行中也可以按预期工作

现在我想做的是将cmd行中python脚本中的所有信息添加到Qt设计器UI中

工作原理: 我能够获得python执行的输出,并将其显示在textEdit对象中

什么不起作用: UI仅在执行结束时更新,并且在脚本执行过程中不响应

我想有一行一行更新的ui作为文本进来,而不是作为批处理

我是如何做到的:

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'
现在忽略错误的格式,我想

  • 将此日志逐行显示,就像在Qt Designer UI的python中的cmd/debug一样,实时显示,而不阻塞/锁定UI

  • 找到一种方法将参数/输入值传递给正在执行的进程。我想我可能也需要定义stdin,但是如何将它从QtDesigner传递给进程是我无法理解的


  • 谢谢

    好吧,对于任何环顾四周的人来说,第一个问题已经解决了。 如何:

    删除了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读取数据是在一个线程中完成的。更加优雅和安全。 如果有人想知道确切的方法,只要问一下,我可以添加更多的代码示例