Blog
wxPython es un kit de herramientas GUI (Graphical User Interface) para el desarrollo de interfaces de usuarios en Python, es una de las librerías que se enfoca en esta área al igual que Tkinter y PyQT5 que son las más reconocidas.
wxPython es un juego de herramientas multiplataforma . Esto significa que el mismo programa se ejecutará en múltiples plataformas sin modificación. Las plataformas admitidas actualmente son Microsoft Windows, Mac OS X, macOS, Linux y otros sistemas similares a Unix con bibliotecas GTK2 o GTK3. En la mayoría de los casos, los widgets nativos se utilizan en cada plataforma para proporcionar un aspecto 100% nativo para la aplicación.
Creando un Hola mundo
Vamos a crear un Hola mundo usando wxPython, pero este Hola mundo lo vamos a mostrar como título de nuestra ventana principal (main window). Entonces para ello vamos a crear un archivo llamado app.py:
import wx app = wx.App() frame = wx.Frame(None, title="Hola mundo") frame.Show() app.MainLoop()
Con este pequeño código, simplemente generamos una ventana que tiene como título un Hola mundo, este sería nuestra base para partir un poco más allá, pero antes de proceder es importante destacar cada elemento.
➡ Te invitamos a realizar el Curso de Python Gratis para Principiantes:
- La variable app contiene el objeto App de la librería wx
- En la variable frame se encuentra el objeto Frame el cual es un widget que se encargará de mostrar el resto de los widgets que proporcionemos a la ventana
- frame.Show le dice a wxPython que muestre el widget dentro de nuestra ventana principal (main window)
- app.MainLoop hace que nuestra ventana principal entre en ejecución a través de un bucle while, así es como está definido en su código.
Ahora que sabemos esto, podemos proceder ya que por ejemplo podemos utilizar wxPython con la programación orientada a objetos, esto es posible debido a que Python es muy flexible:
import wx class Ejemplo(wx.Frame): def __init__(self, parent, title): super(Ejemplo, self).__init__(parent = None, title=title, size=(350, 250)) def main(): app = wx.App() ex = Ejemplo(None, title='Hola mundo') ex.Show() app.MainLoop() if __name__ == '__main__': main()
En el código anterior y también en este, es importante destacar que el widget Frame al pasarle como atributo None, le indica a Python que este es el widget principal, es decir; el widget que contendrá el resto de los widgets.
Si ejecutamos este código veremos que tenemos el mismo resultado que el anterior, la misma ventana que tiene por título un Hola mundo pero con la diferencia de que ahora la ventana tiene un tamaño de 350px*250px y esto gracias al atributo size que se especifica como una tupla.
Ademas de poder darle un tamaño a la pantalla, también podemos decirle que queremos que al ejecutarse el programa este se muestre en el centro de la pantalla la primera vez que sea abierto, simplemente llamando al método Centre desde el constructor de la clase:
import wx class Ejemplo(wx.Frame): def __init__(self, parent, title): super(Ejemplo, self).__init__(parent = None, title=title, size=(350, 250)) self.Centre() # Agregamos el método Centre para centrar la ventana en cualquier tipo de pantalla. def main(): app = wx.App() ex = Ejemplo(None, title='Hola mundo') ex.Show() app.MainLoop() if __name__ == '__main__': main()
Si ejecutamos el código, ahora siempre aparecerá la ventana de nuestro programa en el centro de nuestras pantallas, como último recurso vamos a colocar otros widgets dentro del principal, para ello vamos a crear un nuevo método llamado widgets donde los crearemos:
import wx class Ejemplo(wx.Frame): def __init__(self, parent, title): super(Ejemplo, self).__init__(parent = None, title=title, size=(350, 250)) self.Centre() self.widgets() def widgets(self): panel = wx.Panel(self,-1) label_nombre = wx.StaticText(panel, -1, "Nombre") self.nombre = wx.TextCtrl(panel, -1, size=(175, -1)) self.nombre.SetInsertionPoint(0) label_contraseña = wx.StaticText(panel, -1, "Password:") self.contraseña = wx.TextCtrl(panel, -1, size=(175, -1),style=wx.TE_PASSWORD) tamaño_grid = wx.FlexGridSizer(cols=2, hgap=6, vgap=6) self.boton = wx.Button(panel,-1, "Enviar") tamaño_grid.AddMany([label_nombre, self.nombre, label_contraseña, self.contraseña, self.boton]) panel.SetSizer(tamaño_grid) def main(): app = wx.App() ex = Ejemplo(None, title='Hola mundo') ex.Show() app.MainLoop() if __name__ == '__main__': main()
Hemos creado hasta ahora una interfaz gráfica que se ve de la siguiente manera
Ahora solo falta capturar lo que se introduzca a través de los inputs y eso lo haremos creando un nuevo método que reciba el evento click del botón enviar, pero para que pueda recibir dicho evento, debemos bindear el evento click al botón:
import wx class Ejemplo(wx.Frame): def __init__(self, parent, title): super(Ejemplo, self).__init__(parent = None, title=title, size=(350, 250)) self.Centre() self.widgets() def widgets(self): panel = wx.Panel(self,-1) label_nombre = wx.StaticText(panel, -1, "Nombre") self.nombre = wx.TextCtrl(panel, -1, size=(175, -1)) self.nombre.SetInsertionPoint(0) label_contraseña = wx.StaticText(panel, -1, "Password:") self.contraseña = wx.TextCtrl(panel, -1, size=(175, -1),style=wx.TE_PASSWORD) tamaño_grid = wx.FlexGridSizer(cols=2, hgap=6, vgap=6) self.boton = wx.Button(panel,-1, "Enviar") self.Bind(wx.EVT_BUTTON, self.enviarDatos, self.boton) # Usamos wx.EVT_BUTTON para crear el evento, le pasamos el método al que llamará y de último el boton al que le asignaremos dicho bind tamaño_grid.AddMany([label_nombre, self.nombre, label_contraseña, self.contraseña, self.boton]) panel.SetSizer(tamaño_grid) def enviarDatos(self, event): nombre = self.nombre.GetValue() # Obtenemos los valores del input nombre contraseña = self.contraseña.GetValue() # Obtenemos los valores del input contraseña print("""\ Nombre: {} Contraseña: {} """.format(nombre, contraseña)) def main(): app = wx.App() ex = Ejemplo(None, title='Hola mundo') ex.Show() app.MainLoop() if __name__ == '__main__': main()
Al ejecutar nuevamente el código, podrás ver que si introduces datos en el input y luego hace click en el botón enviar podrás ver lo que enviaste a través de la consola de Python.
Hasta aquí llegaremos con esta breve presentación de wxPython, te invito a leer su documentación si quieres aprender un poco más sobre esta librería para crear interfaces gráficas.