viernes, 26 de diciembre de 2014

wxPython - Cargar imágenes en Base64

Otro resultado de usar Tkinter es que me acostumbré a guardar las imágenes en Base64, lo cual me resultó bastante cómodo pero al cambiar a wxPython no encontré una manera directa de cargar las imágenes. Resultó ser muy sencillo pero me llevó un tiempo llegar a esa conclusión:

Esta función toma como argumento una imagen encriptada en Base64 (un string) y devuelve un recurso de wxPython (wx.Bitmap) que se puede usar para mostrar la imagen en pantalla.

Además hice una simple clase que coloca la imagen como un widget en la ventana. La hice para simplificar el proceso ya que suele ser el mismo y le agregué la función Add para que ya se encargue de centrarlo.

La imagen cargada por loadResource se puede usar en otros widgets como wx.BitmapButton, básicamente en cualquier lugar que se pueda usar un bitmap.

Espero ahorrarle a alguien el tiempo que estuve para enterarme de esto (a menos que sea el único que guarda las imágenes en Base64).

sábado, 13 de diciembre de 2014

wxPython - Validar entrada en TextCtrl

Lo que más me motiva a publicar cosas en mi blog es compartir cosas que hice por mi cuenta después de no encontrar cómo hacerlas en internet.

Hace tiempo ya que no publico nada, y en ese tiempo empecé a usar wxPython el cual me está gustando mucho y sin dudas va a reemplazar a Tkinter. Queriendo hacer una entrada que requiera validación (ej: sólo números menores a cierto número) me enteré de que la manera de hacerlo no era tan directa como en Tkinter.

Busqué por ahí y la gente sugería usar el evento EVT_CHAR y revisar que la tecla presionada fuera una que se permitiera pero eso causa problemas principalmente porque hay que poner excepciones para cada tecla de función (como las flechas, ctrl, shift) y no da mucho control sobre lo que se hace. Después de buscar bastante no pude encontrar nada mejor pero llegué a una conclusión: El evento EVT_CHAR se realiza al presionar una tecla y antes de que se agregue al valor del TextCtrl, mientras que el evento EVT_TEXT se realiza al cambiar el contenido y después de que se cambió ese valor. Así que tenemos un evento que se dispara junto antes de cambiar el texto y uno justo después, con eso se puede primero guardar el contenido del TextCtrl y después ver si el texto nuevo cumple con las condiciones y en el caso de que no cumplan, cambiarlo por el texto anterior.

Hice una clase para hacer justamente eso:

La clase asigna las funciones onChar y onChange a los eventos EVT_CHAR y EVT_TEXT respectivamente, onChar guarda en una variable el valor actual del TextCtrl, la función onChange queda vacía para que se cree una para cada validator que se quiera hacer. La función dontAllow() está para cambiar el valor al que estaba previamente, de esa manera el valor no cambia.

Acá hay un ejemplo de una clase que hereda de TextValidator que valida que la entrada sea un número menor a mMaxInt:

Lo único que hay que hacer es agregar mMaxInt al __init__ y crear la función onChange que revisa si el valor nuevo es un número y si es menor al número máximo, en el caso de no serlo, se corre dontAllow() para volver a poner el valor anterior. (en este caso, cuando el valor nuevo es '' (un string vacío), se puede reemplazar por un 0 (cero) si es que se necesita que haya un valor en el TextCtrl)

viernes, 1 de agosto de 2014

Nerd Programming - Mandar mail por Python

Hoy hice una clase de python que hace más fácil enviar eMails, así que decidí compartirla por si a alguien le es de utilidad.
La clase permite acceder a la dirección de mail y enviar todos los mails que se quieran.

Para usarla hay que:
  1. Configurar dirección de mail:
    mail = EMail()
    mail.confMail(eMail-address, password, smtp-server, smtp-port)
  2. Crear nuevo correo:
    mail.newMail(subject)
  3. Agregar texto y/o archivos adjuntos
    mail.addText(text)
    addAttachment(path_to_file)
  4. Enviar correo (este paso se puede repetir por cada receptor):
    mail.send(receiver)
Ejemplo:
from sendEMail import EMail

sender = 'mail@mail.com'
pass = 'password'
smtp = 'smtp.mail.com'
port = 25
receiver = 'mail2@mail.com'
subject = 'Hola!'
adjunto = '/path/to/file'
texto = 'Hola! Este es un mail de prueba.'

mail = EMail()
mail.confMail(sender, pass, smtp, port)
### Lo siguiente se puede repetir por cada mail
mail.newMail(subject)
mail.addText(texto)
mail.addAttachment(adjunto)
mail.send(receiver)
###
mail.close() #Si no se quiere que se pueda usar más mail para acceder a su eMail, se cierra y eso hace que sea necesario correr confMail de nuevo para poder acceder.

Código:


Espero que a alguien le sirva y si tienen dudas, dejen en los comentarios y trataré de responder.

domingo, 27 de abril de 2014

Estoy haciendo un juego - Treasure Break


Para los que todavía no lo saben, estoy estudiando para desarrollar videojuegos y el viernes pasado terminé el alpha de mi primer juego. Se trata de juego basado en el breakout (arkanoid) con elementos del pacman. Mi intención es que el juego se pueda jugar sin saber nada al respecto y sin tutoriales, así que voy a dejar el link para que lo prueben y me comenten sus opiniones:

viernes, 28 de febrero de 2014

Wii U Pro Controller con Ubuntu en Steam

Como algunos sabrán, me compré una Wii U con un Pro Controller y una de las cosas que quise hacer (después de jugar un poco) fue conectar el Pro Controller a la PC. Para mi suerte, con Ubuntu es muy fácil, lamentablemente no hay mucha documentación al respecto, por eso voy a escribir cómo fue que hice para conectarlo.

Es necesario tener bluetooth para poder conectar cualquier dispositivo de Wii o Wii U a la PC, actualmente es muy fácil de conseguir un dispositivo USB decente, yo tengo uno como éste que compré en mercado libre:

Primero hay que instalar xwiimote, son básicamente los drivers de los controles de Wii y Wii U para Ubuntu, con esto Ubuntu va a reconocer el Pro Controller como un joystick y no va a haber que hacer nada extra después de conectarlo.
Pueden instalarlo desde el centro de software o escribiendo lo siguiente en la terminal:
sudo apt-get install xwiimote

Lo siguiente es conectar el pro controller a la PC a través de bluetooth. Se supone que con el bluez (el software que viene instalado por defecto en Ubuntu para manejar bluetooth) se puede conectar pero yo tuve problemas, por suerte ya tenía instalado el blueman (sudo apt-get install blueman) y con ese funcionó perfecto. Para poder conectarlo primero hay que presionar el botón de sincronización del joystick y entrar a "Set up new device" en el menú de blueman. Para que se pueda conectar, tienen que elegir "Proceder sin emparejar", después cada vez que quiera conectar el joystick, lo seleccionan de "Recent Connections..." después de haber apretado el botón de sincronización.

Es probable que al conectarse el joystick, tome control del mouse, para arreglar esto abren una terminal (ctrl+alt+T), escriben "xinput" para ver la información de los dispositivos y después "xinput disable #" dónde # es la id correspondiente al joystick. Esto no va a haber que hacerlo de nuevo (o quizás no más de dos veces).

Listo, ya tienen el joystick conectado a Ubuntu, ahora pueden probar juegos en Steam y ver cómo funcionan. Yo he probado varios y encontré distintos resultados, en algunos casos funciona perfecto y en otros el juego es injugable. Yo no sé mucho al respecto así que no pude averiguar cómo arreglar los problemas del mapeo (que dependen de cada juego), así que simplemente voy a poner una lista de los juegos que he probado y los resultados.

  • A Virus Named TOM: Funciona perfecto, los botones están mapeados de manera de que el A, B, X e Y del joystick de Xbox 360 (que es lo que el juego percibe) sean el A, B, X e Y del Pro Controller
  • Bastion: Funciona bien en parte. Todos los botones del D-Pad están mapeados como A, y el gatillo izquierdo y los botones de los sticks no funcionan, así que no hay suficientes botones para mapear todas las funciones del juego, se puede jugar si se usa el teclado para una función o si se deja algún botón afuera. No he revisado alguna configuración que pueda ser cómoda.
  • Dust: An Elysian Tail: Funciona perfecto. El mapeo es un poco extraño, el A y B del 360 están como el A y B del Pro Controller pero el X e Y están al revés. Me gustaría atacar con el B pero no encontré cómo cambiar los botones, fuera de eso funciona muy bien. El rumble funciona bien.
  • FEZ: Este funciona perfecto, el mapeo es igual al de A Virus Named TOM y además funciona el rumble.
  • Guacamelee: Funciona exactamente igual que en el Dust.
  • Mark of The Ninja: Ambos gatillos están apretados todo el tiempo lo que lo hace injugable. Esto pasa con todos los joysticks en Linux, no sólo con el Pro Controller. No sé si se arreglará en el futuro.
  • Rocketbirds: Sólo funciona en los menús.
No probé todos los juegos a fondo, es posible que no sea difícil arreglar algunos de los errores, quedé bastante sorprendido de lo fácil que es conectarlo y jugar en Steam. Voy a seguir probando cosas con el joystick y probablemente cree una página en el blog para documentarlo todo.

domingo, 23 de febrero de 2014

SixIVs - Un programa para calcular las probabilidades al criar pokemon

Hace poco empecé a usar la crianza pokemon para criar a los pokemon que van a formar parte de mi equipo, así que me interesó saber más o menos cuánto me llevaría cada paso. Después de un poco de investigación llegué a la conclusión de que podría hacer un programa que calculara cuántos huevos habría que abrir para sacar un pokemon con los Individual Values que yo quería basándome en los de los padres.

No me costó mucho y terminé con algo así:
El programa es bien simple, se marca las casillas en dónde debe haber un IV en 31 y el programa calcula cada cuantos huevos aparece un pokemon con los IV deseados. También se puede  elegir si se va a usar el destiny knot.

Nota: Si no se usa destiny knot, el pokemon resultante hereda 3 IVs de los 12 entre los dos pokemon padres, si se usa, el pokemon hereda 5.

El resultado es válido para todos los casos, por ahora lo mejor es usar para cuando entre los dos pokemon tienen 5 (o 3) IVs que quieren en el hijo.

Descarga:

jueves, 23 de enero de 2014

Como optimizar gifs con GIMP

Hice una aplicación para crear gifs a partir de videos (aquí su página "oficial"), el problema que tiene es que no optimiza los gifs y que uno termina con gifs de más de 2MB (que para web no es aceptable), así que mientras mi programa no tenga la capacidad de optimizarlos, voy a dejarles una manera fácil de hacerlo con un programa completamente gratuito.

Si no tienen el GIMP, recomiendo que lo bajen (link), es una herramienta muy verśatil y de uso libre.

Para este tutorial voy a usar la siguiente imagen generada con video2gif:
No sé cómo blogger maneja los gifs pero debería tardar en cargar.
Es un archivo .gif de 2,4MB

Lo primero que vamos a hacer es abrir el archivo en GIMP.
Después en el menú de herramientas (o haciendo click derecho en la imagen) vamos a Filtros> Animación> Optimizar (para GIF).
GIMP va a cargar un rato y va a crear una imagen nueva, esa nueva imagen la guardamos como gif, para eso la exportamos (ctrl+e) y la guardamos con la extensión .gif al final.

Se va a abrir un menú para exportar la imagen como GIF.
Ahí seleccionan "Como animación" y no es necesario cambiar nada más. Hacen click en "Exportar" y se guarda el gif.

El resultado en este caso fue este:
Un archivo .gif de 1MB.

Para obtener un gif más chico (seguramente 1MB sea demasiado para tumblr), se puede achicar la imagen (me parece que es mejor si se hace desde el mismo video2gif), además se puede achicar más si se cambian los colores pero de eso no sé, averiguaré más adelante y les contaré.

Video2gif v1.1

Hay una nueva versión de video2gif.
Introduciendo: Subtítulos.

En esta nueva versión podemos agregar hasta 3 líneas de subtítulos, elegir su color, tamaño y grosor, y ver una vista preliminar de cómo se verán los subtítulos en el gif para poder modificar los datos para que se vea bien.

Para aplicar los subtítulos al gif es necesario hacer click en la casilla "Activar subtítulos" que está desactivada por defecto. Si te parecería más cómodo que estuviera activada por defecto, entonces la próxima característica te va a gustar.

Ahora también se puede guardar datos por defecto de cualquier opción, hay una guía para eso en este link. Eso quiere decir que pueden decirle a la aplicación que comience con la casilla "Activar subtítulos" activada por defecto.

Lo pueden descargar en este link.

Espero que esta aplicación les sea útil y como siempre, si tienen dudas/reportes de bugs/sugerencias,  pueden dejarlas como comentarios en este blog o contactarme por alguno de los medios de mi página de contacto.

martes, 21 de enero de 2014

Actualizaciones en video2gif

Los que me siguen en tumblr ya se habrán enterado de que he hecho varias actualizaciones al programa que creé hace unos días, Video2gif.

La versión actual trae las siguientes características:
  • Crea un gif a partir de un video en el intervalo que se especifique.
  • Se puede elegir la carpeta de salida y el nombre del archivo.
  • Se puede obtener información sobre el video (frecuencia y dimensiones)
  • Se puede modificar las dimensiones de la imagen resultante.
  • Se puede modificar el tiempo entre cuadros de la animación resultante.
  • Se puede cambiar el idioma entre Español e Inglés.
Además estoy trabajando en la posibilidad de ponerle subtítulos.

Todas las actualizaciones van a ir en esta página, ahí van a poder encontrar la última versión para descargar.

Como siempre, si quieren comunicar algún bug/sugerencia/duda, pueden hacerlo por los comentarios o contactarme por alguna de las posibilidades en la página de contacto.

domingo, 19 de enero de 2014

Video2Gif - Una aplicación para extraer gifs de videos

Hace tiempo hice una aplicación muy simple que extraía imágenes de un video y armaba un gif animado pero sólo servía para linux y tampoco era muy cómoda. Ahora tengo mejores herramientas, así que hice una aplicación con interfaz gráfica y que se puede usar tanto en Windows como en Linux.
Es bastante simple, se elige el video, se pone el tiempo de inicio, la duración y el nombre del archivo de salida. El programa guardará el archivo en la misma carpeta en la que fue ejecutado.

El programa está en su etapa alpha, quedan cosas por hacer y su funcionamiento es muy simple, lo próximo que pienso hacer es poder elegir las dimensiones del gif resultante. Por ahora no acepta que se dejen campos vacíos.

Para hacerlo utilicé OpenCV y el programa images2gif.py de visvis.

Pueden descargar el programa de acá:
Está listo para descargar y utilizar, es probable que hay que instalar alguna dependencia en Linux pero no estoy seguro de cuales, iré averiguando cuando surjan problemas.
Related Posts Plugin for WordPress, Blogger...