lunes, 4 de octubre de 2010

wxFormBuilder: Uso del widget CustomControl en wxPython

Hola. En este post vamos a ver cómo se utiliza el CustomControl de wxFormBuilder para generar código wxPython. El widget CustomControl se puede encontrar en la pestaña Additional del Component Pallete.

De lo que se trata es de generar código Python, mediante el framework wxPython, para un widget que todavía no está soportado en wxFormBuilder. Se utiliza un wx.Panel para visualizar donde se colocará este widget.

Para ver cómo funciona este widget vamos a crear un proyecto en wxFormBuilder, en el cual queremos insertar un widget wx.CollapsiblePane, el cual no está soportado actualmente (en la versión 3.1.70) por wxFormBuilder.

Lo primero de todo es crear un proyecto. Después incluiremos una serie de widgets, tal como refleja el siguiente árbol de objetos de wxFormBuilder:

Como se puede observar se incluye el CustomControl en un sizer dentro de un wx.Panel (MyPanel1). Además se ha creado un wx.Frame para probar más tarde que efectivamente funciona y otro wx.Panel (MyPanel2) que contiene un texto y una imagen, para ver el funcionamiento del widget CollapsiblePane. El siguiente paso es configurar las propiedades del CustomControl, modificándolas en Properties del Object Properties:

Para generar código Python de estas propiedades solamente nos interesan 2, a saber: name (el nombre del widget, que se utiliza para añadirlo al sizer) y construction (la llamada para instanciar la clase y crear el objeto cuyo nombre ha sido declarado en name, y que tiene que ser atributo de la clase). Por tanto vamos a darle a nuestro nuevo widget como name CollapsiblePanel. Y el construction será: self.CollapsiblePanel = wx.CollapsiblePane(self, label='Detalle'). Darse cuenta que el CollapsiblePanel tiene que ser atributo de la clase generada (es por ello lo del self).


Si nos vamos a la pestaña del código Python generado nos encontramos:


El código para probar las clases generadas por wxFormBuilder podría ser el siguiente:

import wx
# Importamos las clases generadas por wxFormBuilder.
from nuevoWidget import MyFrame1, MyPanel1, MyPanel2

# Construimos clase que hereda de los componentes gráficos.
class frame_ejemplo(MyFrame1):
def __init__(self):
# Llamamos al constructor de MyFrame1.
MyFrame1.__init__(self, None)

# Añadimos al Frame el panel MyPanel1.
self.panel = p = MyPanel1(self)

# Obtenemos el ID del panel CollasiblePane.
pane = p.CollapsiblePanel.GetPane()

# Le decimos a MyPanel2 que será hijo del panel CollapsiblePane.
self.panel2 = MyPanel2(pane)

# Lanzamos aplicación.
aplicacion = wx.PySimpleApp()
frame = frame_ejemplo()
frame.Show()
aplicacion.MainLoop()

Y con el siguiente resultado:

Si hacemos click en el botón Detalle:

Saludos.

1 comentario: