sábado, 31 de enero de 2015

Groovy en ejemplos ... no. 6

Seguimos con la serie de ejemplos de código en Groovy. Una de las características de este lenguaje es que podemos añadir "extensiones" a una clase previamente definida.  Esto es definir nuevas funcionalidades por llamarlo de una manera.

Tenemos la siguiente clase:

class Ventana{
  int alto
}

Posee tan solo un atributo de tipo int (alto), pero si queremos agregarle un método/atributo (por ej. ancho) podemos hacerlo mediante  ExpandoMetaClass.

class Ventana{
  int alto
}

//main del programa
Ventana.metaClass.getAncho << {-> 200}
def ventana=new Ventana()

ventana.with{ alto=150 }
println "Alto: $ventana.alto"
println "Ancho:$ventana.ancho"


Con esto obtenemos métodos y atributos de manera dinámica.

En este ejemplo hacemos uso de las "bondades" de ExpandoMetaclass, agregamos nuevos métodos y propiedades a las clases previamente definidas

abstract class SuperHeroe{
abstract void volar()
}

abstract class Vigilante{
boolean tieneArmadura=false

boolean tieneAyudante=false
}

class Superman extends SuperHeroe{
int edad
void volar(){
println "Superman puede volar"
}
}

class Batman extends Vigilante{
String nombre
}

static main(args) {
Batman.metaClass.getEdad << {-> 39 }
Batman.metaClass.getAyudante << {-> "Robin"}

Superman.metaClass.getNombre << {-> "Clark Kent"}


def batman=new Batman(nombre:"Bruce Wayne")
def superman=new Superman(edad:38)

batman.with{
tieneArmadura=true

tieneAyudante=true
}

Batman.metaClass.verDatos << { println "nombre real: $nombre, edad: $edad, ayudante: $ayudante"}
Superman.metaClass.verDatos << {println "nombre real: $nombre, edad: $edad"}
superman.verDatos()
superman.volar()

if(batman.tieneAyudante && batman.tieneArmadura){
   batman.verDatos()

}

}



Esta funcionalidad nos permite agregar constructores, métodos o sobre escribirlos, etc.

sábado, 24 de enero de 2015

Groovy en ejemplos ... no. 5

"No importa cuan perfecto creas sea tu código siempre habrá alguien que le hallé un error"


En esta ocasión seguimos con la serie de ejercicios usando el lenguaje de programación Groovy.  Usaremos la librería javax.swing para crear aplicaciones gráficas.


1.  Generar un número aleatorio. Esta aplicación tendrá:
  1.  Dos botones JButton (Generar no. aleatorio y Salir)
  2.  Un JLabel que nos servirá de separador
Para generar el número aleatorio usaremos la clase Random.

Random rand=new Random()
aleatorio=(int)rand.nextInt(100)


/*aleatorio.groovy */

import java.awt.event.*
import java.awt.*

import javax.swing.JLabel
import javax.swing.JButton
import javax.swing.JFrame

import javax.swing.JOptionPane
import javax.swing.*



frame=new JFrame("Groovy en ejemplos ... no.5\n::codemonkeyjunior 2015::")
caja=Box.createVerticalBox()

btnCalcular=new JButton("<html><font color='red'>Generar</font> <font color='blue'>no. aleatorio</font></html>")
btnCalcular.addActionListener({
     Random rand=new Random()

     try {
         aleatorio=(int)rand.nextInt(100)
     }
     catch(Exception e) {
         JOptionPane.showMessageDialog(panel, "No se pudo generar el numero", "Error", JOptionPane.ERROR_MESSAGE);
     }finally{
         JOptionPane.showMessageDialog(null,"Numero aleatorio: "+String.valueOf(aleatorio))
     }

    } as ActionListener)

btnSalida=new JButton("<html>Desea <font color='red'> salir</font>?</html>")
btnSalida.addActionListener({

int seleccion = JOptionPane.showConfirmDialog(null,
                                  "Deseas cerrar la ventana?",
                                  "Seleccion",
                                  JOptionPane.YES_NO_OPTION);

if(seleccion==0){
    System.exit(0)
}



    }as ActionListener)

caja.add(btnCalcular)
caja.add(new JLabel("<html><br/><br/></html>"))
caja.add(btnSalida)
frame.contentPane.add(caja)
frame.setSize(450,150)
frame.visible=true
frame.defaultCloseOperation=JFrame.EXIT_ON_CLOSE


Ejecutamos:
Al dar clic sobre el botón "Generar no. aleatorio" saldrá este mensaje:


Al Dar clic sobre el botón "Desea salir?" saldrá:


2.En este ejemplo usaremos:
  •  Un JCheckBox
  •  Un JButton
El usuario elegirá entre tres opciones (Java, Python,y Groovy) y comprobará el resultado al dar clic al botón.

/*elegir.groovy*/

import javax.swing.*
import java.awt.event.*
import java.awt.*


def ventana(){
  frame=new JFrame(title: '::JCheckButton en Groovy::', size: [320,200], layout: new FlowLayout(), defaultCloseOperation: javax.swing.WindowConstants.EXIT_ON_CLOSE)

//podemos aplicarles estilo a los botones
  btnEjecutar=new JButton("<html><font color='blue'>Ejecutar</font></html>")
  btnEjecutar.setBackground(Color.white)
  btnEjecutar.setToolTipText("inicio...")
  btnEjecutar.addActionListener({
      miCheck1=new JCheckBox("<html><h2><font color='red'>Java</font></h2></html>")
      miCheck2=new JCheckBox("<html><h2><font color='green'>Python</font></h2></html>")
      miCheck3=new JCheckBox("<html><h2><font color='blue'>Groovy</font></h2></html>")

    


      panel=new JFrame(title: '::JCheckButton en Groovy::', size: [320,200], layout: new FlowLayout())
      miLabel=new JLabel("<html></html>")

      botonMostrar=new JButton("<html>Comprobar</html>")

      botonMostrar.addActionListener({
         if(miCheck1.isSelected() && miCheck3.isSelected() && miCheck2.isSelected()){
             miLabel.setText("elegiste los tres lenguajes")
         }else if(miCheck1.isSelected() && miCheck3.isSelected()){
             miLabel.setText("elegiste: Java y Groovy")
         }else if(miCheck1.isSelected() && miCheck2.isSelected()){
             miLabel.setText("elegiste: Java y Python")
         }
         else if(miCheck2.isSelected() && miCheck3.isSelected()){
             miLabel.setText("elegiste: Python y Groovy")
         }
         else if(miCheck2.isSelected()){
             miLabel.setText("elegiste: Python")
         }
         else if(miCheck3.isSelected()){
             miLabel.setText("elegiste: Groovy")
         }
         else if(miCheck1.isSelected()){
             miLabel.setText("elegiste: Java")
         }

         else{
             miLabel.setText("")
          }
      } as ActionListener)
    panel.add miCheck1
    panel.add miCheck2
    panel.add miCheck3
    panel.add miLabel
    panel.add botonMostrar

  

      try{
          panel.show()
      }
      catch(Exception ex){
          println "error en: "+ex.toString()
      }

      }as ActionListener)


  frame.add btnEjecutar
  frame.show()
}

ventana()
  //invocamos el método

Ejecutamos:
Al dar clic saldrán las opciones:

Y comprobamos:








martes, 6 de enero de 2015

Python: jugando con PyZenity (2da parte)


Seguimos con los ejemplos de componentes PyZenity.


7. Uso de un componente tipo List. Nos puede servir para crear una lista de artículos, en este ejemplo usamos un tipo "radiolist".
from PyZenity import *

def preguntar():
    if Question('Deseas continuar?'):
        main()
    else:
        exit()


def main():
    lista=List(["Selecciona","Heroe","Nombre"], title="Elige tu heroe", boolstyle="radiolist", editable=False, select_col="ALL", sep='|', data=[["","Batman","Bruce Wayne"],["","Spiderman","Peter Parker"]])
    print "longitud:",len(lista)

    if len(lista)==2:
        InfoMessage('Elegiste:'+str(lista[1]))
        preguntar()


if __name__ == '__main__':
    main()


Los encabezados: Selecciona, Heroe, y Nombre.
Los valores: radiolist, nombre del héroe, nombre de pila

Ejecutando:

Nos mostrará un mensaje tipo "alert" con la opción seleccionada.




8. También podemos crear una lista con tipo "checklist".
from PyZenity import *

def preguntar():
    if Question('Deseas continuar?'):
        main()
    else:
        exit()


def main():
    lista=List(["Selecciona","Heroe","Nombre"], title="Elige tu heroe", boolstyle="checklist", editable=False, select_col="ALL", sep='|', data=[["","Batman","Bruce Wayne"],["","Spiderman","Peter Parker"]])
    print "longitud:",len(lista)

    if len(lista)==2:
        InfoMessage('Elegiste:'+str(lista[1]))
        preguntar()

    if len(lista)==4:
        InfoMessage('Elegiste:'+str(lista[1])+" - "+str(lista[3]))
        preguntar()


if __name__ == '__main__':
    main()






Nos mostrará la siguiente ventanita:





9. Ahora un ejemplo con Progress.
from PyZenity import *

def main():
    progreso=Progress(text='Cargando información ...',percentage=0,auto_close=False,pulsate=False)
    progreso(10)
    progreso(20)
    progreso(30)
    progreso(40)


if __name__ == '__main__':
    main()


Para el próximo post crearemos una aplicación más usando esta librería.

viernes, 2 de enero de 2015

Python: juego del disparejo

Nuevamente vamos a emplear la librería PyZenity. En este ejemplo crearemos el juego del disparejo.

Definición: Tres personas lanzan (cada uno) una moneda, si caen las tres monedas en ÁGUILA O SOL nadie gana. Gana quien tenga la moneda diferente de las otras dos.

Ejemplo.

Hugo | Paco | Luis    | Ganador
SOL        SOL  ÁGUILA    El ganador es Luis


Hugo | Paco    | Luis   | Ganador
ÁGUIL ÁGUILA ÁGUILA  No hay ganador, las monedas son iguales






from PyZenity import InfoMessage
import random


def main():
    ganador=""
    result="JUEGO DEL DISPAREJO\n\n*******************"
    moneda=["SOL","AGUILA"]#simulamos una moneda con dos caras: AGUILA y SOL
    hugo,paco,luis="","",""#definimos tres jugadores

    #obtenemos valores aleatorios
    hugo=moneda[int(random.randrange(0,2))]
    paco=moneda[int(random.randrange(0,2))]
    luis=moneda[int(random.randrange(0,2))]

    result+='\nTurno de Hugo:'+str(hugo)
    result+='\nTurno de Paco:'+str(paco)
    result+='\nTurno de Luis:'+str(luis)

#las condiciones del programa
    if hugo==luis and hugo==paco:
        ganador="Las tres monedas son iguales, No hay ganador"
    elif hugo!=luis and hugo!=paco:
        ganador="El ganador es Hugo"
    elif paco!=luis and paco!=hugo:
        ganador="El ganador es Paco"
    else:
        ganador="El ganador es Luis"

    result+='\n*******************\n'+str(ganador)
    InfoMessage(result)


if __name__ == '__main__':
    main()




Resultado:

Links
http://www.solveet.com/exercises/Juego-del-disparejo/306