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)
Related Posts Plugin for WordPress, Blogger...