Colaboradores

jueves, 13 de enero de 2011

Python: trabajando con un entorno gráfico (wxPython)

Anteriormente les hablaba de python y sus ventajas, hoy les mostraré como hacer de manera sencilla una aplicación gráfica con python, solo que en esta ocasión nos le hablaré de la interfaz nativa de python que es el módulo Tkinter que permite realizar interfaces gráficas basadas en la biblioteca Tk, sino de otro binding cuyo nombre es wxPython, que proviene de la biblioteca gráfica wxWidgets; esta elección es porque Tkinter es demasiado básico, además de no utilizar bindings nativos del sistema, cosa que wxPython si hace.
WxPython trabaja muy bien en diversas plataformas generando el aspecto nativo de las GUI realizadas con él. El programa es el siguiente:

#! /usr/bin/python
import  wx, os 
#modulos para trabajar con el entorno 
#grafico y el sistema operativo
from wx.lib.wordwrap import wordwrap

#El mensaje de la licencia de nuestra aplicacion
licenceText = "Este es una muestra del poder de python XD"

#Tipo de archivos de ejemplo, estos son utilizados para
#filtrar por extension al momento de invocar "abrir un archivo"
wildcard = "Archivos de audio mp3 (*.mp3)|*.mp3|" \
     "Documento de Word (*.doc)|*.doc|"\
     "Todos los archivos(*.*)|*.*"


#Clase de nuestra ventana de ejemplo     
class MyFrame(wx.Frame):
 
 def __init__(self):
  """Esta tambien es otra forma de crear comentarios 
  utilizando varias lineas, equivaldria a /** ... */ en Java o C.
  Este es el metodo constructor que permite inicializar a nuestra 
  ventana, es el equivalente al constructor de Java"""
  
  #Llamamos a la clase Frame que construira nuestra ventana
  wx.Frame.__init__(self,None,-1,"Mi Ventana",size=(400,400))
  
  #El panel de nuestra ventana para poner botones y demas artilugios
  panel = wx.Panel(self,-1)
  
  #Un boton que mostrara un dialogo "Sobre..."
  b = wx.Button(panel,-1,"Hola Mundo!",(20,10))
  
  #integramaos el boton en la ventana
  self.Bind(wx.EVT_BUTTON,self.OnButton,b)
  
  #Otro boton que abrira un dialogo de abrir un archivo
  b = wx.Button(panel,-1,"Abrir algun archivo",(20,50))
  
  #igualmente integramos este boton al al panel
  self.Bind(wx.EVT_BUTTON,self.OnButton2,b)
  
 def OnButton(self,evt):
  """Metodo que reaccionara cuando presionemos el boton Hola Mundo!"""
  
  #Creamos el dialogo
  info = wx.AboutDialogInfo()
  
  #le ponemos nombre superior de nuestro dialogo
  info.Name = "Mi Ventana"
  
  #le asignamos la version de nuestra aplicacion
  info.Version = "1.0"
  
  #Un copyright
  info.Copyright = "(C) Copyright Miguel Pinia"
  
  #Una descripcion de nuestra aplicacion
  info.Description = wordwrap("Este es la informacion sobre la aplicacion: "
  "esta aplicacion fue hecha en"
  " python ", 350, wx.ClientDC(self))
  
  #Asignamos la licencia que creamos al principio del documento
  info.License = wordwrap(licenceText,500,wx.ClientDC(self))
  
  #Desarrolladores de la aplicacion
  #Nota: Vypi es una mascota XD
  info.Developers = ["Miguel Pinia","wxPython","Vypi la mascota"]
  
  #la que contendra nuestra informacion
  wx.AboutBox(info)
 def OnButton2(self,evt):
  """Este metodo reaccionara al presionar el boton "abrir" generando 
  un evento que permitira crear un dialogo de apertura a nuestro archivo, 
  claramente este archivo seleccionado no hara nada, ya que no vamos a trabajar
  sobre el, dado que esta es una aplicacion de ejemplo"""
  
  #Creamos el dialogo y lo mostramos
  dlg = wx.FileDialog(self,message="Escoga un archivo",defaultDir = os.getcwd(),defaultFile="",wildcard=wildcard ,style= wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR)
  
  #Si ya seleccionamos el archivo lo unico que haremos sera destruir el dialogo
  if dlg.ShowModal() == wx.ID_OK:
   dlg.Destroy
   
   
if __name__=="__main__":
 """Metodo main"""
 app = wx.App()
 
 #creamos un objeto de la clase myframe
 frame = MyFrame()
 
 #Lo mostramos hasta que algun evento ocurra
 frame.Show(True)
 app.MainLoop()

Con esto hemos generado una pequeña aplicación gráfica de manera sencilla, de hecho más rápido y sencillo que otras alternativas en otros lenguajes de programación como Java o C (de hecho, es más sencillo que programar en Swing con Java o GTK+ con C :P). Trabajar con python puede ser más sencillo y enriquecedor, si lo que queremos es aprender a programar. WxPython es muy sencillo de utilizar y muy bonito ver que funciona en las distintas plataformas que existen, para ilustrarlo pondre unas capturas de como trabaja en Windows XP y Ubuntu.


Windows.

















































Ubuntu:



Aquí es mostrada la apariencia nativa del mismo programa en Ubuntu, aqui se ve claramente que no hubo necesidad de cambiar el código original.
Antes de terminar, les pondré unos cuantos enlaces para mayor información:

Con esto he terminado esta pequeña reseña sobre como trabajar gráficos en python.

4 comentarios:

  1. excelente, el más completo que he encontrado.

    ResponderEliminar
  2. justo lo que andaba buscando, genio!
    gracias!

    ResponderEliminar
  3. Estoy con la idea de realizar un pequeña aplicacion, una de sus funciones es que me detecte que dispositivos como USB o disco duro estan conectados al equipo, pero no he encontrado nada relacionado con eso, si usted sabe me podria hacer el favor de explicarme o decirme que codigo tengo que utilizar (estoy utilizando wxpython).

    Se lo agradezco.

    ResponderEliminar
    Respuestas
    1. Hay una biblioteca llamada PyUSB https://walac.github.io/pyusb/ qué te puede dar lo que necesitas, esta biblioteca debería de cubrir todas tus necesidades que tienes.

      Puedes darle una revisada a su tutorial que tienen en github.

      https://github.com/walac/pyusb/blob/master/docs/tutorial.rst

      Saludos,
      Miguel

      Eliminar