Mélange Java et Python

cs_viktor76 Messages postés 11 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 13 novembre 2009 - 8 nov. 2009 à 19:09
cs_viktor76 Messages postés 11 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 13 novembre 2009 - 13 nov. 2009 à 07:48
Bonjour, j'essaye de créer une application Java qui appel du Python. L'application est assez simple je veux entrer un nombre et une fois cliquer sur le bouton qu'il fasse le nombre * 2 qui est dans le python et afficher le résultat


Fenetre.java
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
 
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
 
import org.python.core.PyObject;
import org.python.core.PyString;
import org.python.core.imp;
 
 
 
 
public class Fenetre extends JFrame {
        

        private JPanel container = new JPanel();
        private JFormattedTextField nombre = new JFormattedTextField(NumberFormat.getIntegerInstance());
        private JFormattedTextField resultat = new JFormattedTextField(NumberFormat.getIntegerInstance());
        private JLabel label = new JLabel("Table de :");
        private JButton b = new JButton ("OK");
        private PyObject Exemple;
        
        
        protected void AppelPy() {
    		// chargement table.py module                              
    		PyObject findMod = imp.importName("table", true); 
    		// prend la "class table"
    		PyObject ClassTable = findMod.__getattr__("table");
    		// crée une instance
    		Exemple = ClassTable.__call__();
    	}
        
        public void ConstruitPy() {
    		//construit PY
    		PyObject res;
    		res = Exemple.invoke("tableX",new PyString(nombre.getText()));
    		res = Exemple.invoke("resultat",new PyString(nombre.getText()));
    	}
        
        public Fenetre()
        {
 
        this.setTitle("Table de N");
        this.setSize(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
 
        container.setBackground(Color.white);
        container.setLayout(new BorderLayout());
               
        JPanel top = new JPanel();        
        
        Font police = new Font("Arial", Font.BOLD, 14);
        nombre.setFont(police);
        nombre.setPreferredSize(new Dimension(150, 30));
        nombre.setForeground(Color.BLUE);
        
        
        b.addActionListener(new BoutonListener());
        
        top.add(label);
        top.add(nombre);
        top.add(b);
                
       
        this.setContentPane(top);
        this.setVisible(true);            
        }       
        
        class BoutonListener implements ActionListener{
        	
                public void actionPerformed(ActionEvent e) 
                {
                	JOptionPane jop = new JOptionPane();
                	jop.showMessageDialog(null, "Le résultat est " + nombre.getText(), "Résultat", JOptionPane.INFORMATION_MESSAGE);
 
                }
                
        }
}
 


 
table.py
#! /usr/bin/python
# -*- coding: ISO-8859-1 -*-
class table:
    def tableX(n):
        print n * 2,
        
    def resultat:
        print tableX(n),


Pour le moment j'affiche juste nombre.getText() mais je voudrai à la place qu'il fasse le python et que j'affiche le résultat mais je ne sais pas comment faire si quelqu'un peut m'aider svp ou me donner un tuto... je suis preneur.
A voir également:

2 réponses

cs_RedDog Messages postés 50 Date d'inscription lundi 7 avril 2003 Statut Membre Dernière intervention 21 août 2013
13 nov. 2009 à 04:24
Pour pouvoir au mieux utiliser Jython, il faut que tu utilises l'API Scripting (JSR 223).
1. Télécharger Jython (si c'est pas déjà fait)
2. Le lier au projet (insérer les librairies JAR dans les librairies de compilation du projet)
3. Importer dans ta classe l'api scripting :
import javax.script.*;

4. Passer l'expression/le script à évaluer dans la fonction.
Exemple avec Ruby (c'est presque pareil pour tous) :
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine rubyEngine = m.getEngineByName("jruby");
Invocable inv = (Invocable)rubyEngine;
String path = "C:\\Mes projets\\Java\\sample.rb";
rubyEngine.getContext().setAttribute("label", new String(""),
                ScriptContext.ENGINE_SCOPE);
try{
    // Load the script
    rubyEngine.eval(new java.io.FileReader(path));
} catch (java.io.FileNotFoundException fnfe){
    fnfe.printStackTrace();
} catch (ScriptException e) {
    e.printStackTrace();
}


Je peux pas donner d'exemple concret en Jython vu que je ne l'ai fait que sur JRuby avec des interactions de fonctions très sympa au final, mais la logique est à peu près celle là en scripting, renseigne-toi sur l'API. Par exemple ici.
0
cs_viktor76 Messages postés 11 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 13 novembre 2009
13 nov. 2009 à 07:48
Merci de m'avoir répondu, j'ai réussi à faire marcher mon application Java et Python. Je vais voir pour faire un tuto pour les débutant sur un site avec des applications Java qui font appellent à du Python
0
Rejoignez-nous