为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java 按钮(Swing/GUI)上单击运行 python 代码?

如何在 Java 按钮(Swing/GUI)上单击运行 python 代码?

呼唤远方 2023-04-19 17:00:30
我用 Python 创建了一个程序,它可以打开网络摄像头并实时识别摄像头画面中的人脸。我觉得从我的 IDE 运行 python 代码看起来很粗糙。我想在用户单击我的 Java GUI 表单中的按钮时执行 python 代码。提前致谢!阿什温
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

一种肮脏的 hacky 方法是调用Runtime.exec("python command here")一个侦听器并将其附加到由此创建的进程。本文解释了与此技术相关的方法:https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html。一个粗略的例子如下:


button.setOnAction(event -> {

    Runtime runtime = Runtime.getRuntime();

    Process process = runtime.exec("python command");

    process.getOutputStream()  // add handling code here

});

但是,请考虑这是否是您真正想要做的事情。为什么不用 Python 创建用户界面。流行的 GTK GUI 库具有 Python 绑定(文档位于https://python-gtk-3-tutorial.readthedocs.io/en/latest/)。


或者考虑用 Java 编写人脸识别组件。如果您完全从头开始编写它,这可能会很困难,但如果使用像 OpenCV 这样的库,则可能有可用的 Java 绑定。


一般来说,如果不特别小心,跨语言交流是很困难的,而且很容易出错,所以请仔细考虑您是否需要这个确切的设置。


查看完整回答
反对 回复 2023-04-19
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

我想你可以使用

    Runtime rt = Runtime.getRuntime();
        Process pr = rt.exec(path + "XXX.py");

并等待py完成输出JSON格式,最后使用java rading你要做的JSON数据处理。


查看完整回答
反对 回复 2023-04-19
?
桃花长相依

TA贡献1860条经验 获得超8个赞

老实说,我猜上面给出的答案是正确的。只需在按钮事件中使用另一个线程,这样您的 Java 程序主线程就不必等到事情完成,并且可以防止 UI 冻结。


创建线程


public class MyRunnable implements Runnable {


           private String commandParameters = "";


           // Just Creating a Constructor 

           public MyRunnable(String cmd)

           {

                this.commandParameters = cmd;

           }


           public void run()

           {

             try

             {

               Runtime runtime = Runtime.getRuntime();

               // Custom command parameters can be passed through the constructor.

               Process process = runtime.exec("python " + commandParameters);

               process.getOutputStream();

             }

             catch(Exception e)

             {

                    // Some exception to be caught..

             }

           }   

}

在您的按钮事件中执行此操作


yourBtn.setOnAction(event -> {


   try{

     Thread thread = new Thread(new MyRunnable("command parameter string"));

     thread.start();

   }

   catch(Exception e)

   {

           // Some Expection..

   }


});

现在您的主线程不会冻结或等待命令执行完成。希望这能解决问题。如果你想将一些变量值传递给“python 命令”,只需在创建MyRunnable 类时让你成为一个构造函数,并将它作为参数传递给 MyRunnable 类的构造函数。


现在,当您单击该按钮时,这将运行一个新线程。这不会干扰您的主 UI 线程。


查看完整回答
反对 回复 2023-04-19
  • 3 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信