Aprende Wxpython - Preview - LP
Aprende Wxpython - Preview - LP
ndice general
Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lo bsico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Una primera aplicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Con clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1
3
Controles bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Introduccin
Lo bsico
Una primera aplicacin
Una aplicacin muy bsica en wxPython puede construirse con unas pocas lneas:
1
2
3
4
5
6
import wx
app = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"wxPython Demo")
frame.Show()
app.MainLoop()
Imagen 01
Primero, y como siempre, importamos la librera wxPython para poder utilizar las clases y funciones
disponibles en esta.
Posteriormente se debe instanciar un objeto de la clase wx.App, que representa a la aplicacin por
si misma. La clase wx.App se utiliza para inicializar el sistema de wxPython y todo el conjunto de
interfaces grficas, adems de controlar el intercambio de informacin y el manejo de los eventos
lanzados. Cada aplicacin debe tener una instancia wx.App, y esta debe crearse antes de instanciar
cualquier otro objeto grfico de wxPython, para asegurar que el sistema de wxWidgets se ha
inicializado correctamente . Es ms, si en el ejemplo anterior intenta inicializar el Frame antes de
https://wxpython.org/docs/api/wx.App-class.html
Lo bsico
wx.App, entonces wxPython lanzar un error como el que se muestra enseguida (el cual es bastante
explcito):
Traceback (most recent call last):
File "C:\Users\adminIS\Desktop\LABPro\_books_\PB1703 - AWE\AWE\manuscript\src\
conceptos-elementales\primera_aplicacion.py", line 4, in <module>
frame = wx.Frame(None, wx.ID_ANY, u"wxPython Demo")
File "C:\Python27\lib\site-packages\wx-2.9.5-msw\wx\_windows.py", line 580, in
__init__
_windows_.Frame_swiginit(self,_windows_.new_Frame(*args, **kwargs))
wx._core.PyNoAppError: The wx.App object must be created first!
Con la clase wx.Frame creamos un objeto de tipo ventana, que es donde colocaremos todos los
controles que componen una interfaz grfica. Para instanciar un objeto de la clase wx.Frame,
necesitamos pasar algunos argumentos, por ejemplo, si recurrimos a la ayuda proporcionada por
wxPython, respecto al constructor de wx.Frame:
>>> help(wx.Frame.__init__)
Help on method __init__ in module wx._windows:
__init__(self, *args, **kwargs) unbound wx._windows.Frame method
__init__(self, Window parent, int id=-1, String title=EmptyString,
Point pos=DefaultPosition, Size size=DefaultSize,
long style=DEFAULT_FRAME_STYLE, String name=FrameNameStr) -> Frame
wxPython nos dice que necesitamos especificar al menos el argumento parent, que es el objeto
padre del Frame. En el ejemplo utilizado hemos pasado None como argumento, para indicar que
nuestro objeto frame no tiene un objeto padre. Note que adems de parentse puede especificar un
id, un ttulo (title), la posicin (position), el tamao (size), el estilo (style) y un nombre (name).
En nuestro caso hemos pasado, adems de parent, un id y un ttulo (string que se muestra en la
parte superior de la ventana). Si quisiera especificar un tamao inicial al Frame podra incluirse el
argumento size como sigue:
frame = wx.Frame(None, wx.ID_ANY, u"wxPython Demo", size=(300,200))
El mtodo Show de la clase wx.Frame se utiliza para mostrar en pantalla la ventana que hemos creado
y todos los elementos que pudiera contener, si no llamamos a Show la ventana no se dibujar en la
pantalla. Luego, el mtodo MainLoop de wx.App es el que pone en funcionamiento toda la maquinaria
de wxPython, lista para recibir y manejar los eventos generados.
Lo bsico
Con clase
En la seccin anterior vimos como desarrollar una aplicacin wxPython muy elemental, con unas
cuantas lneas de cdigo. Todo esto est muy bien, pero cuando querramos desarrollar una aplicacin
un poco ms compleja vamos a tener muchos problemas con ese mismo enfoque. Adems, cuando
se requiera programar las respuestas a los eventos, se necesita mucho intercambio de informacin
entre el objeto que lanza el evento y las funciones o rutinas que los manejan (handlers), y de esa
manera, aun con la ayuda de las funciones es un tanto difcil mantener el cdigo legible.
Debido a lo comentado en el prrafo anterior, las aplicaciones en wxPyhon comnmente se
desarrollan utilizando un diseo orientado a objetos, donde, tpicamente se escriben clases heredadas
de los controles grficos de wxPython.
Lo ms comn, es crear una clase que herede de wx.Frame, y en esta ir agregando todos los controles
grficos que necesitemos para que la aplicacin sea funcional.
1
2
3
4
5
6
7
8
9
10
11
import wx
class MiFrame(wx.Frame):
def __init__(self,parent,**kwargs):
wx.Frame.__init__(self,parent=parent,**kwargs)
self.Show()
if __name__=='__main__':
app = wx.App()
frame = MiFrame(None, title=u"wxFrame Demo")
app.MainLoop()
Primero, definimos una clase MiFrame heredada de wx.Frame, agregamos el mtodo init que para
efectos de este texto ser nuestro constructor de la clase, y aqu en init es necesario llamar tambin
al mtodo init de la superclase, pasndole como argumentos aquellos que hemos recibido desde el
constructor de nuestra clase MiFrame. Note que, debido a la sintaxis de Python, el parmetro self
ser siempre el primer argumento del mtodo init de la clase y superclase. Dentro del mtodo init
habrn de agregarse todos los controles (que veremos en la siguiente entrega) y hacer las conexiones
de eventos requeridas. El mtodo Show sirve, claro est, para mostrar el Frame en la pantalla.
Para llamar al mtodo init de la superclase, tambin puede utilizar la otra notacin que implica el
uso de super, algo como:
super(MiFrame, self).__init__(*args,**kwargs)
Finalmente, lo nico que hacemos es instanciar un objeto de la clase MiFrame, con los mismos
argumentos que utilizaramos para uno de wx.Frame. Y bueno, lo de la clase wx.App ya nos lo
sabemos, puesto que lo hemos visto en la seccin anterior.
Controles bsicos