【问题标题】:JavaFX show looping Python print outputJavaFX 显示循环 Python 打印输出
【发布时间】:2017-08-24 03:33:10
【问题描述】:

我在 JavaFX 中使用 FXML 构建了一个 GUI,用于运行一堆不同的 Python 脚本。 Python 脚本不断从设备收集数据并将其打印到控制台,因为它以大约 10 到 70 Hz 的频率循环收集,具体取决于正在运行的脚本,并且它们不会自行停止。

我希望最终用户能够单击我的 GUI 上的按钮来启动脚本并让他们看到输出。目前,我所做的最好的事情是使用Runtime.exec() 和命令"cmd /c start cmd /k python some_script.py",它会打开Windows 命令提示符,在其中运行python some_script.py,并保持命令提示符打开,以便您可以看到输出。这样做的问题是它只能在 Windows(我的操作系统)上运行,但我需要有通用的操作系统支持,并且它依赖于 Java 启动一个我听说不是很优雅的外部程序。

然后我尝试通过在 Java 中执行 python some_script.py 命令来解决这个问题,使用 BufferedReader 捕获进程输出,在 AnchorPane 中创建一个新的 JavaFX 场景,其中只有一个 TextArea 作为伪 Java 控制台,然后在该 TextArea 上调用 .setText() 以将脚本输出放入其中。

这有点工作,但我遇到了很多问题,因为 Python 代码正在进行Print() 调用,所以写入 JavaFX 控制台会跳到几十行的大块中,而不是逐行写入。另外,我得到了一堆NullPointerExceptionArrayIndexOutOfBoundsException 有点随机,因为Java 会正确地写几百行,然后抛出这些错误并冻结程序。我很确定这两个问题都是由于在如此高的数据速率下有太多数据导致BufferedReader 缓冲区和/或TextArea.setText() 缓存或类似的东西溢出。

我想知道我应该采取什么方法。我无法将 Python 代码迁移到 Java,因为它依赖于其他人的 Python 库来收集其数据。我是否应该尝试保持伪 Java 控制台的想法,看看我是否可以做到这一点?我是否应该返回从 Java 打开命令提示符窗口并运行 Python 脚本,然后添加对在 Mac 和 Linux 中使用终端执行相同操作的支持?有没有更好的方法我没有想到?让 Java 代码调用 Python 代码并处理其输出的想法是否令人作呕和可怕的想法?

如果您想查看任何代码(有很多)或者我是否可以澄清任何事情,请告诉我,我会尽力快速回复。谢谢!

【问题讨论】:

    标签: java python user-interface javafx console


    【解决方案1】:

    我的解决方案是仍然从 Java Processbuilder 调用 Python 代码,但使用 -u 选项,如 python -u scriptname.py 来指定无缓冲的 Python 输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多