如何在Java Button(Swing / GUI)click上运行python代码?

时间:2019-07-25 08:56:49

标签: java python swing

我用Python创建了一个程序,该程序可打开网络摄像头并实时识别在摄像头框架中找到的脸部。我觉得从我的IDE中运行python代码看起来不完美。当用户单击Java GUI表单中的按钮时,我想执行python代码。

谢谢!, 阿什温

3 个答案:

答案 0 :(得分:1)

执行此操作的一种肮脏的方法是调用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绑定可用。

通常,如果没有特别的照顾,跨语言的交流将非常困难且容易出错,因此请仔细考虑是否需要这种精确的设置。

答案 1 :(得分:0)

我认为您可以使用

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

参考: https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

并等待py完成输出JSON格式, 最后使用您要执行的Java rading JSON数据处理。

答案 2 :(得分:0)

老实说,我想上面给出的答案是正确的。 只需在button事件中使用另一个线程,您的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线程混淆。