comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Jython: Mezclando Java y Python

  • 3 Respuestas
  • 5644 Vistas

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado Expermicid

  • *
  • Underc0der
  • Mensajes: 457
  • Actividad:
    0%
  • Reputación 0
  • _-Expermicid-_
    • Ver Perfil
  • Skype: expermicid.xd
« en: Agosto 04, 2013, 01:26:04 pm »
Algunos desarrolladores, por no decir muchos, han coincidido en que “programar en Java no es lo mismo que programar en Python”, o viceversa, “programar en Python no es lo mismo que programar en Java”. Hoy en día gracias a proyectos como Jython o JPype se puede usar lo mejor de cada lenguaje en una misma aplicación.

Introducción

Los avances dentro del desarrollo de herramientas relacionadas con los diversos lenguajes de programación libres y/o de código abierto en estos tiempos, a mi criterio, están dando lugar a la programación colaborativa entre mas de un lenguaje a través de las diferentes liberías, implementaciones, APIs, bindings o como se las quiera llamar.

¿Que es Jython?

Uno los casos comentados en la introducción es Jython, una implementación de Java sobre Python. Empezamos entonces dando una definición formal, clara y concisa de lo que es y lo que permite Jython, de acuerdo al libro La Guia Definitiva de Jython de la Editorial Apress:

Citar
` “Jython es una implementación del lenguaje Python para la plataforma Java ... Jython trae el poder del lenguaje Python hacia la Maquina Virtual de Java. Provee a los desarrolladores Java la habilidad de escribir de escribir código productivo y dinámico usando una sintaxis elegante. Asi mismo permite a los desarrolladores Python ganar ventaja de la utilidad de las librerias y APIs que la JVM (Maquina Virtual de Java) tiene para ofrecer”. `

El Caso de Uso: Usando Swing desde Python

Uno de los campos donde python ofrece diversidad de posibilidades y alternativas es la creación de GUIs para aplicaciones de escritorio, en donde a través de los “bindigns” respectivos podemos usar desde Tk**(Tkinter) pasando por **wxWindows y llegando hasta Gtk o Qt u otras alternativas. Ahora bien si nos trasladamos al mundo Java nos encontramos en cambio con únicamente dos posibilidades AWT o SWING, aunque existe SWT parte del proyecto eclipse y no viene incluido en el API estandar de la plataforma.

Entonces a más de uno pudo haberle surgido la interrogante de: Si se puede usar Swing en o desde python?. La respuesta es si, es por ello que en este articulo nos ocuparemos de dar una visión considerable de la aplicabilidad que tienen el poder usar Jython para permitir la creación de interfaces gráficas que incluyan widgets o componentes de las librerías Swing perteneciente a la plataforma Java con la sintaxis de Python.

A pesar de que podemos construir íntegramente toda una aplicación usando código Jython, existe la interesante posibilidad y ventaja de crear la GUI totalmente en Java aprovechando de esta manera las herramientas e IDEs que existen para generación automática de Interfaces gráficas de usuario, tal es el caso de NetBeans o Eclipse con el plugin Visual Editor por ejemplo.

Construyendo la Vista del Ejemplo

Para ejemplificar el uso de Swing en una aplicación Jython hemos escogido algo muy simple como el cálculo de edad de una persona dada su fecha de nacimiento a más de calcular el tiempo exacto que falta para su próximo cumpleaños.

Aunque la temática de la interfaz gráfica al igual que la aplicación en general es de muchísima sencillez, hemos decidido usar el IDE Netbeans con el fin de ejemplificar las ventajas de poder generar con la ayuda de asistentes la GUI en un lenguaje y el resto de componentes de la aplicación en otro lenguaje de programación.

Veamos ahora creación de la Interfaz Gráfica de Usuario con el asistente de Netbeans:



Vale la pena señalar que aprovechando las novísimas características de la versión 7 de Java hemos fijado a Nimbus como tema de presentación de Swing (javax.swing.plaf.nimbus.NimbusLookAndFeel) incluido en esta ultima versión, con el siguiente código dentro de la clase creada con el designer:

Código: Java
  1. private void fijarLookNimbusJava7(){
  2.         /* Set the Nimbus look and feel */
  3.         //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
  4.         /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
  5.          * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
  6.          */
  7.         try {
  8.             for (javax.swing.You are not allowed to view links. Register or Login info : javax.swing.You are not allowed to view links. Register or Login.getInstalledLookAndFeels()) {
  9.                 if ("Nimbus".equals(info.getName())) {
  10.                     javax.swing.You are not allowed to view links. Register or Login.setLookAndFeel(info.getClassName());
  11.                     break;
  12.                 }
  13.             }
  14.         } catch (You are not allowed to view links. Register or Login ex) {
  15.             java.util.logging.Logger.getLogger(Ventana.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  16.         } catch (You are not allowed to view links. Register or Login ex) {
  17.             java.util.logging.Logger.getLogger(Ventana.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  18.         } catch (You are not allowed to view links. Register or Login ex) {
  19.             java.util.logging.Logger.getLogger(Ventana.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  20.         } catch (javax.swing.You are not allowed to view links. Register or Login ex) {
  21.             java.util.logging.Logger.getLogger(Ventana.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  22.         }
  23. }

Por otro lado es necesario definir como propiedades (con los métodos set y get) a los componentes de la GUI (mostramos algunos, pero el ide ayuda a crearlos a todos de una manera rapida y sencilla):

Código: Java
  1. /**
  2.  * @return the btncalcular
  3.  */
  4. public javax.swing.You are not allowed to view links. Register or Login getBtncalcular() {
  5.     return btncalcular;
  6. }
  7.  
  8. /**
  9.  * @param btncalcular the btncalcular to set
  10.  */
  11. public void setBtncalcular(javax.swing.You are not allowed to view links. Register or Login btncalcular) {
  12.     this.btncalcular = btncalcular;
  13. }
  14.  
  15. /**
  16.  * @return the btnsalir
  17.  */
  18. public javax.swing.You are not allowed to view links. Register or Login getBtnsalir() {
  19.     return btnsalir;
  20. }
  21.  
  22. /**
  23.  * @param btnsalir the btnsalir to set
  24.  */
  25. public void setBtnsalir(javax.swing.You are not allowed to view links. Register or Login btnsalir) {
  26.     this.btnsalir = btnsalir;
  27. }
  28.  
  29. /**
  30.  * @return the spnanio
  31.  */
  32. public javax.swing.JSpinner getSpnanio() {
  33.     return spnanio;
  34. }
  35.  
  36. /**
  37.  * @param spnanio the spnanio to set
  38.  */
  39. public void setSpnanio(javax.swing.JSpinner spnanio) {
  40.     this.spnanio = spnanio;
  41. }
  42.  

Una vista previa de la vista de la aplicación generada en la clase java gui.Ventana:



Programando la lógica de la aplicación en Python

Para generalizar la solución del problema relacionado con el cálculo de la edad, hemos reducido la lógica central a una resta de fechas de acuerdo a nuestro calendario. Antes de mostrar el código en Python mostraremo la lógica del algoritmo utilizado.

Aunque pueden haber muchas otras soluciones usando por ejemplo la clase datetime.timedelta hemos escogido usar un algoritmo que sea lo más generalizado para este tipo de situaciones. Así, si queremos saber el tiempo que hay entre las fechas 2011-08-12 y 1975-09-13, el procedimiento que aplicamos es:



Cuando el día es negativo aumentamos uno al mes de la fecha menor y lo restamos del numero total de días del mes anterior de la fecha mayor, en este caso 31 (por el mes 07 es decir Julio). Asi mismo si el mes resulta negativo le sumamos uno al año de la fecha mayor y lo restamos de 12 para obtener el mes real resultante.

Ahora el código en Python:

Código: Python
  1. # Archivo: logic.py
  2. def restarfechas(fecha1, fecha2):
  3.     """
  4.    Resta dos objetos datetime.date, el menor del mayor
  5.    Devuelve una tupla con el numero de anios, meses y dias
  6.    """
  7.     f1,f2 = max(fecha1,fecha2),min(fecha1,fecha2)
  8.     dias = f1.day - f2.day
  9.     # se devuelve 1 a los meses en caso de ser negativos los dias
  10.     f2 = f2.replace(month = f2.month + 1 if dias < 0 else f2.month)
  11.     # numero de dias que tiene el mes anterior de la primera fecha
  12.     if f1.month == 1:
  13.         dias_mes_anterior = calendar.monthrange(f1.year-1,12)[1]
  14.     else:
  15.         dias_mes_anterior = calendar.monthrange(f1.year,f1.month-1)[1]
  16.     dias = dias_mes_anterior + dias if dias < 0 else dias
  17.     meses = f1.month - f2.month
  18.     # se devuelve 1 a los anios en caso de ser negativos los meses
  19.     f2 = f2.replace(year = f2.year + 1 if meses < 0 else f2.year)
  20.     meses = 12 + meses if meses < 0 else meses
  21.     anios = f1.year - f2.year
  22.     return (anios, meses, dias)

De esta manera entonces reduciremos el cálculo de la edad y del tiempo del próximo cumpleaños prácticamente a una simple resta de fechas:

Código: Python
  1. def edad(nacimiento):
  2.     """ Devuleve la edad en una tupla de anios, meses y dias """
  3.     hoy = datetime.date.today()
  4.     return restarfechas(hoy,nacimiento)
  5.  
  6. def cumpleanios(nacimiento):
  7.     """ Devuelve el tiempo restante para el siguiente cumpleanios """
  8.     hoy = datetime.date.today()
  9.     cumpleanios = datetime.date(hoy.year,nacimiento.month,nacimiento.day)
  10.     if cumpleanios < hoy:
  11.     cumpleanios = cumpleanios.replace(year = hoy.year + 1)
  12.     faltan = restarfechas(cumpleanios,hoy)
  13.     return (faltan[1],faltan[2])

Enlazando las partes de la aplicación con Jython

Finalmente enlazamos todo el escenario con un script en el cual básicamente creamos los manejadores Swing o AWT para que procesen los eventos y las interacciones del usuario interconectando con la lógica ya programada en Python puro.

Mostramos la clase principal por decirlo así, en donde creamos la GUI y registramos los manejadores de eventos, evidenciando además el uso de las librerías de la JVM, lo cual puede ser interpretado por Jython:

Código: Python
  1. # Archivo: aplicacion.py
  2. from java.awt.event import ActionListener
  3. from javax.swing.event import ChangeListener
  4. from javax.swing import JOptionPane
  5. from java.lang import Integer
  6.  
  7. import datetime, calendar
  8.  
  9. import gui, logic
  10.  
  11. class Aplicacion:
  12.  
  13.     form = None
  14.  
  15.     @staticmethod
  16.     def run():
  17.         Aplicacion.form = gui.Ventana()
  18.         Aplicacion.form.visible = True
  19.         Aplicacion.form.btnsalir.addActionListener(ManejadorSalir())
  20.         Aplicacion.form.spnmes.addChangeListener(ManejadorMes())
  21.         Aplicacion.form.btncalcular.addActionListener(ManejadorCalcular())

Para muestra el manejador de eventos que ejecuta el calculo de la edad:

Código: Python
  1. class ManejadorCalcular(ActionListener):
  2.     def actionPerformed(self,ev):
  3.         mesint = Aplicacion.form.spnmes.model.list.indexOf(Aplicacion.form.spnmes.value) + 1
  4.         fecha_n = datetime.date(Aplicacion.form.spnanio.value,mesint,Aplicacion.form.spndia.value)
  5.         edad = logic.edad(fecha_n)
  6.         nombre = '%s %s' % (Aplicacion.form.txtnombres.text,Aplicacion.form.txtapellidos.text)
  7.         msg1 = '%s tiene %d anios %d meses %d dias' % (nombre,edad[0], edad[1], edad[2])
  8.         JOptionPane.showMessageDialog(None, msg1)
  9.         cumple = logic.cumpleanios(fecha_n)
  10.         meses,dias = cumple[0],cumple[1]
  11.         if meses == 0 and dias == 0:
  12.             msg2 = 'Hoy es su cumpleanios.  Felicitaciones :)'
  13.         else:
  14.             msg2 = 'Faltan %d meses %d dias para su cumpleanios' % (cumple[0],cumple[1])
  15.         JOptionPane.showMessageDialog(None, msg2)
  16.  

A continuación unas muestras de la ejecución de la aplicación (si la fecha actual es 18 de agosto del 2011) que se debe ejecutarse con:

Código: You are not allowed to view links. Register or Login
miltonlab@debianlab:~/edadjpy$ jython aplicacion.py
Ventana inicial



Presentación de la edad



Tiempo restante para el cumpleaños



Autor: Milton Labanda
Fuente: You are not allowed to view links. Register or Login

Saludos

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5335
  • Actividad:
    21.67%
  • Reputación 30
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« Respuesta #1 en: Agosto 04, 2013, 02:12:07 pm »
Muy buena Expermicid! Segui asi!!!!
Para el blog! You are not allowed to view links. Register or Login

Saludos!
ANTRAX


Desconectado KarenMM

  • *
  • Underc0der
  • Mensajes: 1
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: karen2306
« Respuesta #2 en: Enero 16, 2018, 06:36:08 pm »
Hola, soy nueva en el tema y quisiera saber si tuviste que instalar algún paquete para Java.
Gracias ;)

Desconectado gugadev

  • *
  • Underc0der
  • Mensajes: 7
  • Actividad:
    0%
  • Reputación 0
  • Software Engineer
    • Ver Perfil
  • Skype: guzgki
  • Twitter: gugadev
« Respuesta #3 en: Enero 17, 2018, 09:09:59 pm »
You are not allowed to view links. Register or Login
Hola, soy nueva en el tema y quisiera saber si tuviste que instalar algún paquete para Java.
Gracias ;)

Jython es técnicamente una implementación de las APIs de Java para el intérprete Python. Debes You are not allowed to view links. Register or Login e instalarlo (ejecutando el .jar); en caso no se agregue el directorio de instalación al PATH debes agregarlo manualmente. Para ejecutar los ejemplos, ubícate en la terminal en el directorio y ejecuta:

Código: You are not allowed to view links. Register or Login
jython archivo.py
Ten en cuenta que es un proyecto prácticamente muerto (la última release fue en el 2015). Te recomiendo ir con Python (3).
Cuanto más duro trabajas, más difícil es rendirse.

 

¿Te gustó el post? COMPARTILO!



Encuesta en plataforma web : PHP vs Python & Django

Iniciado por Rootscale

Respuestas: 4
Vistas: 4135
Último mensaje Agosto 23, 2012, 03:39:39 pm
por Sanko
Php VS Ruby VS Python

Iniciado por k0ws

Respuestas: 6
Vistas: 3688
Último mensaje Abril 30, 2013, 12:55:47 pm
por Raymond_202
[Haskell] Compilador de Pseudocodigo Pascal,C++,Java

Iniciado por Snifer

Respuestas: 0
Vistas: 2093
Último mensaje Julio 23, 2011, 07:19:34 pm
por Snifer