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, 31 de enero de 2015
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á:
- Dos botones JButton (Generar no. aleatorio y Salir)
- Un JLabel que nos servirá de separador
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
/*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
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
Suscribirse a:
Entradas (Atom)