Crear una ventana en Python con wxPython



#!/usr/bin/env python
# -*- coding: utf-8 -*-


# Importamos la librería gráfica wxPython.
import wx


# Nuestra clase que hereda de wx.Frame y que representará la ventana.
class MyFrame(wx.Frame):
 
    # Función donde se inicializa, donde se crean o se declaran los
    # miembros (variables) de la clase.
    def __init__(self, parent, id, title):
        # Inicializamos la clase wx.Frame de la cual heredará esta.
        wx.Frame.__init__(self, parent, id, title)
        # Creamos una lista de elementos a mostrar.
        self.listbox_1 = wx.ListBox(self, -1)
        # Creamos 2 botones.
        self.button_1 = wx.Button(self, -1, u"Click aquí")
        self.button_2 = wx.Button(self, -1, u"Cerrar")
        # Llmamos otros métodos que creamos para la inicialización.
        self.__do_layout()
        self.__set_properties()
        self.__set_event()
     
 
    # Esta función ordenará los elementos de nuestra ventana,
    # mediante el uso de sizers.
    def __do_layout(self):
        # Creamos los sizers de tipo BoxSizer donde los elementos se
        # irán incluyendo de manera vertical y horizontalmente.
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        # Incluímos los elementos en los sizers mediante su método Add,
        # con los siguientes argumentos:
        #    1. Nombre del elemento a agregar (variable)
        #    2. Proporción que ocupará el elemento dentro del sizer.
        #    3. Margenes que tendrá el elemento: wx.ALL = Todos.
        #    4. Espacio de los margenes.
        sizer_1.Add(self.listbox_1, 1, wx.EXPAND|wx.ALL, 5)
        sizer_2.Add(self.button_1, 0, wx.ALL, 5)
        sizer_2.Add(self.button_2, 0, wx.ALL, 5)
        sizer_1.Add(sizer_2, 0, wx.ALL, 5)
        # Establecemos el sizer principal a la ventana.
        self.SetSizer(sizer_1)
        self.Layout()
     
    # Esta función establecerá las propiedades a los elementos.
    def __set_properties(self):
        # Tamaño de la ventana.
        self.SetSize( (800, 600) )
        # Color de fondo de uno de los miembros (elementos)
        self.button_1.SetBackgroundColour( wx.Colour(200, 255, 100) )
        # Fuente del texto del listbox_1.
        self.listbox_1.SetFont( wx.Font(24, wx.DEFAULT, wx.NORMAL, wx.NORMAL) )
 
    # Esta función establecerá los diferentes eventos a los elementos.
    def __set_event(self):
        self.Bind(wx.EVT_BUTTON, self.OnButton1, self.button_1)
        self.Bind(wx.EVT_BUTTON, self.OnButton2, self.button_2)
     
    # Función al precionar el button_1
    def OnButton1(self, event):
        # Agregamos un texto al listbox_1.
        self.listbox_1.Append(u"Precionado")
        event.Skip()
     
    # Función al preccionar el button_2
    def OnButton2(self, event):
        self.Close()
        event.Skip()
     
     

# Instaciamos la clase App donde se ejecutará nuestra ventana.
app = wx.App(0)
# Instanciamos la clase MyFrame que representa nuestra ventana.
frame = MyFrame(None, -1, "Hola Mundo")
# Mostramos la ventana.
frame.Show()
# Esto crea una especie de bucle mientras nuestra ventana este abierta.
app.MainLoop()