lunes, 27 de diciembre de 2010

Internet Nokia 5130 (Claro Argentina)

Después de actualizar el firmware de este móvil, se me desconfiguró el internet y todo. La verdad que me cansé de buscar por internet para poner una buena configuración y sobre toda las cosas una configuración de internet gratis!
A esta última de momento no eh llegado. Ôò

Bueno, los pasos a seguir son:
Ingresamos a Menú -> Configuraciones -> Configuración -> Ajustes config. pers -> Agregar (Si ya hay alguno agregado, vamos a opciones y agregar nuevo) ->  Punto de acceso.

Punto de Acceso
Nombre de cuenta: Internet (Pueden poner el que quieran).
Config. puntos acceso ->
Portador de datos: Paquete de datos.
Config. de portador ->
Pto. acces. paq. datos: gprs.claro.com.ar.
Tipo de red: IPv4
Tipo de autentificación: Normal.
Nombre de usuario: clarogprs
Contraseña: clarogprs999 (deben ingresarla dos veces por verificación)

Luego regresan a Ajustes config. pers. y verán en una lista el nombre que seleccionaron para Nombre de cuenta, van a opciones y le dan a activar.

Ahora ingresamos a Menú -> Configuraciones -> Conectividad -> Paquete de datos -> Config. paq. datos -> Editar pto. acceso act.
Pto. acces. paq. datos: gprs.claro.com.ar

Y allí tendrían funcionando internet en su claro, aclaro, se consume crédito con esta configuración, pero no es mucho.

En cuanto haya alguna novedad de como poner internet gratis, subo la nota!

jueves, 9 de diciembre de 2010

Programación funcional en Python.

Según Wikipedia un lenguaje de programación funcional es: la programación funcional es un paradigma de programación declarativa basado en la utilización de funciones aritméticas que no maneja datos mutables o de estado.

Ahora bien, Python al ser un lenguaje multiparadigma, nos permite la aplicación de ciertas características de este modelo (PF).
Existen herramientas internas dentro de Python que funcionan teniendo en cuenta este paradigma. Ellas son: filter(), map(), reduce() y lambda.

Veamos un poco que nos dice la ayuda del intérprete.
>>> help(filter)
Help on built-in function filter in module __builtin__:

filter(...)
filter(function or None, sequence) -> list, tuple, or string

Return those items of sequence for which function(item) is true. If
function is None, return the items that are true. If sequence is a tuple
or string, return the same type, else return a list.

filter(func, secuencia) -> Esta función recibe dos parámetros, el primero es una función o None (que es el valor nulo de python) y el segundo una secuencia de valores (lista, tupla o cadena), la función nos retorna una secuencia del mismo tipo, esto quiere decir que si pasamos a secuencia una tupla nos retornara una ... (Adivinaron -¡muy bien!-), por cada func(x) que sea verdadero.

Ejemplo: Nos indica que números de una secuencia son pares. (def incognita retronet)


def incognita(x):
        return not x & 1
 
filter(incognita, range(50))

Ahora veamos que nos dice el intérprete de map()
>>> help(map)
map(...)
    map(function, sequence[, sequence, ...]) -> list
   
    Return a list of the results of applying the function to the items of
    the argument sequence(s).  If more than one sequence is given, the
    function is called with an argument list consisting of the corresponding
    item of each sequence, substituting None for missing values when not all
    sequences have the same length.  If the function is None, return a list of
    the items of the sequence (or a list of tuples if more than one sequence).

map(func, secuencia) -> Esta función retorna una lista con los resultados de aplicar cada elemento de la secuencia como argumento de func.

Ejemplo: 

def cuadrado(x):
        return x*x
 map(cuadrado, range(50))

El turno de reduce()
>>help(reduce)
reduce(...)
    reduce(function, sequence[, initial]) -> value
   
    Apply a function of two arguments cumulatively to the items of a sequence,
    from left to right, so as to reduce the sequence to a single value.
    For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
    ((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
    of the sequence in the calculation, and serves as a default when the

reduce(func, secuencia) -> Aplica una func de dos argumentos de forma acumulativa a cada elemento de la  secuencia, de izquierda a derecha, a fin de reducir la secuencia a un solo valor.

Por ejemplo: El resultado de la suma de una secuencia.
 
def suma(x+y):
        return x+x
 map(suma, range(50))

Este ejemplo es el mismo que sale en la documentación de la función, pero allí aplica la función lambda que la veremos a continuación.

>>>lambda

Con esta palabra clave se pueden crear pequeñas funciones anónimas para ser utilizadas siempre que se necesite un objeto función.
Nota: "Todo en Python es un objeto, por tal motivo se puede referenciar a este objeto función en una variable"

Ejemplo.

suma = lambda x, y: x + y

suma(2, 3)

lunes, 6 de diciembre de 2010

Shellcode en Python Ôò

hx = ['0x4c', '0x69', '0x6e', '0x75', '0x78', '0x20',
'0x41', '0x70', '0x75', '0x6e', '0x74', '0x65',
'0x73']

print ''.join(map(chr, map(lambda x: int(x, 16), xh )))

Breve introducción a la programación funcional con Python.

jueves, 2 de diciembre de 2010

Cuadro de mensaje. (Primeros pasos - PyQt4)

Por defecto, si clikeamos en el botón x en la
barra de título, el QWidget se cierra. Algunas
veces queremos modificar este comportamiento por
defecto. Por ejemplo, si tenemos un archivo abierto
en un editor para el cual hicimos algunos cambios.
Cuando cerramos este nos muestra un mensaje para
confirmar la acción.

####################################################
#!/usr/bin/python

import sys
from PyQt4 import QtGui

class MessageBox(QtGui.QWidget):

def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)

self.setGeometry(300, 300, 250, 150)

self.setWindowTitle('Cuadro de Mensajes')

def closeEvent(self, event):

reply = QtGui.QMessageBox.question(self, 'Mensaje', 'Deseas salir?',

QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

if reply == QtGui.QMessageBox.Yes:

event.accept()
else:
event.ignore()

app = QtGui.QApplication(sys.argv)
qb = MessageBox()

qb.show()
sys.exit(app.exec_())


####################################################

Si cerramos el QWidget, este se cierra.
Para modificar el comportamiento del widget necesitamos
reimplementar el controlador de evento closeEvent().

# reply = QtGui.QMessageBox.question(self, 'Message',
"Are you sure to quit?", QtGui.QMessageBox.Yes,
QtGui.QMessageBox.No)

Mostramos un cuadro de mensaje con dos botones (Yes o No).
La primera cadena de texto aparece en la barra de
título. La segunda cadena es un mensaje de texto
mostrado por el diálogo. El valor de retorno es
almacenado en la variable "reply".

# if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()

Aquí probamos el valor de retorno. Si cliqueamos el
botón Yes, aceptamos el evento que conduce a el cierre
de el widget y a la terminación de la aplicación. De
lo contrario ignoramos el evento de cierre.

Cerrando una ventana. (Primeros pasos - PyQt4)

La manera "obvia" de cómo cerrar una ventana es hacer
clic en el signo de x en la barra de título. En el
siguiente ejemplo, vamos a mostrar, cómo mediante
programación puede cerrar la ventana. Vamos a
referirnos brevemente a las señales y los slots.

El siguiente es el constructor de una QPushButton,
que utilizaremos en nuestro ejemplo.

## QPushButton(string text, QWidget parent = None)


El parámetroo texto es un texto que se mostrará en
el botón. El parent (padre) es el Widget en el que
ponemos nuestro botón. En este caso QWidget.

##################################################
#!/usr/bin/python

import sys
from PyQt4 import QtGui, QtCore

class QuitButton(QtGui.QWidget):
def __init__(self, parent=None):

QtGui.QWidget.__init__(self, parent)

self.setGeometry(300, 300, 250, 150)

self.setWindowTitle('Quit button')

quit = QtGui.QPushButton('Cerrar', self)

quit.setGeometry(10, 10, 60, 35)

self.connect(quit, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))

app = QtGui.QApplication(sys.argv)
qb = QuitButton()

qb.show()
sys.exit(app.exec_())


#####################################
# quit = QtGui.QPuchButton('Cerrar', self)
# quit.setGeometry(10, 10, 60, 35)

Creamos un botón y lo colocamos en el QWidget al
igual que hemos colocado en la posición al QWidget
en la pantalla.


# self.connect(quit, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))

PyQt4 maneja los eventos que se presenten en una
aplicación con un mecanismo de Señales (SIGNAL) y
Ranuras (SLOT). En este caso cuando hacemos click
sobre el botón se emite una señal de click, el SLOT
relacion a un objeto emisor, en este caso el botón,
con un objeto receptor (la aplicación) con la acción
a realizar dado dicho evento, en este caso cerrar la
aplicación (con el método quit())

El QtCore.QObject.Connect() método que conecta
signals con slots. En nuestro caso el slot es una
función predefinida de PyQt. La comunicación es
hecha entre dos objetos. Un emisor y un receptor. El
emisor es el botón y el receptor es el objeto
aplicación.

Centrando la ventana en la pantalla. (Primeros pasos - PyQt4)

El siguiente guión muestra como podemos centrar la
ventana en la pantalla de escritorio.

#!/usr/bin/python

import sys
from PyQt4 import QtGui

class Center(QtGui.QWidget):

  def __init__(self, parent=None):
      QtGui.QWidget.__init__(self, parent)

      self.setWindowTitle('Center')
      self.resize(250, 150)

      self.center()

  def center(self):

      screen = QtGui.QDesktopWidget().screenGeometry()
      size = self.geometry()

      self.move((screen.width() - size.width())/2, (screen.height() - size.height())/2)

app = QtGui.QApplication(sys.argv)
qb = Center()

qb.show()
sys.exit(app.exec_())

# self.resize(250.150)

Aquí cambiamos el tamaño del QWidget para ser 250px
de ancho y 150px de alto.

# screen = QtGui.QDesktopWidget().screenGeometry()

Calculamos la resolución de pantalla de nuestro
monitor.

# size = self.geometry()

Aquí obtemos el tamaño de nuestro QWidget.

# self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)

Aquí movemos la ventana al centro de la pantalla.

miércoles, 1 de diciembre de 2010

Una Python NINJA.

Me veo obligado a desarrollar algo para mi "integridad intelectual", broma-broma, y como me gusta desarrollar en python, porque es lo que entiendo y lo que realmente me gusta, encontré un ide que proporciona herramientas para simplificar el desarrollo en Python.
Su nombre es NINJA-IDE (from: "Ninja Is Not Just Another IDE").
- Es una plataforma integrada de desarrollo, especialmente diseñada para construir aplicaciones en Python.

Algunas características hasta el momento son:
  • Resaltado de sintaxis para: Python...
  • Marca las tabulaciones con pequeños puntos
  • Incluye una consola de Python
  • Permite abrir una carpeta, y la explora recursivamente para mostrar luego toda la estructura de la carpeta junto con los archivos Python, HTML, PNG Y JPG incluidos (una especie de detección automática de lo que podría ser un proyecto Python)
  • Funcionalidades de Abrir, Guardar y Guardar Como soportadas.
  • Nos muestra cuando un archivo ha sido modificado y también nos advierte al cerrarlo
  • Indentación automatica
  • F4: Oculta la consola
  • F11: Oculta todo excepto el editor
  • Permite visualizar las imagenes del proyecto dentro del mismo IDE abriendo una pestaña nueva
  • Cierre automatico de los simbolos: ', ", {, [ y (
  • Y algunos más...
Se puede decir que la versión de este programa todavía esta muy verde, pero tengo fé en que los muchachos que lo desarrollan van aportar sus conocimientos para que la aplicación crezca y crezca!

Para los que usen la aplicación hagan reportes de la misma cuando encuentren errores para ayudar a que se mejore!
DESCARGALO


Si sos desarrollador y tenes ganas de desarrollar un plugin para ayudar a estos locos te paso la dirección en donde tenes documentado el como crear plugin para este IDE. (Está en español, así que no tenes excusa!)


Crear plugin


¿Qué necesitas para poder ejecutar el ide?


Python >= 2.5
PyQt >= 4.6


Y para ejecutarlo sólo tenemos que descargarlo del enlace que está arriba (donde dice DESCARGALO), lo descomprimimos y luego en una consola nos situamos en la carpeta que hemos "descomprimido" y tecleamos...

python ninja.py

martes, 19 de octubre de 2010

IMSNIFF - Qué están conversando bajo tu red?

Imsniff captura el tráfico de mensajería instantánea en la red y es capaz de iniciar una sesión de conversaciones, listas de contactos, información de perfil, las notificaciones de correo electrónico entrantes, otros eventos de MSN, etc.
Lo que hace es usar la biblioteca
libcap para capturar paquetes de red relacionados con las conversaciones llevadas con el protocolo MSN.

INSTALACIÓN

Primero que nada descargar el programa desde su página.

DESCARGAR

Luego necesitamos descomprimirlo.
Este paso lo podemos hacer desde la consola o sobre el entorno gráfico, haganlo como más les guste. Yo voy a describir los pasos para hacerlo desde consola.

Abrimos una consola.
Ahora, suponiendo que el archivo se descargo en $HOME/Download, ingresamos a ese directorio.

cd $HOME/Download

Creamos una carpeta y metemos el archivo que descargamos, luego ingresamos a la carpeta que creamos.

mkdir imsniff; mv imsniff_0.04.tgz; cd imsniff

Y ahora descomprimimos.

tar zxvf imsniff_0.04.tgz

Cuando descomprimimos nos aparecen los siguientes directorios:

docs/ imsniff_0.04.tgz linux/ src/ windows/

En mi caso estoy utilizando Mandriva, una distribución de GNU/Linux, entonces como lo adivinaron debo entrar en el directorio linux.

Ingresamos a esa carpeta.

cd linux

Aquí dentro vamos a encontrar dos archivos.

build y imsniff

Ahora bien, para ejecutar imsniff necesitamos pasarle un parámetro, este es la interfaz de red que estamos utilizando. A esta interfaz la sacamos con el comando ifconfig

Ejemplo:

ifconfig

resultado del comando.
eth0 Link encap:Ethernet HWaddr 00:16:EC:4F:FE:F9 inet addr:10.0.0.3 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::216:ecff:fe4f:fef9/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:164734 errors:0 dropped:0 overruns:0 frame:0 TX packets:112490 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:215130686 (205.1 MiB) TX bytes:12192256 (11.6 MiB) Interrupt:23 Base address:0xe400
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:11 errors:0 dropped:0 overruns:0 frame:0 TX packets:11 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:716 (716.0 b) TX bytes:716 (716.0 b)

La interfaz que utilizo es la eth0.

Entonces ahora debemos ejecutar el comando.

./imsniff eth0

NOTA: Probablemente al ejecutar puede que te salga un error sobre una libcap0,
([root@localhost linux]# ./imsniff
./imsniff: error while loading shared libraries: libpcap.so.0: cannot open shared object file: No such file or directory) este es lo único que necesitas para correr el programa. Ingresas a instalar y quitar programa (Si estás en Mandriva) y en el buscador pones libcap. Puede que tengas instalados libcap1, pero este comando requiere de libcap0. Instalalo sin ningún problema.
Sino puedes descargarlo desde su web
Todos los pasos mencionados arriba hazlos como usuario root.

Aquí una captura de los resultados...


domingo, 26 de septiembre de 2010

Agenda en Bash

#!/bin/bash

#############################################################
#Agenda Personal v 0.1
#Autor: DnitraM
#Creado: mar 27 mar 2007 01.53.33 ART
#Copyleft
#############################################################
# Modificaciones de la version 1.0
# añadir nueva funcion para modificar la lista de contactos
# sacar los permisos de lectura-escritura si se esta usando
# el fichero donde alojamos los datos para mayor seguridad =)
#############################################################


#### Asignaciones ####

declare -a agen
contactos=${HOME}/.contactos.txt
titulo="Agenda Estudiantes de Ingenieria "


###########@@@@@@@@@@@@@@######### Declaracion de Funciones ###########@@@@@@@@@@@@@@#########

informacion () {

cat > /tmp/infaGenda.txt <<>
GNOME Documentation Project (ja! ya quiere)
GNU Fundation (Doble jaja)"

Traducido por: Todavia nadie, pero quien quiera hacerlo
que lo haga, sera un gusto ver esto en
otro idioma =)

Dedicada: Para <>
Y los muchachos del GULCAr

##### Licencia #####

Este programa es software libre; puede redistribuirlo
y/o modificarlo bajo los términos de la Licencia Pública
General de GNU tal como se publica por la Free Software
Foundation; ya sea la versión 2 de la Licencia,
o (a su elección) cualquier versión posterior.
Este programa se distribuye con la esperanza de que
le sea útil, pero SIN NINGUNA GARANTÍA; sin incluso la
garantía implícita de MERCANTILIDAD o IDONEIDAD
PARA UN PROPÓSITO PARTICULAR. Vea la Licencia
Pública General GNU para más detalles.

AYUDA
zenity --text-info --title "Creditos - $titulo" --filename=/tmp/infaGenda.txt && rm -f /tmp/infaGenda.txt

}


salir () {

chmod -rw $1 # FUNCION SALIR SACANDO LOS PERMISOS A EL FICHERO DE LOS CONTACTOS.
reset ; exit 0
}

llena () {

printf "Ingreso: " >> $contactos
date >> $contactos
printf "\n" >> $contactos

echo Nombre: ${agen[0]} >> $contactos
echo Apellido: ${agen[1]} >> $contactos # FUNCION QUE SE ENCARGA DE LLENAR AL FICHERO CO
echo Telefono: ${agen[2]} >> $contactos # CON LOS DATOS INGRESADOS EN LA FUNCION INCONTACTOS.
echo Celular: ${agen[3]} >> $contactos

printf "\n#-----------------------#\n\n" >> $contactos

zenity --question --title "$titulo" --text "Desea ingresar otro contacto? "

if [ $? -eq 0 ]; then

incontacto
else
menu
fi

}


incontacto() { # FUNCION INGRESE DE CONTACTOS #

agen[0]=`zenity --entry --title "$titulo" --text "Nombre" `
if [ $? -eq 0 ]; then
agen[1]=`zenity --entry --title "$titulo" --text "Apellido" `
if [ $? -eq 0 ]; then
agen[2]=`zenity --entry --title "$titulo" --text "Telefono" `
if [ $? -eq 0 ]; then
agen[3]=`zenity --entry --title "$titulo" --text "Celular" `
if [ $? -eq 0 ]; then

llena # LLEVAMOS EL CONTENIDO INGRESADO A LLENA
else # PARA SER GRABADOS EN EL ARCHIVO.

zenity --error --text="Interrumpio la operacion \
de ingreso de celular"
fi
else
zenity --error --text="Interrumpio la operacion \
de ingreso de Telefono"
fi
else
zenity --error --text="Interrumpio la operacion \
de ingreso de Apellido"
fi
else
zenity --error --text="Interrumpio la operacion \
de ingreso de Nombre"
fi

}



buscontacto () { # FUNCION BUSQUEDA DE CONTACTOS

local tmpbusqueda=/tmp/busqueda

bnombre=`zenity --entry --title "$titulo" --text "Ingrese el nombre a buscar: " `

if [ $? -eq 0 ]; then

grep -R -A 5 $bnombre $contactos > $tmpbusqueda # -A sirve para que le digamos cuantas lineas va a # mostrar en este # caso (5).
# -R Recursivo, Lee todos los archivos bajo el # directorio parado

if [ -s $tmpbusqueda ]; then

zenity --text-info --title "$titulo" --filename=$tmpbusqueda && rm -f $tmpbusqueda
else
zenity --error --title "$titulo" --text "Contacto no encontrado...\n"
fi

zenity --question --title "$titulo" --text "Desea buscar otro contacto? "

if [ $? -eq 0 ]; then

buscontacto
else
menu
fi

else

zenity --error --title "$titulo" --text "Porfavor ingrese el nombre del contacto que esta buscando...\n\n"
buscontacto
fi

}


menu () {

while true
do
ELECCION=`zenity --title="$titulo" --list --text="Seleccione una operacion a realizar de la lista."\
--radiolist --width="355" --height="290" --column="" --column="#" --column="Operacion"\
--column="Descripcion"\
false 1 "Altas" "Ingresar un contacto" \
false 2 "consulta" "Buscar un contacto" \
false 3 "Creditos" "Informacion de aGenda" \
false 4 "Salir" "Cerrar el programa"`

if [ $? -ne 0 ]; then

salir $contactos
else
case $ELECCION in

1) incontacto ;;
2) buscontacto ;;
3) informacion ;;
4) salir $contactos ;;

esac
fi
done
}

if [ -e $contactos ]; then
chmod +rw $contactos
menu
else
touch $contactos
menu
fi

lunes, 16 de agosto de 2010

Mostrando un texto de ayuda - (Primeros pasos - PyQt4

Podemos proporcionar un texto de ayuda para cualquiera de nuestros widget.

#!/usr/bin/python

import sys
from PyQt4 import QtGui

class Tooltip(QtGui.QWidget):
def __init__(self, parent=None):

QtGui.QWidget.__init__(self, parent)

self.setGeometry(300, 300,250, 150)

self.setWindowTitle('Tooltip')

self.toolTip()
self.setToolTip('This is QWidget widget')

QtGui.QToolTip.setFont(QtGui.QFont('Times',10))

app = QtGui.QApplication(sys.argv)
tooltip = Tooltip()

tooltip.show()
sys.exit(app.exec_())


Para este ejemplo mostraremos una descripción para un QWidget.
       self.setToolTip('This is QWidget widget')
Para crear un tooltip llamaremos al método setToolTip(). Se pueden utilizar formatos de textos para enriquecerlos.
        QtGui.QToolTip.setFont(QtGui.QFont('Times',10))
Debido a que el tipo de letra por defecto de QToolTip se ve mal, vamos a cambiarla.

viernes, 13 de agosto de 2010

Icono de la aplicación (Primeros pasos - PyQt4)

El ícono de la aplicación es una pequeña imagen que se muestra en la esquina superior izquierda de la barra de título.
En el siguiente ejemplo vamos a mostrar como lo hacemos con PyQt4. También vamos a introducir algunos nuevos métodos.

#!/usr/bin/python

import sys
from PyQt4 import QtGui

class Icon(QtGui.QWidget):

def __init__(self, parent=None):
    QtGui.QWidget.__init__(self, parent)

    self.setGeometry(300, 300, 250, 150)

    self.setWindowTitle('Icon')
    self.setWindowIcon(QtGui.QIcon('dado.png'))

app = QtGui.QApplication(sys.argv)
icon = Icon()

icon.show()
sys.exit(app.exec_())


El primer ejemplo está escrito bajo el paradigma de programación procedural. El lenguaje de programación Python soporta varios paradigmas de programación como por ejemplo: Procedural y Programación Orientada a Objetos (POO).
class Icon(QtGui.QWidget):

def __init__(self, parent=None):
    QtGui.QWidget.__init__(self, parent)


Las tres cosas más importantes en la programación orientada a objetos son: las clases, los métodos y los datos (atributos).
Aquí creamos una clase llamada Icon. La clase Icon hereda de la clase QtGui.QWidget. Esto significa que tenemos que llamar a dos constructores. El primero de ellos para la clase Icon y el segundo de ellos para la clase heredada.

self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Icon')
self.setWindowIcon(QtGui.QIcon('dado.png'))

Las métodos han sido heredados de la clase QtGui.QWidget.

  • El método setGeometry() hace dos cosas: Sitúa la ventana en la pantalla y ajusta el tamaño de la ventana.Los primeros dos parámetros son las posiciones x e y de la ventana. El tercero es la anchura y el cuarto es la altura de la ventana.
  • El último método ajusta el icono en la aplicación. Para hacer esto, tenemos que crear un objeto QIcon. QIcon recibe la ruta de acceso a nuestro icono que se muestra. (en este ejemplo tengo el ícono en el mismo directorio que el código, por ello es que no se especifíca la ruta del ícono.


jueves, 12 de agosto de 2010

Ejemplo Simple (Primeros Pasos - PyQt4)

El siguiente ejemplo es muy simple, muestra una pequeña ventana. Sin embargo podemos hacer mucho con esta ventana. Podemos cambiar el tamaño, maximizar y minimizar la misma.
PyQt4 es una conjunto de herramientas de altísimo nivel.


#!/usr/bin/python

import sys
from PyQt4 import QtGui


app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()

widget.resize(250, 150)
widget.setWindowTitle('Simple')


widget.show()


sys.exit(app.exec_())


Este código muestra una pequeña ventana en la pantalla.



Vamos a desglosar el código por parte para entender que hace cada una de las líneas.

# import sys
# from PyQt4 import QtGui

Aquí importamos los paquetes necesarios. Los widgets básicos (GUI) son localizados en el modulo QtGui.

# app = QtGui.QApplication(sys.argv)

Cada aplicación PyQt4 debe crear un objeto aplicación, éste objeto se encuentra en el módulo de QtGui.
El parámetro sys.argv es una lista de argumentos que ingresan desde la línea de comandos, es una manera que podemos utilizar para controlar el inicio de nuestros programas.

# widget = QtGui.QWidget()

El QWidget es la clase base de todos los objetos de interfaz de usuarios en PyQt4.

# widget.resize(250, 150)

El método resize() cambia el tamaño del widget. Es 250px de ancho y 150px de alto.


# widget.setWindowTitle('simple')

Aquí ponemos el título de nuestra ventana, éste se muestra en la barra de título.

# widget.show()

El método show() muestra el widget en la pantalla.

# sys.exit(app.exec_())

Finalmente, entramos en un mainloop de la aplicación. Los eventos se inician desde este punto.
El mainloop recibe los eventos desde el sistema de ventanas y despacha a los widgets de la aplicación.

Se pregunta por qué el método exec_ () tiene un guión? Porque el exec() es una palabra reservada de Python. Y así, exec_() se ha utilizado en su lugar.

martes, 10 de agosto de 2010

Python + Qt + 4 = PyQt4

Esto es una "pseudo-traducción" Ôò No soy muy bueno con el inglés, pero pretendo poner el mayor empeño para que lo expresado aquí sea claro y similar a lo que se explica en la siguiente dirección.
ZETCODE

  • Esto es un tutorial introductorio de PyQt4.
  • El propósito de este tutorial es para empezar con la caja de herramientas PyQt4.
  • El tutorial a sido creado y probado bajo GNU/Linux - distribución Mandriva.

Acerca de PyQt. (Wikipedia)

PyQt es un binding de la biblioteca gráfica Qt para el lenguaje de programación Python. La biblioteca
está desarrollada por la firma británica Riverbank Computing y está disponible para Windows, GNU/Linux y Mac OS X bajo diferentes licencias.
En agosto de 2009, tras intentar negociar con Riverbank Computing la liberación de PyQt bajo
licencia LGPL sin conseguirlo, Nokia, propietaria de Qt, libera bajo esta licencia un binding
similar, llamado PySide.


PyQt se implementa como un conjunto de módulos de python. Cuenta con más de 300 clases y casi 6000 funciones y métodos. Es un toolkit (caja de herramientas) multiplataforma. Corre en la mayoría de los sistemas operativos: Unix, Windows y Mac. Tiene dos tipo de licencias, esto le permite a los desarrolladores seleccionar entre la licencia GPL y la comercial. Anteriormente, la versión GPL sólo estaba disponible en Unix. A partir de la versión 4, la licencia GPL está disponible en todas las plataformas soportadas.

Debido a que hay una gran cantidad de clases disponibles, se han dividido en varios módulos.






El módulo QtCore contiene las funcionalidades básicas. Este módulo se utiliza para trabajar con tiempos, archivos y directorios, varios tipos de datos, flujos, urls, tipos mime, hilos o procesos.
El módulo QtGui contiene los componentes gráficos y las clases relacionadas. Este incluye por ejemplo botones, ventanas, barras de estados, barras de herramientas, desplazadores, mapas de bits, colores, fuentes, etc ...
El módulo QtNetwork contiene clases para programar redes. Estás clases permiten escribir clientes y servidores TCP/IP y UDP. Este hace que la programación de redes sea más fácil y más portable.
El módulo QtXml contiene clases para trabajar con archivos xml. Este módulo provee de implementaciones para ambas APIs SAX y DOM.
El módulo QtSvg proporciona clases para mostrar los contenidos de los archivos SVG. Scalabel Vertor Graphics (SVG) es un lenguaje para decribir gráficos de dos dimensiones y aplicaciones gráficas en XML. El módulo QtOpenGL se utiliza para renderizar gráficos 3D y 2D usando la librería OpenGL. El módulo permite la integración sin fisuras de la librería Qt GUI y la librería de OpenGL. El módulo QtSql proporciona clases para trabajar con base de datos.


Instalación de PyQt4

En Gnu/Linux vamos a realizar la instalación dependediendo de la distribución.
No se explica como instalar python, ya que este viene en todas las distribuciones GNU/Linux por defecto.

Debian - Ubuntu (aptitude)
Loguearnos como usuarios root en la consola

ponchito@ponchito$: su
password: #ingresamos nuestra contraseña.

Una vez registrados como root, ponemos en la consola.
[root@ponchito]# aptitude install pyqt4-dev-tools python-qt4 qt4-designer

Mandriva (urpmi)
Loarnos como usuarios root en la consola

bash-4.0$ su
password: #ingresamos nuestra contraseña.

Una vez registrados como root, ponemos en la consola.
[root@ponchito]#urpmi pyqt4-dev-tools python-qt4 qt4-designer



sábado, 20 de marzo de 2010

Tuxguitar no reproduce sonido.

Hace unos días instale TuxGuitar y cuando quise reproducir una melodía no salía el sonido.
Esto es solo cuestión de configurarlo, ya que no tiraba errores ni nada por el estilo.

Herramientas → Preferencias → Sonido.
En la pestaña que dice Puerto Midi está por default Midi Through (), cambiarla por Java Sound Synthesizer.


TuxGuitar