Вы находитесь на странице: 1из 83

Cmo aprender wxPython

Contenido

1. Cmo aprender wxPython

1. Aprenda Python

2. Elija un buen editor

3. Instalar wxPython

4. Leer los tutoriales de wxPython

5. Lea la Gua de estilo de wxPython

6. Leer los archivos de demostracin

7. Utilice la documentacin wxWidgets

8. Utilice la referencia wxPython (experimental)

9. Estudia el cdigo de otras personas

10. Hacer preguntas!

Hemos tenido muchas preguntas en el newsgroup preguntando cmo aprender wxPython. Esta pgina ofrece
algunos consejos sobre cmo hacer exactamente eso.

Aprenda Python
Si eres nuevo en Python, y especialmente si eres nuevo en la programacin en general, lo ms prctico es
aprender primero Python, sin ningn tipo de GUI. La espera puede ser frustrante, pero vale la pena. Python
es un lenguaje muy potente capaz de hacer muchas cosas con y sin GUIs.

Como mnimo, debe comprender temas como funciones, mdulos y clases. Sin ellos, aprender wxPython
ser una experiencia frustrante. El sitio web de Python tiene una excelente gua para los principiantes que te
lleva paso a paso a travs del proceso de aprendizaje del idioma.
Http://www.python.org/about/gettingstarted/

Elija un buen editor


Funciones como autocompletar, resaltar cdigo y una ventana interactiva facilitan la programacin con
menos errores.

Consulte http://wiki.python.org/moin/PythonEditors para obtener una lista de editores.

Instalar wxPython
Si an no tiene instalado wxPython, consulte la pgina Cmo instalar wxPython .
Leer los tutoriales de wxPython
Tutoriales de Wiki : Un buen lugar para empezar es la pgina de Inicio . Entonces usted debe mirar el curso
de obstculo y la demostracin completamente funcional .

Tutorial externo : Otro gran recurso es el tutorial de Zetcode wxPython . Abarca el uso de una amplia gama
de temas, incluyendo: introduccin, mens / barras de herramientas, clasificadores, eventos, la API de
dibujo, widgets, la creacin de widgets personalizados y demuestra varias aplicaciones "esqueleto".

Tutoriales en video : ShowMeDo.com alberga un conjunto de videos tutoriales de wxPython - excelente


para principiantes. Tambin hay una serie de videos wxPython en YouTube .

Lea la Gua de estilo de wxPython


Le servir bien para utilizar un estilo agradable, moderno para su cdigo de wxPython. Debido a los
cambios API a lo largo de los aos, y la simple experiencia, estilo de cdigo wxPython ha cambiado un poco
durante los aos, y se puso mucho ms Pythonic.

Desafortunadamente, muchos de los ejemplos que encontrars no han sido actualizados para reflejar este
estilo. Como se beneficiar con el uso de buen estilo, moderno, asegrese de estudiar wxPython Gua de
estilo justo cuando comience, para establecer buenos hbitos.

Leer los archivos de demostracin


WxPython viene con un conjunto completo de demos y ejemplos. Vaya a la pgina de descarga y desplcese
hasta los archivos wxPython-demo-xxx . La demostracin demuestra casi todas las caractersticas de
wxPython. Puede ver cmo funcionan las diferentes funciones y estudiar el cdigo fuente.

NOTA : Si las demostraciones no funcionan, asegrese de tener instalada la ltima versin de wxPython. A
veces, las demos utilizan funciones que no se encuentran en versiones anteriores. Para comprobar su versin
de wxPython, ejecute:

import wx
print wx.version()

Una forma popular de trabajar en wxPython es encontrar una demo que est cerca de lo que quieres, copiarla
y luego modificarla para que se adapte a tus necesidades. Otra fuente de ejemplos es el libro de cocina
wxPython .

Utilice la documentacin wxWidgets


Un recurso muy importante es la documentacin wxWidgets .

Est escrito principalmente en C ++, pero hay notas para wxPython y la mayora de las veces puedes
convertir mentalmente la sintaxis de C ++ a la sintaxis de wxPython. No es necesario conocer C ++ para
beneficiarse de esto. Muchos programadores de wxPython no conocen C ++ en absoluto, y todava
encuentran la documentacin de wxWidgets muy til.

Si necesita ayuda para leer los documentos de wxWidgets, la Gua de C ++ para Pythoneers podra ser de
ayuda. O simplemente puede pedir ayuda en la lista de correo .

Utilice la referencia wxPython (experimental)


Puede probar la referencia de la API generada automticamente . Esta es una caracterstica experimental. No
es tan completo ni maduro como la documentacin de wxWidgets, pero est escrito en la sintaxis de
wxPython en lugar de la sintaxis de C ++.

Estudia el cdigo de otras personas


Charles Simonyi, el legendario programador de Microsoft, creci en Hungra y tena pocos libros
disponibles para aprender de la informtica. Fue capaz de obtener el cdigo fuente de un compilador y
estudi las impresiones, ya que los msicos estudiaran las partituras musicales.

Hay bastantes gemas en el cdigo de ejemplo que se distribuye con wxPython pero no se encuentran en el
programa de demostracin , por ejemplo, FrogEdit y su mdulo subyacente wx.lib.editor. Haba supuesto
que un editor sera un wx. TextCtrl en los esteroides . Me sorprendi ver que el texto fue dibujado a la
pantalla usando un DC (control de dispositivo) y aprend algunas buenas tcnicas. Tambin estoy "leyendo"
Transana y Task Coach , dos aplicaciones sofisticadas escritas en Python y wxPython, para aprender cmo
se estructuran las aplicaciones grandes. Hay una gran diferencia entre los pequeos ejemplos de este wiki y
el cdigo real del mundo real, por lo que el proceso de analizar grandes aplicaciones es parte integral del
aprendizaje de wxPython.

Hacer preguntas!
La lista de correo de wxPython-users es famosa por sus miembros serviciales y amigables. Puede suscribirse
a ella aqu: http://wxpython.org/maillist.php .

Cmo aprender wxPython (ltima edicin 2013-05-02 15:34:47 por c-98-246-90-205 )


Buscar:

Iniciar sesin

Otro tutorial
FrontPage

Cambios recientes

FindPage

Contenidos de ayuda

Otro tutorial

Pgina inmutable

Informacin

Archivos adjuntos

Mas acciones:

El tutorial de wxPython Linux


Tabla de contenido:

Contenido

1. El tutorial de wxPython Linux

1. Prefacio

2. API de wxPython

3. Primeros pasos

1. Wx.Window

2. Trama de wx

3. Wx.MenuBar
4. Wx.ToolBar

4. Gestin de diseo

1. Wx.BoxSizer

2. Wx.GridSizer

3. Wx.GridBagSizer

5. Objetos bsicos

1. Cursores

2. Fuentes

3. Colores

4. Mapas de bits

6. Eventos

1. Ejemplos

7. Dilogos

1. Cuadros de dilogo personalizados

2. Dilogos predefinidos comunes

8. Core Widgets

1. Wx.Button

2. Wx.ToggleButton

3. Wx.BitmapButton

4. Wx.StaticLine

5. Wx.StaticText

6. Wx.StaticBox

7. Wx.ComboBox

8. Wx.CheckBox

9. Wx.StatusBar

10. Wx.RadioButton

11. Wx.Gauge

12. Wx.Slider
13. Wx.ListBox

14. Wx.SpinCtrl

15. Wx.ListCtrl

16. Wx.SplitterWindow

17. Wx.ScrolledWindow

18. Wx.TreeCtrl

19. Wx.Notebook

9. Clases wx.lib

1. Gestos de ratn

2. AnalogClockWindow

3. Botones de texto del mapa de bits

10. Widgets avanzados

1. CalendarCtrl

2. LEDNumberC trl

11. Creacin de una aplicacin de barra de tareas

12. Wx.La tabla de contactos

13. Arrastrar y soltar

14. Trazado

15. Configuracin de la configuracin de la aplicacin

16. Funciones de wxPython

1. Funciones del sistema

2. Funciones de dilogo

3. Otras funciones

17. Uso de archivos de recursos xml

18. Esqueletos

1. Cazador de archivos

2. Hoja de clculo

19. Consejos y trucos


1. Men emergente

2. La aplicacin wxPython ms pequea

3. Aplicacin wxPython de un solo forro

4. Botn interactivo

5. Manejo de errores sin cuadros de dilogo

6. UndoRedoFramework

20. Garras

1. Tom

2. Editor

3. Kika

21. Apndice

1. ID de cursor

2. Estilos de wx.Frame

3. Base de datos de color estndar

4. Wx.Pen estilos

5. Estilos wx.Brush

6. Estilos de CalendarCtrl

7. Cdigos de teclado

22. Comentarios ...

Prefacio
El propsito de este tutorial es empezar con el kit de herramientas de wxPython, desde lo bsico hasta los
temas avanzados. Tiene muchos ejemplos de cdigo, no mucho hablar. Despus de eso, usted ser capaz de
excavar en ti mismo.

lista de correo

libro de referencia

Cdigo fuente de las aplicaciones wxPython

/home/vronskij/bin/wxPython/usr/lib/python2.4/site-packages/wx-2.6-gtk2-unicode/wx - el ltimo
recurso, en mi caja de Linux

Hay tres kits de herramientas decentes para el lenguaje de programacin python:


WxPython

Piedra

PyGTK

Tenga en cuenta que este tutorial se realiza en Linux. Algunas secuencias de comandos no funcionan
correctamente en Windows.

Iconos utilizados en este tutorial: icons.tgz Imgenes utilizadas en este tutorial: images.tgz

Enero bodnar 2005 - 2007

actualizacin de estado. (Abril de 2007) Todo mi trabajo en wxPython tutorial se ha trasladado a mi sitio
web http://www.zetcode.com/wxpython aqu no voy a aadir ms ejemplos. Si me encuentro algn tiempo,
har un poco de pulido.

API de wxPython
WxPython API es un conjunto de funciones y widgets. Los widgets son bloques de construccin esenciales
de una aplicacin GUI. En widgets de Windows se llama controles. Podemos dividir groseramente
programadores en dos grupos. Codifican aplicaciones o bibliotecas. En nuestro caso, wxPython es una
biblioteca que los programadores de aplicaciones utilizan para codificar aplicaciones. Tcnicamente,
wxPython es un contenedor sobre una API GUI de C ++ llamada wxWidgets. Por lo tanto, no es una API
nativa. Por ejemplo, no escrito directamente en Python. La nica biblioteca GUI nativa para un lenguaje
interpretado que conozco es la biblioteca Swing de Java.

En wxPython tenemos muchos widgets. Estos pueden ser divididos en algunos grupos lgicos.

Widgets de la base

Estos widgets proporcionan funcionalidad bsica para widgets derivados. Por lo general, no se utilizan
directamente.

Wx.Window

Wx.Control

Wx.ControlWithItem

Widgets de nivel superior

Estos widgets existen independientemente entre s.

Trama de wx

Wx.MDIParentFrame

Wx.MDIChildFrame

Wx.Dialog

Wx.PopupWindow
Contenedores

Los contenedores contienen otros widgets. Estos widgets se llaman children.

Wx.Panel

Wx.Notebook

Wx.ScrolledWindow

Wx.SplitterWindow

Widgets dinmicos

Estos widgets pueden ser editados por los usuarios.

Wx.Button

Wx.BitmapButton

Wx.Choice

Wx.ComboBox

Wx.CheckBox

Wx.gif

Wx.ListBox

Wx.RadioBox

Wx.RadioButton

Wx.ScrollBar

Wx.SpinButton

Wx.SpinCtrl

Wx.Slider

Wx.TextCtrl

Wx.ToggleButton

Widgets estticos

Estos widgets muestran informatin. No pueden ser editados por el usuario.

Wx.Gauge
Wx.StaticText

Wx.StaticBitmap

Wx.StaticLine

Wx.StaticBox

Otros widgets

Estos widgets implementan barra de estado, barra de herramientas y barra de mens en una aplicacin.

Wx.MenuBar

Wx.ToolBar

Wx.StatusBar

Primeros pasos
Comenzamos con un ejemplo simple.

#!/usr/bin/python

# simple.py

import wx

app = wx.App()

frame = wx.Frame(None, -1, 'simple.py')


frame.Show()

app.MainLoop()

En cada aplicacin wxPython, debemos importar la librera wx.

import wx
Un objeto de aplicacin se crea iniciando la clase wx.App .
App = wx.App ()

Creamos un widget de marco. La ventana slo aparece si llamamos al mtodo Show () en un widget.

Frame = wx.Frame (None, -1, "simple.py")


Frame.Show ()

La ltima lnea entra en un Mainloop. Un mainloop es un ciclo interminable que capta todos los eventos que
vienen a su aplicacin. Es una parte integral de cualquier aplicacin GUI de Windows.

App.MainLoop ()

Aunque el cdigo es muy simple, puedes hacer muchas cosas con tu ventana. Puede maximizarlo,
minimizarlo, moverlo, cambiar su tamao. Todas estas cosas ya han sido hechas.
Figura: simple.py

Wx.Window

Wx.Window es una clase base de la que heredan muchos widgets. Por ejemplo, el widget wx.Frame hereda
de wx.Window. Tcnicamente significa que podemos usar los mtodos de wx.Window para todos los
descendientes. Introduciremos aqu algunos de sus mtodos.

SetTitle (string title) - Establece el ttulo de la ventana. Aplicable slo a marcos y


cuadros de dilogo.

SetToolTip (wx.ToolTip tip) : adjunta una informacin de herramientas a la ventana.

SetSize (tamao wx.Size) - Establece el tamao de la ventana.

SetPosition (wx.Point pos) - Posiciona la ventana en coordenadas dadas

Show (show = True) - Muestra u oculta la ventana. Show puede ser True o False.

Move (wx.Point pos) - Mueve la ventana a la posicin dada.

SetCursor (wx.StockCursor id) - Establece el cursor de la ventana.

#!/usr/bin/python

# simple2.py

import wx

app = wx.App()

frame = wx.Frame(None, -1, '')


frame.SetToolTip(wx.ToolTip('This is a frame'))
frame.SetCursor(wx.StockCursor(wx.CURSOR_MAGNIFIER))
frame.SetPosition(wx.Point(0,0))
frame.SetSize(wx.Size(300,250))
frame.SetTitle('simple2.py')
frame.Show()

app.MainLoop()

Creamos un tooltip 'Esto es un marco'. El cursor se ajusta a un cursor de lupa. Posibles identificadores de
cursor: (ver parte inferior) Colocamos la ventana en la esquina superior izquierda y la clasificamos a
300x250 pxeles. El ttulo se establece en 'simple2.py'.

wx.Frame
Wx.Frame es un widget de contenedor. Esto significa que puede contener otros widgets. Tiene el constructor
siguiente:

wx.Frame(wx.Window parent, id, string title,


wx.Point pos = wx.DefaultPosition, wx.Size size = wx.DefaultSize,
style = wx.DEFAULT_FRAME_STYLE, string name = 'frame')

Un constructor es un tipo especial de una funcin. Se llama cuando se crea un objeto. Para nosotros es
importante que cuando queramos crear un nuevo widget, simplemente llamemos a su constructor. Python
habilita los parmetros con valores predeterminados. As que los nicos parmetros obligatorios en
wx.Frame son parent, id y title. Si especifica todos los valores de los parmetros en orden, no es necesario
especificar los nombres de los parmetros. Por ejemplo, desea crear un widget wx.Frame, que no tiene
padre, su identificador es 100, el ttulo es 'Ttulo', la posicin es (100,50) y el tamao es (100,100).

frame = wx.Frame(None, 100, 'Title', wx.Point(100,50), wx.Size(100,100))

Aqu hemos omitido el parmetro pos. Por lo tanto, debemos proporcionar explcitamente el parmetro size.

frame = wx.Frame(None, 100, 'Title', size = wx.Size(100,100))

En el siguiente ejemplo usaremos otras caractersticas tiles.

#!/usr/bin/python

# icon.py

import wx

def main():
app = wx.App()

frame = wx.Frame(None, title='Icon', pos=(350,300))


frame.SetIcon(wx.Icon('tipi.ico', wx.BITMAP_TYPE_ICO))
frame.Center()
frame.Show()
app.MainLoop()

if __name__ == '__main__':
main()

El nombre del icono es Tipi.ico. El icono se encuentra en el directorio actual. El primer parmetro del
constructor de un icono es el nombre del archivo. El segundo parmetro especifica el tipo de archivo.

Como usted ha notado, la estructura de nuestra aplicacin ha cambiado. Este es un estndar en los
programas de Python. En los programas de Python __name__ es una variable especial. Los programas ms
complicados consisten en varios archivos. Por lo general, slo hay un archivo, que inicia la aplicacin. Para
este archivo, Python establece la variable __name__ en '__main__' . Esto sucede cuando inicia una
aplicacin desde la lnea de comandos o cuando hace clic en el archivo. Por lo tanto, cuando hace clic en el
archivo icon.py o lo inicia desde la lnea de comandos, la variable __name__ equivale a '__main__' .
Entonces se llama a la funcin main () .
Figura: icon.py

Wx.MenuBar

Para configurar una barra de mens en su aplicacin wxPython es bastante simple. Discutiremos la adicin
de mens a la barra de mens, aadiendo submens a mens existentes. Cada men consta de men. Los
menudos pueden ser elementos normales, artculos de verificacin o artculos de radio.

Lo primero que hay que hacer es crear una barra de mens.

Menubar = wx.MenuBar ()

Luego creamos nuestros mens.

File = wx.Menu ()
Edit = wx.Menu ()
Help = wx.Menu ()

Luego agregamos algunos elementos al men. Esto se puede hacer de dos formas.

File.Append (101, '&Open', 'Abrir un nuevo documento')


File.Append (102, '&Save', 'Guardar el documento')

Podemos separar las secciones lgicas en los mens con una lnea horizontal.

File.AppendSeparator()

Si desea tener algunos iconos en sus mens, debe crear objetos MenuItem manualmente .

quit = wx.MenuItem(file, 105, '&Quit\tCtrl+Q', 'Quit the Application')


quit.SetBitmap(wx.Image('stock_exit-16.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap())
file.AppendItem(quit)

WxPython toolkit slo puede poner bitmaps en mens. Por lo tanto, tenemos que convertir nuestros archivos
PNG en mapas de bits.

Los mens se agregan a la barra de mens.

Menubar.Append(archivo, '&File')
Menubar.Append(editar, '&Editar')
Menubar.Append(ayuda, '&Ayuda')

Finalmente instalamos nuestra barra de mens en nuestra clase de aplicacin.

self.SetMenuBar(menubar)
Vamos a resumirlo en un pequeo guin.

#!/usr/bin/python

# menu1.py

import wx

class MyMenu(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(200,
150))

menubar = wx.MenuBar()
file = wx.Menu()
edit = wx.Menu()
help = wx.Menu()
file.Append(101, '&Open', 'Open a new document')
file.Append(102, '&Save', 'Save the document')
file.AppendSeparator()
quit = wx.MenuItem(file, 105, '&Quit\tCtrl+Q', 'Quit the Application')
quit.SetBitmap(wx.Image('stock_exit-16.png',
wx.BITMAP_TYPE_PNG).ConvertToBitmap())
file.AppendItem(quit)

menubar.Append(file, '&File')
menubar.Append(edit, '&Edit')
menubar.Append(help, '&Help')
self.SetMenuBar(menubar)
self.CreateStatusBar()

class MyApp(wx.App):
def OnInit(self):
frame = MyMenu(None, -1, 'menu1.py')
frame.Show(True)
return True

app = MyApp(0)
app.MainLoop()

Hasta ahora hemos visto los elementos de men normales predeterminados. Aqu vemos, cmo podemos
definir explcitamente elementos de verificacin, elementos normales o elementos de radio.

edit.Append(201, 'check item1', '', wx.ITEM_CHECK)


edit.Append(202, 'check item2', '', kind=wx.ITEM_CHECK)

Quit = wxMenuItem (archivo, 105, '& Quit \ tCtrl + Q', 'Salir de la aplicacin',
wx.ITEM_NORMAL)

El parmetro se denomina kind.

Posible wx.ItemKind-s

wx.ITEM_NORMAL - elemento predeterminado

wx.ITEM_CHECK - elemento de verificacin

wx.ITEM_RADIO - elemento de radio


Si desea crear un submen, primero cree un men.

Submenu = wx.Menu()

A continuacin, agregue algunos elementos de men a este submen.

Submen.Append (301, 'radio item1', tipo = wx.ITEM_RADIO)


Submen.Append (302, 'elemento de radio2', tipo = wx.ITEM_RADIO)
Submen.Append (302, 'radio item3', tipo = wx.ITEM_RADIO)

Finalizar con la adicin de un submen en el objeto de men principal.

edit.AppendMenu(203, 'submenu', submenu)

Ahora discutimos cmo responder a las acciones de los usuarios. Lo tocaremos brevemente y lo
explicaremos ms adelante con ms detalle.

As, cuando un usuario de nuestra aplicacin selecciona un elemento de men, se genera un evento.
Debemos proporcionar un manejador de eventos, que reaccionar a este evento en consecuencia. Manejar
eventos en wxPython es el ms elegante y simple que he visto hasta ahora. Cuando examinamos el libro de
referencia, encontramos el controlador wx.EVT_MENU en la seccin Manejo de eventos.

Supongamos que queremos agregar un controlador de eventos a nuestro elemento de men de salir.

wx.EVT_MENU(self, 105, self.OnQuit )

Tenemos que proporcionar tres elementos de informacin. El objeto, donde enlazamos nuestro controlador
de eventos. En nuestro caso, el objeto principal de la aplicacin. El ID del elemento de men
correspondiente. Y el nombre del mtodo, que har nuestro trabajo.

El mtodo que reaccionar a las acciones del usuario tiene dos parmetros. El primero es el objeto donde se
define este mtodo. El segundo es el evento generado. Esta vez, lo hacemos sin l. Simplemente cerramos
nuestra aplicacin.

def OnQuit(self, event):


self.Close()

La siguiente secuencia de comandos muestra varios elementos de men, submen y un controlador de


eventos simple. Para que la ventana de la aplicacin no aparezca en algn lugar en la esquina le agrego:

self.Centre()

De modo que la ventana aparezca en el centro de la pantalla.


Figura: menu1.py

#!/usr/bin/python

# menu2.py

import wx

class MyMenu(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(380,
250))

menubar = wx.MenuBar()
file = wx.Menu()
edit = wx.Menu()
help = wx.Menu()
file.Append(101, '&Open', 'Open a new document')
file.Append(102, '&Save', 'Save the document')
file.AppendSeparator()
quit = wx.MenuItem(file, 105, '&Quit\tCtrl+Q', 'Quit the Application')
quit.SetBitmap(wx.Image('stock_exit-
16.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap())
file.AppendItem(quit)
edit.Append(201, 'check item1', '', wx.ITEM_CHECK)
edit.Append(202, 'check item2', kind=wx.ITEM_CHECK)
submenu = wx.Menu()
submenu.Append(301, 'radio item1', kind=wx.ITEM_RADIO)
submenu.Append(302, 'radio item2', kind=wx.ITEM_RADIO)
submenu.Append(303, 'radio item3', kind=wx.ITEM_RADIO)
edit.AppendMenu(203, 'submenu', submenu)
menubar.Append(file, '&File')
menubar.Append(edit, '&Edit')
menubar.Append(help, '&Help')
self.SetMenuBar(menubar)
self.Centre()
self.Bind(wx.EVT_MENU, self.OnQuit, id=105)

def OnQuit(self, event):


self.Close()

class MyApp(wx.App):
def OnInit(self):
frame = MyMenu(None, -1, 'menu2.py')
frame.Show(True)
return True

app = MyApp(0)
app.MainLoop()
Figura: menu2.py

Wx.ToolBar

La barra de herramientas es un widget que agrupa los comandos o acciones ms utilizados de la aplicacin.
Tpicamente guardar, abrir, cortar, copiar, pegar, deshacer, rehacer, etc. Su propsito es ahorrar tiempo.
Necesita un clic para realizar una accin desde la barra de herramientas y dos clics en el men.

#!/usr/bin/python

# toolbar.py

import wx

class MyToolBar(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(350,
250))

vbox = wx.BoxSizer(wx.VERTICAL)
toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER)
toolbar.AddSimpleTool(1, wx.Image('stock_new.png',
wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
toolbar.AddSimpleTool(2, wx.Image('stock_open.png',
wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Open', '')
toolbar.AddSimpleTool(3, wx.Image('stock_save.png',
wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Save', '')
toolbar.AddSeparator()
toolbar.AddSimpleTool(4, wx.Image('stock_exit.png',
wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Exit', '')
toolbar.Realize()
vbox.Add(toolbar, 0, border=5)
self.SetSizer(vbox)
self.statusbar = self.CreateStatusBar()
self.Centre()

self.Bind(wx.EVT_TOOL, self.OnNew, id=1)


self.Bind(wx.EVT_TOOL, self.OnOpen, id=2)
self.Bind(wx.EVT_TOOL, self.OnSave, id=3)
self.Bind(wx.EVT_TOOL, self.OnExit, id=4)

def OnNew(self, event):


self.statusbar.SetStatusText('New Command')

def OnOpen(self, event):


self.statusbar.SetStatusText('Open Command')

def OnSave(self, event):


self.statusbar.SetStatusText('Save Command')

def OnExit(self, event):


self.Close()

class MyApp(wx.App):
def OnInit(self):
frame = MyToolBar(None, -1, 'toolbar.py')
frame.Show(True)
return True

app = MyApp(0)
app.MainLoop()
Wx.BoxSizer se explicar ms adelante en la seccin de diseo. El widget de la barra de herramientas se
crea en tres pasos.

En primer lugar, creamos un objeto de barra de herramientas.

toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER)

A continuacin, agregamos algunas herramientas a la barra de herramientas con el mtodo


AddSimpleTool() . No encuentra este mtodo en el libro de referencia. Es una "extensin" de wxPython.
Esto es una maldicin y tambin una bendicin. Hace la programacin de python ms fcil. Pero por otro
lado, estas extensiones son indocumentadas. Usted tiene que mirar el cdigo de contenedor, ejemplo de
demostracin o pedir en la lista de correo.

toolbar.AddSimpleTool(1, wx.Image('stock_new.png',
wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')

Al final, llamamos el mtodo Realize () . Este mtodo muestra o muestra el widget de la barra de
herramientas.

Toolbar.Realize()

El widget de la barra de herramientas tiene varios controladores de eventos. Al hacer clic en un icono de la
barra de herramientas, se genera un evento wx.EVT_COMMAND_TOOL_CLICKED. Vinculamos este
evento a un mtodo especificado con el controlador wx.EVT_TOOL.

Con el fin de mostrar algn resultado significativo para nuestros eventos, hemos configurado una barra de
estado.

self.statusbar = self.CreateStatusBar()

Esta es otra extensin wxPython. As que cuando hacemos clic en un botn de la barra de herramientas,
aparece un mensaje en la barra de estado. Esto se hace con el mtodo SetStatusText () .

Figura: toolbar.py

Gestin de layout
Hay bsicamente dos mtodos para el diseo de nuestros widgets. El primer mtodo es manual. Colocamos
widgets especificando la posicin en el constructor del widget.
#!/usr/bin/python

# layout.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(250,
50))

panel = wx.Panel(self, -1)


wx.Button(panel, -1, "Button1", (0,0))
wx.Button(panel, -1, "Button2", (80,0))
wx.Button(panel, -1, "Button3", (160,0))

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'layout.py')
frame.Show(True)
frame.Centre()
return True

app = MyApp(0)
app.MainLoop()

Cuando se cambia el tamao de la ventana, el tamao y la posicin de los botones no cambian. Esta es una
de las principales caractersticas del posicionamiento manual de los widgets.

Figura: layout.py

El segundo mtodo consiste en utilizar gestores de layout. Este mtodo es frecuente en programas reales.
Bsicamente, usted utiliza sizers. Discutiremos

Wx.BoxSizer

Wx.StaticBoxSizer

Wx.GridSizer

Wx.GridBagSizer

Wx.BoxSizer

Hagamos un programa en el que tres botones ocuparn una fila colocada en la parte superior de la ventana.
Estos botones cambiarn de tamao cuando se cambie el tamao de la ventana.

#!/usr/bin/python

# wxboxsizer.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, (-1, -1), wx.Size(250, 50))
panel = wx.Panel(self, -1)
box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(wx.Button(panel, -1, 'Button1'), 1 )
box.Add(wx.Button(panel, -1, 'Button2'), 1 )
box.Add(wx.Button(panel, -1, 'Button3'), 1 )
panel.SetSizer(box)
self.Centre()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'wxboxsizer.py')
frame.Show(True)
return True

app = MyApp(0)
app.MainLoop()

Podemos colocar widgets vertical u horizontalmente.

box = wx.BoxSizer(integer orient)

Donde la orientacin puede ser wx.VERTICAL o wx.HORIZONTAL . La adicin de widgets al wx.BoxSizer se


realiza mediante el mtodo Add () . Para entenderlo, necesitamos mirar sus parmetros.

Add(wx.Window window, integer proportion=0, integer flag = 0, integer border = 0

Figura: wxboxsizer.py

El parmetro de proporcin define la proporcin o proporcin de espacio del generador disponible que el
widget ocupar en la direccin de la orientacin definida. Supongamos que tenemos tres botones con las
proporciones 0, 1 y 2. Se aaden a un wx.BoxSizer horizontal . El botn con la proporcin 0 no cambiar
en absoluto cuando cambie el ancho del tamao del generador (tamao horizontal) (es decir, el botn
siempre tendr el mismo ancho). El resto del ancho del clasificador se divide en 3 (2 + 1) acciones. El botn
con la proporcin 2 ocupar siempre 2 de esas 3 partes (su anchura ser 2/3 del ancho disponible), y el botn
con la proporcin 1 ocupar siempre una de esas acciones.

Con el parmetro flag, puede configurar adicionalmente el comportamiento de los widgets dentro de un
wx.BoxSizer . Podemos controlar la frontera (aunque "relleno" sera un nombre ms exacto que "borde")
entre los widgets. Aadimos un poco de espacio entre widgets en pxeles. Para aplicar la frontera,
necesitamos definir qu lados usarn el borde. Podemos elegir entre estas banderas:

Wx.LEFT

Wx.RIGHT

Wx.BOTTOM

Wx.TOP

Wx.ALL
Podemos combinarlos con el | operador. P.ej. wx.LEFT | Wx.BOTTOM . Si utilizamos el indicador
wx.EXPAND , nuestro widget usar todo el espacio que est disponible en la direccin perpendicular a la
direccin orientar del generador. Por ltimo, tambin podemos definir la alineacin de nuestros widgets. Lo
hacemos con las siguientes banderas:

Wx.ALIGN_LEFT

Wx.ALIGN_RIGHT

Wx.ALIGN_TOP

Wx.ALIGN_BOTTOM

Wx.ALIGN_CENTER_VERTICAL

Wx.ALIGN_CENTER_HORIZONTAL

Wx.ALIGN_CENTER

Un ejemplo:

#!/usr/bin/python

# layout3.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, (-1, -1), wx.Size(450, 300))

panel = wx.Panel(self, -1)


box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(wx.Button(panel, -1, 'Button1'), 1, wx.ALL, 5)
box.Add(wx.Button(panel, -1, 'Button2'), 0, wx.EXPAND)
box.Add(wx.Button(panel, -1, 'Button3'), 0, wx.ALIGN_CENTER)
panel.SetSizer(box)
self.Centre()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'layout3.py')
frame.Show(True)
return True

app = MyApp(0)
app.MainLoop()

En nuestro ejemplo tenemos nuevamente tres botones. El primero tiene un borde alrededor de todos sus
lados. Es el nico que cambia en la dimensin horizontal cuando se redimensiona la ventana principal. La
segunda ocupa todo el espacio que se le asigna en la direccin vertical. El tercero est alineado en el centro.

Podemos combinar varios wx.BoxSizer-s . Por ejemplo, podemos poner varios wx.BoxSizer -s
horizontales en un wx.BoxSizer vertical y viceversa . De esta manera podemos hacer diseos
complejos.

#!/usr/bin/python

# borders.py
import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):

wx.Frame.__init__(self, parent, id, title)


hbox = wx.BoxSizer(wx.HORIZONTAL)
pnl1 = wx.Panel(self, -1, style=wx.SIMPLE_BORDER)
pnl2 = wx.Panel(self, -1, style=wx.RAISED_BORDER)
pnl3 = wx.Panel(self, -1, style=wx.SUNKEN_BORDER)
pnl4 = wx.Panel(self, -1, style=wx.NO_BORDER)

hbox.Add(pnl1, 1, wx.EXPAND | wx.ALL, 3)


hbox.Add(pnl2, 1, wx.EXPAND | wx.ALL, 3)
hbox.Add(pnl3, 1, wx.EXPAND | wx.ALL, 3)
hbox.Add(pnl4, 1, wx.EXPAND | wx.ALL, 3)

self.SetSize((400, 120))
self.SetSizer(hbox)
self.Centre()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'borders.py')
frame.Show(True)
return True

app = MyApp(0)
app.MainLoop()

Mostramos cuatro estilos de borde diferentes disponibles en wxPython. La frontera es una decoracin simple
de la ventana.

Fronteras disponibles:

Wx.SIMPLE_BORDER

Wx.RAISED_BORDER

Wx.SUNKEN_BORDER

Wx.NO_BORDER

Wx.GridSizer

Wx.GridSizer establece a sus hijos en una tabla bidimensional. El ancho de cada campo es el ancho del
nio ms ancho. La altura de cada campo es la altura del nio ms alto.

wx.GridSizer(integer rows, integer cols, integer vgap, integer hgap)


En el constructor proporcionamos el nmero de filas y el nmero de columnas de nuestra tabla y la
diferencia horizontal y vertical entre los widgets infantiles. Insertamos nuestros widgets en la tabla con el
mtodo AddMany () . Los nios se insertan de izquierda a derecha, de arriba a abajo.

#!/usr/bin/python

# calculator.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):

wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(300,


250))
self.formula = False
menubar = wx.MenuBar()
file = wx.Menu()
file.Append(22, '&Quit', 'Exit Calculator')
menubar.Append(file, '&File')
self.SetMenuBar(menubar)
wx.EVT_MENU(self, 22, self.OnClose)
sizer = wx.BoxSizer(wx.VERTICAL)
self.display = wx.TextCtrl(self, -1, '', style=wx.TE_RIGHT)
sizer.Add(self.display, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 4)

gs = wx.GridSizer(4, 4, 3, 3)
gs.AddMany([(wx.Button(self, 20, 'Cls'), 0, wx.EXPAND),
(wx.Button(self, 21, 'Bck'), 0, wx.EXPAND),
(wx.StaticText(self, -1, ''), 0, wx.EXPAND),
(wx.Button(self, 22, 'Close'), 0, wx.EXPAND),
(wx.Button(self, 1, '7'), 0, wx.EXPAND),
(wx.Button(self, 2, '8'), 0, wx.EXPAND),
(wx.Button(self, 3, '9'), 0, wx.EXPAND),
(wx.Button(self, 4, '/'), 0, wx.EXPAND),
(wx.Button(self, 5, '4'), 0, wx.EXPAND),
(wx.Button(self, 6, '5'), 0, wx.EXPAND),
(wx.Button(self, 7, '6'), 0, wx.EXPAND),
(wx.Button(self, 8, '*'), 0, wx.EXPAND),
(wx.Button(self, 9, '1'), 0, wx.EXPAND),
(wx.Button(self, 10, '2'), 0, wx.EXPAND),
(wx.Button(self, 11, '3'), 0, wx.EXPAND),
(wx.Button(self, 12, '-'), 0, wx.EXPAND),
(wx.Button(self, 13, '0'), 0, wx.EXPAND),
(wx.Button(self, 14, '.'), 0, wx.EXPAND),
(wx.Button(self, 15, '='), 0, wx.EXPAND),
(wx.Button(self, 16, '+'), 0, wx.EXPAND) ])

sizer.Add(gs, 1, wx.EXPAND)

self.SetSizer(sizer)
self.Centre()

self.Bind(wx.EVT_BUTTON, self.OnClear, id=20)


self.Bind(wx.EVT_BUTTON, self.OnBackspace, id=21)
self.Bind(wx.EVT_BUTTON, self.OnClose, id=22)
self.Bind(wx.EVT_BUTTON, self.OnSeven, id=1)
self.Bind(wx.EVT_BUTTON, self.OnEight, id=2)
self.Bind(wx.EVT_BUTTON, self.OnNine, id=3)
self.Bind(wx.EVT_BUTTON, self.OnDivide, id=4)
self.Bind(wx.EVT_BUTTON, self.OnFour, id=5)
self.Bind(wx.EVT_BUTTON, self.OnFive, id=6)
self.Bind(wx.EVT_BUTTON, self.OnSix, id=7)
self.Bind(wx.EVT_BUTTON, self.OnMultiply, id=8)
self.Bind(wx.EVT_BUTTON, self.OnOne, id=9)
self.Bind(wx.EVT_BUTTON, self.OnTwo, id=10)
self.Bind(wx.EVT_BUTTON, self.OnThree, id=11)
self.Bind(wx.EVT_BUTTON, self.OnMinus, id=12)
self.Bind(wx.EVT_BUTTON, self.OnZero, id=13)
self.Bind(wx.EVT_BUTTON, self.OnDot, id=14)
self.Bind(wx.EVT_BUTTON, self.OnEqual, id=15)
self.Bind(wx.EVT_BUTTON, self.OnPlus, id=16)

def OnClear(self, event):


self.display.Clear()

def OnBackspace(self, event):


formula = self.display.GetValue()
self.display.Clear()
self.display.SetValue(formula[:-1])

def OnClose(self, event):


self.Close()

def OnDivide(self, event):


if self.formula:
return
self.display.AppendText('/')

def OnMultiply(self, event):


if self.formula:
return
self.display.AppendText('*')

def OnMinus(self, event):


if self.formula:
return
self.display.AppendText('-')

def OnPlus(self, event):


if self.formula:
return
self.display.AppendText('+')

def OnDot(self, event):


if self.formula:
return
self.display.AppendText('.')

def OnEqual(self, event):


if self.formula:
return
formula = self.display.GetValue()
self.formula = False
try:
self.display.Clear()
output = eval(formula)
self.display.AppendText(str(output))
except StandardError:
self.display.AppendText("Error")

def OnZero(self, event):


if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('0')

def OnOne(self, event):


if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('1')
def OnTwo(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('2')

def OnThree(self, event):


if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('3')

def OnFour(self, event):


if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('4')

def OnFive(self, event):


if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('5')

def OnSix(self, event):


if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('6')

def OnSeven(self, event):


if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('7')

def OnEight(self, event):


if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('8')

def OnNine(self, event):


if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('9')

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'calculator.py')
frame.Show(True)
self.SetTopWindow(frame)
return True

app = MyApp(0)
app.MainLoop()

La frmula que introducimos es procesada por la funcin python incorporada eval.

output = eval(formula)

Si hacemos un error en nuestra frmula, se muestra un mensaje de error. Observe cmo conseguimos poner
un espacio entre los botones Bck y Close. Simplemente ponemos un wx.StaticText vaco all . Tales
trucos son bastante comunes.
Figura: calculator.py

Wx.GridBagSizer

El calibrador ms complicado en wxPython. Permite el posicionamiento explcito de los elementos. Los


elementos tambin pueden abarcar ms de una fila y / o columna. Wx.GridBagSizer tiene un constructor
simple.

wx.GridBagSizer(integer vgap, integer hgap)

La separacin vertical y horizontal define el espacio en pxeles utilizado entre los nios. Agregue elementos
a la cuadrcula con el mtodo Add ().

Add(self, item, tuple pos, tuple span=wx.DefaultSpan, integer flag=0, integer border=0,
userData=None)

El elemento es un widget que inserta en la cuadrcula. Pos especifica la posicin en la cuadrcula virtual. La
celda topleft tiene pos de (0, 0). Span es una extensin opcional del widget. Por ejemplo, span de (3, 2)
abarca un widget a travs de 3 filas y 2 columnas. Bandera y frontera fueron discutidos anteriormente por
wx.BoxSizer .

Los elementos de la cuadrcula pueden cambiar su tamao o mantener el tamao predeterminado, cuando se
cambia el tamao de la ventana. Si desea que sus elementos crezcan y se reduzcan, puede utilizar estos dos
mtodos.

AddGrowableRow(integer row)
AddGrowableCol(integer col)

#!/usr/bin/python

# wxgridbagsizer.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition)

sizer = wx.GridBagSizer(9, 9)
sizer.Add(wx.Button(self,-1, "Button"), (0, 0), wx.DefaultSpan, wx.ALL, 5)
sizer.Add(wx.Button(self,-1, "Button"), (1, 1), (1,7), wx.EXPAND)
sizer.Add(wx.Button(self,-1, "Button"), (6, 6), (3,3), wx.EXPAND)
sizer.Add(wx.Button(self,-1, "Button"), (3, 0), (1,1), wx.ALIGN_CENTER)
sizer.Add(wx.Button(self,-1, "Button"), (4, 0), (1,1), wx.ALIGN_LEFT)
sizer.Add(wx.Button(self,-1, "Button"), (5, 0), (1,1), wx.ALIGN_RIGHT)
sizer.AddGrowableRow(6)
sizer.AddGrowableCol(6)

self.SetSizerAndFit(sizer)
self.Centre()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, "wxgridbagsizer.py")
frame.Show(True)
self.SetTopWindow(frame)
return True

app = MyApp(0)
app.MainLoop()

Si desea que su elemento abarque ms de una celda, debe proporcionar el indicador wx.EXPAND .

self.SetSizerAndFit(sizer)

Este mtodo es igual que SetSizer() excepto que tambin enva sugerencias de tamao a la ventana.
Todos los botones se muestran en la ventana.

Objetos bsicos
WxPython es una coleccin de varios objetos. Podemos dividirlos en dos grupos.

Objetos visuales

Objetos no visuales

Ejemplos de objetos visuales son: widgets, fuentes, colores o cursores. Objetos no visuales: calibradores
(sizers), temporizadores (timers) o eventos.

Cursores

Un cursor es un objeto grfico simple. Se utiliza para indicar la posicin en el monitor o en cualquier otro
dispositivo de visualizacin. Por lo general, cambia dinmicamente. Normalmente, cuando coloca un
puntero del ratn sobre un hipertexto, el cursor cambia a una mano.

En el siguiente ejemplo de cdigo, creamos una cuadrcula de nueve wx.Panels . Cada panel muestra
un cursor diferente.

#!/usr/bin/python

# cursors.py

import wx

class Cursors(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)

vbox = wx.BoxSizer(wx.VERTICAL)
sizer = wx.GridSizer(3, 3, 2, 2)

cursors = [ wx.CURSOR_ARROW, wx.CURSOR_HAND, wx.CURSOR_WATCH,


wx.CURSOR_SPRAYCAN, wx.CURSOR_PENCIL,
wx.CURSOR_CROSS, wx.CURSOR_QUESTION_ARROW, wx.CURSOR_POINT_LEFT,
wx.CURSOR_SIZING]

for i in cursors:
panel = wx.Panel(self, -1, style=wx.SUNKEN_BORDER)
panel.SetCursor(wx.StockCursor(i))
sizer.Add(panel, flag=wx.EXPAND)

vbox.Add(sizer, 1, wx.EXPAND | wx.TOP, 5)


self.SetSizer(vbox)

self.Centre()
self.Show()

app = wx.App(0)
Cursors(None, -1, 'Cursors.py')
app.MainLoop()

Varios cursores predefinidos: Listados abajo.

Fuentes

Creamos diferentes tipos de fuentes con el objeto wx.Font. Tiene el constructor siguiente:

wx.Font(integer pointSize, wx.FontFamily family, integer style, integer weight,


bool underline = false, string faceName = '',
wx.FontEncoding encoding = wx.FONTENCODING_DEFAULT)

Los parmetros especificados pueden tener las siguientes opciones:

family:

wx.DEFAULT

wx.DECORATIVE

wx.ROMAN

wx.SWISS

wx.SCRIPT

wx.MODERN

style:

wx.NORMAL

wx.SLANT

wx.ITALIC

weight:

wx.NORMAL
wx.LIGHT

wx.BOLD

El script fonts.py muestra tres fuentes diferentes.

#!/usr/bin/python

# fonts.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(325,
320))

panel = wx.Panel(self, -1)

text1 = "Now listen to me mama\nMama mama\nYou're taking away my last


chance\nDon't take it away"

text2 = '''You won't cry for my absence, I know -


You forgot me long ago.
Am I that unimportant...?
Am I so insignificant...?
Isn't something missing?
Isn't someone missing me?'''

text3 = '''But if I had one wish fulfilled tonight


I'd ask for the sun to never rise
If God passed a mic to me to speak
I'd say stay in bed, world
Sleep in peace'''

font1 = wx.Font(10, wx.NORMAL, wx.ITALIC, wx.NORMAL)


font2 = wx.Font(10, wx.ROMAN, wx.NORMAL, wx.NORMAL)
font3 = wx.Font(10, wx.MODERN, wx.NORMAL, wx.BOLD)
lyrics1 = wx.StaticText(panel, -1, text1,(30,15), style=wx.ALIGN_CENTRE)
lyrics1.SetFont(font1)
lyrics2 = wx.StaticText(panel, -1, text2,(30,100), style=wx.ALIGN_CENTRE)
lyrics2.SetFont(font2)
lyrics3 = wx.StaticText(panel, -1, text3,(5,220), style=wx.ALIGN_CENTRE)
lyrics3.SetFont(font3)
self.Center()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'fonts.py')
frame.Show(True)
self.SetTopWindow(frame)
return True

app = MyApp(0)
app.MainLoop()
Figura: fonts.py

Colores

Un color es un objeto que representa una combinacin de valores de intensidad de rojo, verde y azul (RGB).
Los valores vlidos de RGB estn en el rango de 0 a 255.

Hay tres maneras de configurar los colores. Podemos crear un objeto wx.Colour, usar un nombre de color
predefinido o usar una cadena de valor hexadecimal.

SetBackgroundColour(wx.Colour(0,0,255))
SetBackgroundColour('BLUE')
SetBackgroundColour('#0000FF'

Nombres de colores predefinidos en wxPython:

wx.BLACK
wx.WHITE
wx.RED
wx.BLUE
wx.GREEN
wx.CYAN
wx.LIGHT_GREY

Base de datos de color estndar:

Listado a continuacin.

El script colours.py muestra ocho colores diferentes. WxBlack es simple. El verde del mar es potico y #
0000FF tcnico. Depende del desarrollador, qu elegir.

#!/usr/bin/python

# colours.py
import wx

class Colours(wx.Dialog):
def __init__(self, parent, id, title):

wx.Dialog.__init__(self, parent, id, title, size=(300, 300))


vbox = wx.BoxSizer(wx.VERTICAL)
self.pnl1 = wx.Panel(self, -1)
self.pnl2 = wx.Panel(self, -1)
self.pnl3 = wx.Panel(self, -1)
self.pnl4 = wx.Panel(self, -1)
self.pnl5 = wx.Panel(self, -1)
self.pnl6 = wx.Panel(self, -1)
self.pnl7 = wx.Panel(self, -1)
self.pnl8 = wx.Panel(self, -1)

gs = wx.GridSizer(4,2,3,3)
gs.AddMany([ (self.pnl1, 0 ,wx.EXPAND),
(self.pnl2, 0, wx.EXPAND),
(self.pnl3, 0, wx.EXPAND),
(self.pnl4, 0, wx.EXPAND),
(self.pnl5, 0, wx.EXPAND),
(self.pnl6, 0, wx.EXPAND),
(self.pnl7, 0, wx.EXPAND),
(self.pnl8, 0, wx.EXPAND) ])

vbox.Add(gs, 1, wx.EXPAND | wx.TOP, 5)


self.SetSizer(vbox)
self.SetColors()
self.Centre()
self.ShowModal()
self.Destroy()

def SetColors(self):
self.pnl1.SetBackgroundColour(wx.BLACK)
self.pnl2.SetBackgroundColour(wx.Colour(139,105,20))
self.pnl3.SetBackgroundColour(wx.RED)
self.pnl4.SetBackgroundColour('#0000FF')
self.pnl5.SetBackgroundColour('sea green')
self.pnl6.SetBackgroundColour('midnight blue')
self.pnl7.SetBackgroundColour(wx.LIGHT_GREY)
self.pnl8.SetBackgroundColour('plum')

app = wx.App(0)
Colours(None, -1, 'colours.py')
app.MainLoop()
Figura: color.py

La base de datos completa tiene actualmente cerca de 630 nombres de colores diferentes. La lista se puede
encontrar en el archivo colourdb.py. Tambin se muestra en la demo wxPython. En randomcolours.py script
tenemos una sola ventana. Cambiamos el color de fondo de la ventana al color elegido aleatoriamente.

#!/usr/bin/python

# randomcolours.py

import wx

from random import randrange


from wx.lib.colourdb import *

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(400,
350))

self.panel = wx.Panel(self, -1)


self.colors = getColourList()
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
self.timer.Start(1500)
self.col_num = len(self.colors)
self.Centre()

def OnTimer(self, event):


self.panel.SetBackgroundColour(wx.RED)
position = randrange(0, self.col_num-1, 1)
self.panel.SetBackgroundColour(self.colors[position])
self.panel.Refresh()

class MyApp(wx.App):
def OnInit(self):
updateColourDB()
frame = MyFrame(None, -1, 'randomcolours.py')
frame.Show(True)
self.SetTopWindow(frame)
return True

app = MyApp(0)
app.MainLoop()

Mapas de bits

Hay dos tipos de grficos. Vector y mapa de bits . Con grficos vectoriales, las imgenes se crean con
frmulas matemticas que definen todas las formas de la imagen. Se utilizan objetos geomtricos como
curvas y polgonos. Un mapa de bits o un mapa de bits es una coleccin de bits que forman una imagen. Es
una cuadrcula de puntos individuales almacenados en la memoria o en un archivo. Cada punto tiene su
propio color. Cuando se muestra la imagen, el ordenador transfiere un mapa de bits en pxeles en monitores
o puntos de tinta en las impresoras. La calidad de un mapa de bits se determina por la resolucin y la
profundidad de color de la imagen. La resolucin es el nmero total de pxeles en la imagen. La
profundidad de color es la cantidad de informacin en cada pxel.

Hay varios tipos de mapas de bits:

PNG

JPEG

GIF

PELEA

BMP

#!/usr/bin/python

# bitmap.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size = (270, 270))

self.bitmap = wx.Bitmap('memento.jpg')
wx.EVT_PAINT(self, self.OnPaint)

self.Centre()

def OnPaint(self, event):


dc = wx.PaintDC(self)
dc.DrawBitmap(self.bitmap, 60, 20)

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'Memento')
frame.Show(True)
self.SetTopWindow(frame)
return True

app = MyApp(0)
app.MainLoop()
Figura: bitmap.py

Eventos
Los eventos son parte integral de todas las aplicaciones GUI. Todas las aplicaciones GUI estn orientadas a
eventos. Una aplicacin reacciona a diferentes tipos de eventos que se generan durante su vida til. Los
eventos son generados principalmente por el usuario de una aplicacin. Pero tambin pueden ser generados
por otros medios. Por ejemplo conexin a internet, administrador de ventanas, temporizador. As que cuando
llamamos MainLoop() mtodo, nuestra aplicacin espera a que se generen los eventos. El mtodo
MainLoop() finaliza cuando salimos de la aplicacin.

Trabajar con eventos es sencillo en wxPython. Hay tres pasos:

Identifique el nombre del evento: wx.EVT_SIZE, wx.EVT_CLOSE etc

Cree un controlador de eventos. Es un mtodo, que se llama, cuando se genera un evento

Vincular un evento a un controlador de eventos.

En wxPython decimos unir un mtodo a un evento. A veces se utiliza un gancho de palabra.

Vincular un evento llamando al mtodo Bind () . El mtodo tiene los siguientes parmetros:

Bind (evento, manejador, source = None, id = wx.ID_ANY, id2 = wx.ID_ANY)

Evento es uno de EVT_ * objetos. Especifica el tipo del evento.

Handler es un objeto a ser llamado. En otras palabras, es un mtodo, que un programador se une a un
evento.

El parmetro source se utiliza cuando queremos diferenciar entre el mismo tipo de evento de
diferentes widgets.

Id parmetro se utiliza, cuando tenemos mltiples botones, elementos de men, etc El ID se utiliza
para diferenciar entre ellos.
Id2 se utiliza cuando es deseable enlazar un manejador a un rango de ids, como con
EVT_MENU_RANGE.

Tenga en cuenta que el mtodo Bind () se define en la clase EvtHandler . Es la clase, de la que
wx.Window hereda. Wx.Window es una clase base para la mayora de widgets en wxPython. Tambin hay
un proceso inverso. Si queremos desvincular un mtodo de un evento, llamamos al mtodo Unbind () .
Tiene los mismos parmetro que el anterior.

Eventos posibles

Wx.Event La clase base del evento

Wx.ActivateEvent Un evento de activacin de ventana o aplicacin

Wx.CloseEvent Una ventana de cierre o un evento de sesin final

Wx.EraseEvent Un evento de fondo de borrado

Wx.FocusEvent Un evento de enfoque de ventana

Wx.KeyEvent Un evento de pulsaciones de teclas

Wx.IdleEvent Un evento inactivo

Wx.InitDialogEvent Un evento de inicializacin de dilogo

Wx.JoystickEvent Un evento de joystick

Wx.MenuEvent Un evento de men

Wx.MouseEvent Un evento de ratn

Wx.MoveEvent Un evento de movimiento

Wx.PaintEvent Un evento de pintura

Wx.QueryLayoutInfoEvent Utilizado para consultar la informacin de diseo


Wx.SetCursorEvent
Utilizado para el procesamiento especial del cursor basado en la posicin
actual del ratn

Wx.SizeEvent Un evento de tamao

Wx.ScrollWinEvent
Un evento de desplazamiento enviado por una barra de desplazamiento
incorporada

Wx.ScrollEvent
Un evento de desplazamiento enviado por una barra de desplazamiento
independiente

Wx.SysColourChangedEvent Un evento de cambio de color del sistema

Ejemplos

El siguiente cdigo es un ejemplo de un wx.ScrollWinEvent . Este evento se genera, cuando hacemos clic
en una barra de desplazamiento incorporada. La barra de desplazamiento incorporada se activa con la
llamada al mtodo SetScrollbar () . Para las barras de desplazamiento independientes, hay otro tipo de
evento, a saber, wx.ScrollEvent .

#!/usr/bin/python

# myscrollwinevent.py

import wx

class MyScrollWinEvent(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)
panel = wx.Panel(self, -1)
self.st = wx.StaticText(panel, -1, '0', (30,0))
panel.Bind(wx.EVT_SCROLLWIN, self.OnScroll)
panel.SetScrollbar(wx.VERTICAL, 0, 6, 50);
self.Centre()

def OnScroll(self, evt):


y = evt.GetPosition()
self.st.SetLabel(str(y))

class MyApp(wx.App):
def OnInit(self):
msw = MyScrollWinEvent(None, -1, 'myscrollwinevent.py')
msw.Show(True)
return True

app = MyApp(0)
app.MainLoop()

El wx.SizeEvent se genera, cuando se redimensiona nuestra ventana. En nuestro ejemplo, mostramos el


tamao de la ventana en la barra de ttulo.

#!/usr/bin/python

# sizeevent.py
import wx

class SizeEvent(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)

self.Bind(wx.EVT_SIZE, self.OnSize)
self.Centre()

def OnSize(self, event):


self.SetTitle(str(event.GetSize()))

class MyApp(wx.App):
def OnInit(self):
se = SizeEvent(None, -1, 'sizeevent.py')
se.Show(True)
return True

app = MyApp(0)
app.MainLoop()

#!/usr/bin/python

# moveevent.py

import wx

class MoveEvent(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)

wx.StaticText(self, -1, 'x:', (10,0))


wx.StaticText(self, -1, 'y:', (10,20))
self.st1 = wx.StaticText(self, -1, '', (30, 0))
self.st2 = wx.StaticText(self, -1, '', (30, 20))
self.Bind(wx.EVT_MOVE, self.OnMove)
self.Centre()

def OnMove(self, event):


x, y = event.GetPosition()
self.st1.SetLabel(str(x))
self.st2.SetLabel(str(y))

class MyApp(wx.App):
def OnInit(self):
me = MoveEvent(None, -1, 'moveevent.py')
me.Show(True)
return True

app = MyApp(0)
app.MainLoop()

Se genera un evento de pintura cuando se vuelve a dibujar una ventana. Esto ocurre cuando cambiamos el
tamao de la ventana, maximizarla. Tambin se puede generar un evento de pintura mediante programacin.
Por ejemplo, cuando llamamos al mtodo SetLabel () para cambiar un widget wxStaticText . Tenga en
cuenta que cuando minimizamos una ventana, no se genera ningn evento de pintura.

#!/usr/bin/python

# paintevent.py

import wx
class PaintEvent(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)

self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Centre()

def OnPaint(self, event):


wx.Bell()

class MyApp(wx.App):
def OnInit(self):
pe = PaintEvent(None, -1, 'paintevent.py')
pe.Show(True)
return True

app = MyApp(0)
app.MainLoop()

Cuando pulsamos una tecla en nuestro teclado, wx.KeyEvent se genera. Hay tres manejadores de claves
diferentes:

EVT_KEY_DOWN

EVT_KEY_UP

EVT_CHAR

Una solicitud comn es cerrar la aplicacin, cuando se pulsa la tecla Esc.

#!/usr/bin/python

# keyevent.py

import wx

class KeyEvent(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)

panel = wx.Panel(self, -1)


panel.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
panel.SetFocus()

self.Centre()
self.Show(True)

def OnKeyDown(self, event):


keycode = event.GetKeyCode()
if keycode == wx.WXK_ESCAPE:
ret = wx.MessageBox('Are you sure to quit?', 'Question', wx.YES_NO |
wx.CENTRE |
wx.NO_DEFAULT, self)
if ret == wx.YES:
self.Close()
event.Skip()

app = wx.App()
KeyEvent(None, -1, 'keyevent.py')
app.MainLoop()
, qu clave fue pulsada llamando al mtodo GetKeyCode () . En nuestro caso, keycode es
Descubrimos
wx.WXK_ESCAPE.

keycode = event.GetKeyCode()

A continuacin se enumeran otros cdigos de teclado .

Dilogos
En wxPython puedes usar dilogos predefinidos o crear tus propios dilogos. Tambin puede crear
aplicaciones basadas en dilogos.

El ejemplo muestra un esqueleto de una aplicacin basada en dilogo en wxPython.

#!/usr/bin/python
# simpledialog.py

import wx

class MyDialog(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title)

class MyApp(wx.App):
def OnInit(self):
dia = MyDialog(None, -1, "simpledialog.py")
dia.ShowModal()
dia.Destroy()
return True

app = MyApp(0)
app.MainLoop()

Observe que no puede cambiar el tamao de la ventana de dilogo. El mtodo Destroy() es necesario.
Elimina el dilogo de la memoria. De lo contrario, el script no saldra correctamente.

Hay dos tipos de dilogos. Modal y sin modelo. El dilogo modal no permite que un usuario trabaje con el
resto de la aplicacin hasta que se destruya. Los dilogos modales se crean con el mtodo ShowModal () .
Los cuadros de dilogo son modales cuando se llaman con Show () .

Cuadros de dilogo personalizados

Hay dos mtodos que simplifican la creacin de dilogos. Ambos devuelven un objeto sizer especfico.

CreateTextSizer(self, string message)


CreateButtonSizer(self, long flags)

El mtodo CreateTextSizer () crea un clasificador de texto. En el siguiente ejemplo, agregamos


algunos botones al sizer para demostrarlo.

#!/usr/bin/python

# customdialog1.py

import wx

class MyDialog(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title, size=(350,300))
sizer = self.CreateTextSizer('My Buttons')
sizer.Add(wx.Button(self, -1, 'Button'), 0, wx.ALL, 5)
sizer.Add(wx.Button(self, -1, 'Button'), 0, wx.ALL, 5)
sizer.Add(wx.Button(self, -1, 'Button'), 0, wx.ALL, 5)
sizer.Add(wx.Button(self, -1, 'Button'), 0, wx.ALL|wx.ALIGN_CENTER, 5)
sizer.Add(wx.Button(self, -1, 'Button'), 0, wx.ALL|wx.EXPAND, 5)
self.SetSizer(sizer)

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(550,500))

panel = wx.Panel(self, -1)


wx.Button(panel, 1, 'Show Custom Dialog', (100,100))
self.Bind (wx.EVT_BUTTON, self.OnShowCustomDialog, id=1)

def OnShowCustomDialog(self, event):


dia = MyDialog(self, -1, 'buttons')
dia.ShowModal()
dia.Destroy()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'customdialog1.py')
frame.Show(True)
frame.Centre()
return True

app = MyApp(0)
app.MainLoop()

El mtodo CreateButtonSizer () crea una fila de botones. Puede especificar tipos de botones con
diferentes banderas. El mtodo CreateButtonSizer () puede tomar los siguientes indicadores:

wx.OK
wx.CANCEL
wx.YES
wx.NO
wx.HELP
wx.NO_DEFAULT

#!/usr/bin/python

# customdialog2.py

import wx

class MyDialog(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title)

vbox = wx.BoxSizer(wx.VERTICAL)
stline = wx.StaticText(self, 11, 'Discipline ist Macht.')
vbox.Add(stline, 1, wx.ALIGN_CENTER|wx.TOP, 45)
sizer = self.CreateButtonSizer(wx.NO|wx.YES|wx.HELP)
vbox.Add(sizer, 0, wx.ALIGN_CENTER)
self.SetSizer(vbox)
self.Bind(wx.EVT_BUTTON, self.OnYes, id=wx.ID_YES)

def OnYes(self, event):


self.Close()

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)
panel = wx.Panel(self, -1)
wx.Button(panel, 1, 'Show custom Dialog', (50,50))
self.Bind(wx.EVT_BUTTON, self.OnShowCustomDialog, id=1)

def OnShowCustomDialog(self, event):


dia = MyDialog(self, -1, '')
val = dia.ShowModal()
dia.Destroy()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'customdialog2.py')
frame.Show(True)
frame.Centre()
return True

app = MyApp(0)
app.MainLoop()

Tenga en cuenta que wxPython no tiene en cuenta el orden de los indicadores.

sizer = self.CreateButtonSizer(wxNO|wxYES|wxHELP)

Los botones se crearn de acuerdo con las normas.

Dilogos predefinidos comunes

WxPython proporciona varios dilogos comunes. Ahorran a programadores mucho trabajo. Tambin ayudan
a promover las normas en las aplicaciones. Vamos a mostrar estos:

Wx.MessageDialog

Wx.ColourDialog

Wx.FileDialog

Wx.PageSetupDialog

Wx.FontDialog

Wx.DirDialog

Wx.SingleChoiceDialog

Wx.TextEntryDialog

#!/usr/bin/python

# commondialogs.py

import wx
import os, sys

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)

self.CreateStatusBar()
menuBar = wx.MenuBar()
menu = wx.Menu()
menu.Append(99, "&Message Dialog", "Shows a Message Dialog")
menu.Append(100, "&Color Dialog", "Shows a Color Dialog")
menu.Append(101, "&File Dialog", "Shows a File Dialog")
menu.Append(102, "&Page Setup Dialog", "Shows a Page Setup Dialog")
menu.Append(103, "&Font Dialog", "Shows a Font Dialog")
menu.Append(104, "&Directory Dialog", "Shows a Directory Dialog")
menu.Append(105, "&SingleChoice Dialog", "Shows a SingleChoice Dialog")
menu.Append(106, "&TextEntry Dialog", "Shows a TextEntry Dialog")
menuBar.Append(menu, "&Dialogs")
self.SetMenuBar(menuBar)

self.Bind(wx.EVT_MENU, self.message, id=99)


self.Bind(wx.EVT_MENU, self.choosecolor, id=100)
self.Bind(wx.EVT_MENU, self.openfile, id=101)
self.Bind(wx.EVT_MENU, self.pagesetup, id=102)
self.Bind(wx.EVT_MENU, self.choosefont, id=103)
self.Bind(wx.EVT_MENU, self.opendir, id=104)
self.Bind(wx.EVT_MENU, self.singlechoice, id=105)
self.Bind(wx.EVT_MENU, self.textentry, id=106)

def message(self, event):


dlg = wx.MessageDialog(self, 'To save one life is as if you have saved the
world.', 'Talmud', wx.OK|wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()

def choosecolor(self, event):


dlg = wx.ColourDialog(self)
dlg.GetColourData().SetChooseFull(True)
if dlg.ShowModal() == wx.ID_OK:
data = dlg.GetColourData()
self.SetStatusText('You selected: %s\n' % str(data.GetColour().Get()))
dlg.Destroy()

def openfile(self, event):


dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", "*.*", wx.OPEN)
if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
mypath = os.path.basename(path)
self.SetStatusText("You selected: %s" % mypath)
dlg.Destroy()

def pagesetup(self, event):


dlg = wx.PageSetupDialog(self)
if dlg.ShowModal() == wx.ID_OK:
data = dlg.GetPageSetupData()
tl = data.GetMarginTopLeft()
br = data.GetMarginBottomRight()
self.SetStatusText('Margins are: %s %s' % (str(tl), str(br)))
dlg.Destroy()

def choosefont(self, event):


default_font = wx.Font(10, wx.SWISS , wx.NORMAL, wx.NORMAL, False, "Verdana")
data = wx.FontData()
if sys.platform == 'win32':
data.EnableEffects(True)
data.SetAllowSymbols(False)
data.SetInitialFont(default_font)
data.SetRange(10, 30)
dlg = wx.FontDialog(self, data)
if dlg.ShowModal() == wx.ID_OK:
data = dlg.GetFontData()
font = data.GetChosenFont()
color = data.GetColour()
text = 'Face: %s, Size: %d, Color: %s' % (font.GetFaceName(),
font.GetPointSize(), color.Get())
self.SetStatusText(text)
dlg.Destroy()

def opendir(self, event):


dlg = wx.DirDialog(self, "Choose a directory:", style=wx.DD_DEFAULT_STYLE |
wx.DD_NEW_DIR_BUTTON)
if dlg.ShowModal() == wx.ID_OK:
self.SetStatusText('You selected: %s\n' % dlg.GetPath())
dlg.Destroy()

def singlechoice(self, event):


sins = ['Greed', 'Lust', 'Gluttony', 'Pride', 'Sloth', 'Envy', 'Wrath']
dlg = wx.SingleChoiceDialog(self, 'Seven deadly sins', 'Which one?', sins,
wx.CHOICEDLG_STYLE)
if dlg.ShowModal() == wx.ID_OK:
self.SetStatusText('You chose: %s\n' % dlg.GetStringSelection())
dlg.Destroy()

def textentry(self, event):


dlg = wx.TextEntryDialog(self, 'Enter some text','Text Entry')
dlg.SetValue("Default")
if dlg.ShowModal() == wx.ID_OK:
self.SetStatusText('You entered: %s\n' % dlg.GetValue())
dlg.Destroy()

class MyApp(wx.App):
def OnInit(self):
myframe = MyFrame(None, -1, "commondialogs.py")
myframe.CenterOnScreen()
myframe.Show(True)
return True

app = MyApp(0)
app.MainLoop()

La secuencia de comandos muestra ocho diferentes dilogos comunes. Toda la salida se muestra en la barra
de estado.
Core Widgets
En esta seccin, introduciremos widgets bsicos en wxPython. Cada widget tendr un pequeo ejemplo de
cdigo.

Wx.Button

Wx.Button es un simple widget. Contiene una cadena de texto. Se utiliza para activar una accin.

Estilos de wx.Button

wx.BU_LEFT
wx.BU_TOP
wx.BU_RIGHT
wx.BU_BOTTOM
wx.BU_EXACTFIT
wx.NO_BORDER
Mtodos wx.Button

Establecer Configure el botn para que sea el elemento predeterminado en una


predeterminado() ventana

Wx.Size GetDefaultSize () Obtener el tamao de botn predeterminado en una plataforma

#!/usr/bin/python

# buttons.py

import wx
import random

APP_SIZE_X = 300
APP_SIZE_Y = 200

class MyButtons(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title, size=(APP_SIZE_X, APP_SIZE_Y))

wx.Button(self, 1, 'Close', (50, 130))


wx.Button(self, 2, 'Random Move', (150, 130), (110, -1))

self.Bind(wx.EVT_BUTTON, self.OnClose, id=1)


self.Bind(wx.EVT_BUTTON, self.OnRandomMove, id=2)

self.Centre()
self.ShowModal()
self.Destroy()

def OnClose(self, event):


self.Close(True)

def OnRandomMove(self, event):


screensize = wx.GetDisplaySize()
randx = random.randrange(0, screensize.x - APP_SIZE_X)
randy = random.randrange(0, screensize.y - APP_SIZE_Y)
self.Move((randx, randy))

app = wx.App(0)
MyButtons(None, -1, 'buttons.py')
app.MainLoop()
Figura: buttons.py

Wx.ToggleButton

Wx.ToggleButton es un botn que tiene dos estados. Presionado y no presionado. Puede alternar entre estos
dos estados haciendo clic en l. Hay situaciones en las que esta funcionalidad encaja bien.

Mtodos wx.ToggleButton

SetValue(bool value) Establecer un estado de un botn de conmutacin

Bool GetValue() Obtener un estado del botn de conmutacin

SetLabel(string label) Establecer una etiqueta para el botn

#!/usr/bin/python

# togglebuttons.py

import wx

class ToggleButtons(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title, size=(300, 200))

self.colour = wx.Colour(0, 0, 0)

wx.ToggleButton(self, 1, 'red', (20, 25))


wx.ToggleButton(self, 2, 'green', (20, 60))
wx.ToggleButton(self, 3, 'blue', (20, 100))

self.panel = wx.Panel(self, -1, (150, 20), (110, 110), style=wx.SUNKEN_BORDER)


self.panel.SetBackgroundColour(self.colour)

self.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleRed, id=1)


self.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleGreen, id=2)
self.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleBlue, id=3)

self.Centre()
self.ShowModal()
self.Destroy()

def ToggleRed(self, event):


green = self.colour.Green()
blue = self.colour.Blue()
if self.colour.Red():
self.colour.Set(0, green, blue)
else:
self.colour.Set(255, green, blue)
self.panel.SetBackgroundColour(self.colour)

def ToggleGreen(self, event):


red = self.colour.Red()
blue = self.colour.Blue()
if self.colour.Green():
self.colour.Set(red, 0, blue)
else:
self.colour.Set(red, 255, blue)
self.panel.SetBackgroundColour(self.colour)

def ToggleBlue(self, event):


red = self.colour.Red()
green = self.colour.Green()
if self.colour.Blue():
self.colour.Set(red, green, 0)
else:
self.colour.Set(red, green, 255)
self.panel.SetBackgroundColour(self.colour)

app = wx.App(0)
ToggleButtons(None, -1, 'togglebuttons.py')
app.MainLoop()

Figura: togglebuttons.py

Wx.BitmapButton

Un botn de mapa de bits es un botn, que muestra un mapa de bits. Un botn de mapa de bits puede tener
otros tres estados. Seleccionado, enfocado y visualizado. Podemos establecer un mapa de bits especfico
para esos estados.

Mtodos wx.BitmapButton
Wx.Bitmap GetBitmapLabel () Devolver el mapa de bits de la etiqueta

SetBitmapLabel (mapa de bits wx.Bitmap) Establezca la etiqueta de mapa de bits para el botn

Wx.Bitmap GetBitmapFocus () Devolver el mapa de bits para el estado enfocado

Wx.Bitmap GetBitmapDisabled () Devolver el mapa de bits para el estado deshabilitado

Wx.Bitmap GetBitmapSelected () Devuelve el mapa de bits para el estado seleccionado

SetBitmapFocus (mapa de bits wx.Bitmap) Establecer el mapa de bits para el estado enfocado

SetBitmapSelected (mapa de bits wx.Bitmap) Establecer el mapa de bits para el estado seleccionado

SetBitmapDisabled (mapa de bits wx.Bitmap) Establecer el mapa de bits para el estado deshabilitado

SetMargins (int x, int y) no se ha implementado

Int GetMarginX () no se ha implementado

Int GetMarginY () no se ha implementado

Un reproductor de vdeo es un buen ejemplo, donde se utilizan los botones de mapa de bits. Podemos ver los
botones de reproduccin, pausa, siguiente, anterior y de volumen. As que creamos un esqueleto de un
reproductor de video en nuestro prximo ejemplo.

#!/usr/bin/python

# player.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(350, 300))
panel = wx.Panel(self, -1)

pnl1 = wx.Panel(self, -1)


pnl1.SetBackgroundColour(wx.BLACK)
pnl2 = wx.Panel(self, -1 )

menubar = wx.MenuBar()
file = wx.Menu()
play = wx.Menu()
view = wx.Menu()
tools = wx.Menu()
favorites = wx.Menu()
help = wx.Menu()

file.Append(101, '&quit', 'Quit application')

menubar.Append(file, '&File')
menubar.Append(play, '&Play')
menubar.Append(view, '&View')
menubar.Append(tools, '&Tools')
menubar.Append(favorites, 'F&avorites')
menubar.Append(help, '&Help')

slider1 = wx.Slider(pnl2, -1, 0, 0, 1000)


pause = wx.BitmapButton(pnl2, -1, wx.Bitmap('icons/stock_media-pause.png'))
play = wx.BitmapButton(pnl2, -1, wx.Bitmap('icons/stock_media-play.png'))
next = wx.BitmapButton(pnl2, -1, wx.Bitmap('icons/stock_media-next.png'))
prev = wx.BitmapButton(pnl2, -1, wx.Bitmap('icons/stock_media-prev.png'))
volume = wx.BitmapButton(pnl2, -1, wx.Bitmap('icons/volume.png'))
slider2 = wx.Slider(pnl2, -1, 0, 0, 100, size=(120, -1))

vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)

hbox1.Add(slider1, 1)
hbox2.Add(pause)
hbox2.Add(play, flag=wx.RIGHT, border=5)
hbox2.Add(next, flag=wx.LEFT, border=5)
hbox2.Add(prev)
hbox2.Add((150, -1), 1, flag=wx.EXPAND | wx.ALIGN_RIGHT)
hbox2.Add(volume, flag=wx.ALIGN_RIGHT)
hbox2.Add(slider2, flag=wx.ALIGN_RIGHT | wx.TOP | wx.LEFT, border=5)

vbox.Add(hbox1, 1, wx.EXPAND | wx.BOTTOM, 10)


vbox.Add(hbox2, 1, wx.EXPAND)
pnl2.SetSizer(vbox)

sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(pnl1, 1, flag=wx.EXPAND)
sizer.Add(pnl2, flag=wx.EXPAND | wx.BOTTOM | wx.TOP, border=10)

self.SetMinSize((350, 300))
self.SetMenuBar(menubar)
self.CreateStatusBar()
self.SetSizer(sizer)
self.Centre()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'Player')
frame.Show(True)
self.SetTopWindow(frame)
return True

app = MyApp(0)
app.MainLoop()
Figura: player.py

Wx.StaticLine

Este widget muestra una lnea simple en la ventana. Puede ser horizontal o vertical.

Estilos de wx.StaticLine

Wx.LI_HORIZONTAL

Wx.LI_VERTICAL

Mtodos wx.StaticLine

Bool IsVertical () Comprobar si la lnea es vertical

Entero GetDefaultSize () Devolver el tamao de la lnea

#!/usr/bin/python

# centraleurope.py

import wx

class MyDialog(wx.Dialog):
def __init__ (self, parent, ID, title):
wx.Dialog.__init__(self, parent, ID, title, size=(360, 370))

font = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD)


heading = wx.StaticText(self, -1, 'The Central Europe', (130, 15))
heading.SetFont(font)

wx.StaticLine(self, -1, (25, 50), (300,1))

wx.StaticText(self, -1, 'Slovakia', (25, 80), style=wx.ALIGN_RIGHT)


wx.StaticText(self, -1, 'Hungary', (25, 100), style=wx.ALIGN_RIGHT)
wx.StaticText(self, -1, 'Poland', (25, 120), style=wx.ALIGN_RIGHT)
wx.StaticText(self, -1, 'Czech Republic', (25, 140))
wx.StaticText(self, -1, 'Germany', (25, 160))
wx.StaticText(self, -1, 'Slovenia', (25, 180))
wx.StaticText(self, -1, 'Austria', (25, 200))
wx.StaticText(self, -1, 'Switzerland', (25, 220))

wx.StaticText(self, -1, '5 379 000', (250, 80))


wx.StaticText(self, -1, '10 084 000', (250, 100))
wx.StaticText(self, -1, '38 635 000', (250, 120))
wx.StaticText(self, -1, '10 240 000', (250, 140))
wx.StaticText(self, -1, '82 443 000', (250, 160))
wx.StaticText(self, -1, '2 001 000', (250, 180))
wx.StaticText(self, -1, '8 032 000', (250, 200))
wx.StaticText(self, -1, '7 288 000', (250, 220))

wx.StaticLine(self, -1, (25, 260), (300,1))

sum = wx.StaticText(self, -1, '164 102 000', (240, 280))


sum_font = sum.GetFont()
sum_font.SetWeight(wx.BOLD)
sum.SetFont(sum_font)

wx.Button(self, 1, 'Ok', (140, 310), (60, 30))

self.Bind(wx.EVT_BUTTON, self.OnOk, id=1)


self.Centre()

def OnOk(self, event):


self.Close()

class MyApp(wx.App):
def OnInit(self):
dia = MyDialog(None, -1, 'centraleurope.py')
dia.ShowModal()
dia.Destroy()
return True

app = MyApp()
app.MainLoop()

Centraleurope.py muestra los pases de Europa central y su poblacin. El wx.StatLine hace que se vea ms
visualmente atractivo.
Figura: centraleurope.py

Wx.StaticText

Un widget wx.StaticText muestra una o ms lneas de texto de slo lectura.

Estilos de wx.StaticText

Wx.ALIGN_RIGHT

Wx.ALIGN_LEFT

Wx.ALIGN_CENTER / wx.ALIGN_CENTRE

Wx.ST_NO_AUTORESIZE

Mtodos wx.StaticText

Wrap (int Si es posible, establezca cada lnea de texto para analizar los pxeles. Si el ancho es
width) negativo, no se realiza ningn ajuste.

#!/usr/bin/python

# statictext.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(320,
350))
lyrics1 = '''I'm giving up the ghost of love
in the shadows cast on devotion
She is the one that I adore
creed of my silent suffocation
Break this bittersweet spell on me
lost in the arms of destiny'''

lyrics2 = '''There is something in the way


You're always somewhere else
Feelings have deserted me
To a point of no return
I don't believe in God
But I pray for you'''

panel = wx.Panel(self, -1)


wx.StaticText(panel, -1, lyrics1, (45, 25), style=wx.ALIGN_CENTRE)
wx.StaticText(panel, -1, lyrics2, (45, 190), style=wx.ALIGN_CENTRE)
self.Centre()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'statictext.py')
frame.Show(True)
self.SetTopWindow(frame)
return True

app = MyApp(0)
app.MainLoop()

Figura statictext.py

Wx.StaticBox

Este es un tipo de widget decorador. Se utiliza para agrupar lgicamente varios widgets. Tenga en cuenta que
este widget debe crearse antes de los widgets que contiene, y que esos widgets deben ser hermanos, no
nios, del cuadro esttico.
#!/usr/bin/python

# staticbox.py

import wx

class MyDialog(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title, size=(250, 230))

wx.StaticBox(self, -1, 'Personal Info', (5, 5), size=(240, 170))


wx.CheckBox(self, -1 ,'Male', (15, 30))
wx.CheckBox(self, -1 ,'Married', (15, 55))
wx.StaticText(self, -1, 'Age', (15, 95))
wx.SpinCtrl(self, -1, '1', (55, 90), (60, -1), min=1, max=120)
wx.Button(self, 1, 'Ok', (90, 185), (60, -1))

self.Bind(wx.EVT_BUTTON, self.OnClose, id=1)

self.Centre()
self.ShowModal()
self.Destroy()

def OnClose(self, event):


self.Close()

app = wx.App(0)
MyDialog(None, -1, 'staticbox.py')
app.MainLoop()

Figura staticbox.py

Wx.ComboBox

Wx.ComboBox es una combinacin de un campo de texto de una sola lnea, un botn con una imagen de
flecha hacia abajo y un cuadro de lista. Cuando pulse el botn, aparecer un cuadro de lista. El usuario slo
puede seleccionar una opcin de la lista de cadenas suministrada.

Wx.ComboBox tiene el constructor siguiente:


wx.ComboBox(int id, string value='', wx.Point pos=wx.DefaultPosition, wx.Size
size=wx.DefaultSize,
wx.List choices=wx.EmptyList, int style=0, wx.Validator
validator=wx.DefaultValidator,
string name=wx.ComboBoxNameStr)

Estilos de wx.ComboBox

Wx.CB_DROPDOWN

Wx.CB_READONLY

Wx.CB_SORT

Mtodos wx.ComboBox

String GetValue () Devolver el valor actual

SetValue (valor de cadena) Establezca el valor en el campo de texto de la combobox

Dupdo() Copiar el valor seleccionado en el portapapeles

Cortar() Corte el valor seleccionado en el portapapeles

Pegar() Pegar texto desde el portapapeles al campo de texto del combobox

SetInsertionPoint (int pos)


Establezca el punto de insercin en el campo de texto del
combobox

Int GetInsertionPoint () Obtener el punto de insercin para el campo de texto del combobox

Int GetLastPosition () Devolver la ltima posicin en el campo de texto del combobox

Replace (int de, int a, valor de Reemplazar el texto entre las posiciones de y hacia las posiciones
cadena) en el campo de texto del combobox

SetSelection (int n) Seleccione el elemento en la posicin n

SetMark (int de, int a)


Seleccione el texto entre las posiciones de y hacia las posiciones en
el campo de texto del combobox
(Int de, int a) GetMark ()
Devuelve las posiciones desde y hacia el texto seleccionado en el
campo de texto del combobox

Int GetCurrentSelection () Devolver la seleccin actual

Bool SetStringSelection (cadena


cadena) Seleccione el elemento con la cadena especificada

Int SetString (int n, cadena


cadena) Establezca la etiqueta para el elemento en la posicin n

Bool SetEditable (bool editable)


Activar el indicador de slo lectura para el campo de texto del
combobox

Int SetInsertionPointEnd ()
Establezca el punto de insercin al final del campo de texto del
combobox.

Quitar (int de, int a)


Quitar el texto entre las dos posiciones en el campo de texto del
combobox

Bool IsEditable () Devuelve true si la combobox es editable

SelectAll (int de, int a) Seleccionar todo el texto en el campo de texto del combo

#!/usr/bin/python

# combobox.py

import wx

class MyDialog(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title, size=(250, 270))

panel = wx.Panel(self, -1, (75, 20), (100, 127), style=wx.SUNKEN_BORDER)


self.picture = wx.StaticBitmap(panel)
panel.SetBackgroundColour(wx.WHITE)

self.images = ['tolstoy.jpg', 'feuchtwanger.jpg', 'balzac.jpg',


'pasternak.jpg', 'galsworthy.jpg', 'wolfe.jpg', 'zweig.jpg']
authors = ['Leo Tolstoy', 'Lion Feuchtwanger', 'Honore de Balzac', 'Boris
Pasternak', 'John Galsworthy', 'Tom Wolfe', 'Stefan Zweig' ]

wx.ComboBox(self, -1, pos=(50, 170), size=(150, -1), choices=authors,


style=wx.CB_READONLY)
wx.Button(self, 1, 'Close', (80, 220))

self.Bind(wx.EVT_BUTTON, self.OnClose, id=1)


self.Bind(wx.EVT_COMBOBOX, self.OnSelect)

self.Centre()

def OnClose(self, event):


self.Close()

def OnSelect(self, event):


item = event.GetSelection()
self.picture.SetFocus()
self.picture.SetBitmap(wx.Bitmap('images/' + self.images[item]))

class MyApp(wx.App):
def OnInit(self):
dlg = MyDialog(None, -1, 'combobox.py')
dlg.ShowModal()
dlg.Destroy()
return True

app = MyApp(0)
app.MainLoop()

Figura: combobox.py

Wx.CheckBox

Wx.CheckBox es un widget que tiene dos estados. Encendido y apagado. Es una caja con una etiqueta. La
etiqueta puede ajustarse a la derecha oa la izquierda de la caja. Si la casilla de verificacin est marcada, est
representada por una marca en un cuadro.

Estilos de wx.CheckBox

Wx.ALIGN_RIGHT

Mtodos wx.CheckBox

Bool GetValue () Obtener el estado de la casilla de verificacin


Bool IsChecked () Determinar el estado de la casilla de verificacin

SetValue(bool state) Establecer el estado de la casilla de verificacin

#!/usr/bin/python

# checkbox.py

import wx

class MyCheckBox(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(250, 170))

panel = wx.Panel(self, -1)


self.cb = wx.CheckBox(panel, -1, 'Show Title', (10, 10))
self.cb.SetValue(True)

wx.EVT_CHECKBOX(self, self.cb.GetId(), self.ShowTitle)

self.Show()
self.Centre()

def ShowTitle(self, event):


if self.cb.GetValue():
self.SetTitle('checkbox.py')
else: self.SetTitle('')

app = wx.App(0)
MyCheckBox(None, -1, 'checkbox.py')
app.MainLoop()

En nuestro script cambiamos la visibilidad del ttulo.

Figura: checkbox.py

Wx.StatusBar

Como su nombre indica, el widget wx.StatusBar se utiliza para mostrar informacin sobre el estado de la
aplicacin. Se puede dividir en varias partes para mostrar diferentes tipos de informacin. Podemos insertar
otros widgets en el wx.StatusBar . Se puede usar como una alternativa a los dilogos, ya que los dilogos
son abusados y no les gustan a la mayora de los usuarios. Podemos crear un
Wx.StatusBar de dos maneras. Podemos crear manualmente nuestro propio mtodo wx.StatusBar y
llamar a SetStatusBar () o podemos simplemente llamar a un mtodo CreateStatusBar () . El ltimo
mtodo crea un wx.StatusBar por defecto para nosotros. En nuestro primer ejemplo, tenemos un

Widget wx.Frame y otros cinco widgets. Si colocamos un puntero del ratn sobre un widget, su descripcin
se muestra en el wx.StatusBar

#!/usr/bin/python

# statusbar.py

import wx

class MyStatusBar(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(250, 200),
style=wx.CAPTION | wx.SYSTEM_MENU | wx.CLOSE_BOX)

panel = wx.Panel(self, 1)

button = wx.Button(panel, 2, 'Button', (20, 20))


text = wx.CheckBox(panel, 3, 'CheckBox', (20, 90))
combo = wx.ComboBox(panel, 4, '', (120, 22))
slider = wx.Slider(panel, 5, 6, 1, 10, (120, 90), (110, -1))

panel.Bind(wx.EVT_ENTER_WINDOW, self.EnterPanel, id=1)


button.Bind(wx.EVT_ENTER_WINDOW, self.EnterButton, id=2)
text.Bind(wx.EVT_ENTER_WINDOW, self.EnterText, id=3)
combo.Bind(wx.EVT_ENTER_WINDOW, self.EnterCombo, id=4)
slider.Bind(wx.EVT_ENTER_WINDOW, self.EnterSlider, id=5)

self.sb = self.CreateStatusBar()
self.SetMaxSize((250, 200))
self.SetMinSize((250, 200))
self.Centre()

def EnterButton(self, event):


self.sb.SetStatusText('Button widget')
event.Skip()

def EnterPanel(self, event):


self.sb.SetStatusText('Panel widget')
event.Skip()

def EnterText(self, event):


self.sb.SetStatusText('CheckBox widget')
event.Skip()

def EnterCombo(self, event):


self.sb.SetStatusText('ComboBox widget')
event.Skip()

def EnterSlider(self, event):


self.sb.SetStatusText('Slider widget')
event.Skip()

class MyApp(wx.App):
def OnInit(self):
frame = MyStatusBar(None, -1, 'statusbar.py')
frame.Show(True)
return True

app = MyApp(0)
app.MainLoop()

Figura: statusbar.py

Wx.RadioButton

Wx.RadioButton es un widget que permite al usuario seleccionar una sola opcin exclusiva de un grupo de
opciones. Un grupo de botones de radio se define al tener el primer RadioButton en el grupo que contiene
el estilo wx.RB_GROUP. Todos los dems RadioButtons definidos despus de que el primer
RadioButton con este indicador de estilo se establezca se agregarn al grupo de funciones del primer
RadioButton . Declarar otro RadioButton con el indicador wx.RB_GROUP iniciar un nuevo grupo de
botones de radio.

Estilos de wx.RadioButton

Wx.RB_GROUP

Wx.rb_single

Mtodos wx.RadioButton

Bool GetValue ()
Devuelve True o False dependiendo del estado de
seleccin

SetValue(bool state) Boton de radio

#!/usr/bin/python

# radiobuttons.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(200,
150))
panel = wx.Panel(self, -1)
self.rb1 = wx.RadioButton(panel, -1, 'Value A', (10, 10), style=wx.RB_GROUP)
self.rb2 = wx.RadioButton(panel, -1, 'Value B', (10, 30))
self.rb3 = wx.RadioButton(panel, -1, 'Value C', (10, 50))
self.Bind(wx.EVT_RADIOBUTTON, self.SetVal, id=self.rb1.GetId())
self.Bind(wx.EVT_RADIOBUTTON, self.SetVal, id=self.rb2.GetId())
self.Bind(wx.EVT_RADIOBUTTON, self.SetVal, id=self.rb3.GetId())
self.statusbar = self.CreateStatusBar(3)
self.SetVal(True)

def SetVal(self, event):


state1 = str(self.rb1.GetValue())
state2 = str(self.rb2.GetValue())
state3 = str(self.rb3.GetValue())
self.statusbar.SetStatusText(state1,0)
self.statusbar.SetStatusText(state2,1)
self.statusbar.SetStatusText(state3,2)

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'radiobuttons.py')
frame.Show(True)
frame.Center()
return True

app = MyApp(0)
app.MainLoop()

Figura: radiobuttons.py

Wx.Gauge

Wx.Gauge es un widget que se utiliza cuando procesamos tareas largas.

Estilos wx.Gauge

Wx.GA_HORIZONTAL

Wx.GA_VERTICAL

Wx.Gauge mtodos

SetRange (rango de nmeros enteros) Ajuste el valor mximo del indicador

Entero GetRange () Obtener el valor mximo del indicador


SetValue (posicin de nmero entero) Ajuste la posicin del indicador

Entero GetValue () Obtener la posicin del indicador

Bool IsVertical () Verifique si el indicador es vertical

#!/usr/bin/python

# gauge.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)

self.timer = wx.Timer(self, 1)
self.count = 0
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
panel = wx.Panel(self, -1)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
hbox3 = wx.BoxSizer(wx.HORIZONTAL)

self.gauge = wx.Gauge(panel, -1, 50, size=(250, 25))


self.btn1 = wx.Button(panel, wx.ID_OK)
self.btn2 = wx.Button(panel, wx.ID_STOP)
self.text = wx.StaticText(panel, -1, 'Task to be done')

self.Bind(wx.EVT_BUTTON, self.OnOk, self.btn1)


self.Bind(wx.EVT_BUTTON, self.OnStop, self.btn2)

hbox1.Add(self.gauge, 1, wx.ALIGN_CENTRE)
hbox2.Add(self.btn1, 1, wx.RIGHT, 10)
hbox2.Add(self.btn2, 1)
hbox3.Add(self.text, 1)
vbox.Add((0, 50), 0)
vbox.Add(hbox1, 0, wx.ALIGN_CENTRE)
vbox.Add((0, 30), 0)
vbox.Add(hbox2, 1, wx.ALIGN_CENTRE)
vbox.Add(hbox3, 1, wx.ALIGN_CENTRE)
panel.SetSizer(vbox)
self.Centre()

def OnOk(self, event):


if self.count >= 50:
return
self.timer.Start(100)
self.text.SetLabel('Task in Progress')

def OnStop(self, event):


if self.count == 0 or self.count >= 50 or not self.timer.IsRunning():
return
self.timer.Stop()
self.text.SetLabel('Task Interrupted')
wx.Bell()
def OnTimer(self, event):
self.count = self.count +1
self.gauge.SetValue(self.count)
if self.count == 50:
self.timer.Stop()
self.text.SetLabel('Task Completed')

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'gauge.py')
frame.Show(True)
return True

app = MyApp(0)
app.MainLoop()

Figura: gauge.py

Wx.Slider

Wx.Slider es un widget que tiene un sencillo control. Esta manija se puede tirar hacia adelante y hacia
atrs. De esta manera estamos eligiendo un valor para una tarea especfica. Digamos que queremos
introducir en nuestra aplicacin la edad de un cliente. Para este propsito , wx.Slider podra ser una
buena opcin.

Estilos de wx.Slider

WxSL_HORIZONTAL

WxSL_VERTICAL

WxSL_AUTOTICKS

WxSL_LABELS

WxSL_LEFT

WxSL_RIGHT

WxSL_TOP
WxSL_BOTTOM

WxSL_INVERSE

Mtodos wx.Slider

Entero GetValue () Obtener el valor del deslizador actual

SetValue (valor entero) Ajuste la posicin del deslizador

SetRange (entero min, entero mximo) Ajuste el valor del deslizador mnimo y mximo

Entero GetMin () Obtener el valor de deslizamiento mnimo

Entero GetMax () Obtener el valor mximo del deslizador

SetMin (entero min) Establezca el valor del deslizador mnimo

Entero SetMax (entero mximo) Establecer el valor mximo del deslizador

SetLineSize (tamao entero) Ajuste el tamao de lnea para el deslizador

SetPageSize (integer pageSize) Ajuste el tamao de pgina para el deslizador

PageSize - el nmero de pasos que se mueve el deslizador cuando el usuario se desplaza hacia arriba o hacia
abajo.
#!/usr/bin/python

# slider.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):

wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, (300, 150))


panel = wx.Panel(self, -1)

vbox = wx.BoxSizer(wx.VERTICAL)
hbox = wx.BoxSizer(wx.HORIZONTAL)
self.sld = wx.Slider(panel, -1, 200, 150, 500, wx.DefaultPosition, (250, -1),
wx.SL_AUTOTICKS | wx.SL_HORIZONTAL | wx.SL_LABELS)
btn1 = wx.Button(panel, 8, 'Adjust')
btn2 = wx.Button(panel, 9, 'Close')

wx.EVT_BUTTON(self, 8, self.OnAdjust)
wx.EVT_BUTTON(self, 9, self.OnClose)
vbox.Add(self.sld, 1, wx.ALIGN_CENTRE)
hbox.Add(btn1, 1, wx.RIGHT, 10)
hbox.Add(btn2, 1)
vbox.Add(hbox, 0, wx.ALIGN_CENTRE | wx.ALL, 20)
panel.SetSizer(vbox)

def OnAdjust(self, event):


val = self.sld.GetValue()

self.SetSize((val*2, val))
def OnClose(self, event):
self.Close()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'slider.py')
frame.Show(True)
frame.Centre()
return True

app = MyApp(0)
app.MainLoop()

En este ejemplo tenemos un control deslizante y dos botones. La posicin inicial del deslizador se establece
en 200. El valor mnimo es 150, el valor mximo es 500. Cuando hace clic en el botn de ajuste, se cambia
el tamao del marco. La altura se establece en el valor elegido por el deslizador, el ancho se establece en 2 x
valor.
Figura: slider.py

Wx.ListBox

Wx.Listbox es un widget que consiste en un cuadro de desplazamiento y una lista de elementos. El usuario
puede seleccionar uno o ms elementos de esa lista. Depende de si se crea como un cuadro de seleccin
nico o mltiple. Los elementos seleccionados estn marcados.

#!/usr/bin/python
# listbox.py

import wx

from time import *

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, (550, 350))

zone_list = ['CET', 'GMT', 'MSK', 'EST', 'PST', 'EDT']


self.full_list = {
'CET': 'Central European Time',
'GMT': 'Greenwich Mean Time',
'MSK': 'Moscow Time',
'EST': 'Eastern Standard Time',
'PST': 'Pacific Standard Time',
'EDT': 'Eastern Daylight Time'
}
self.time_diff = {
'CET' : 1,
'GMT' : 0,
'MSK': 3,
'EST': -5,
'PST': -8,
'EDT': -4
}

vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
hbox3 = wx.BoxSizer(wx.HORIZONTAL)

self.timer = wx.Timer(self, 1)
self.diff = 0
panel = wx.Panel(self, -1)
self.time_zones = wx.ListBox(panel, 26, wx.DefaultPosition, (170, 130),
zone_list, wx.LB_SINGLE)
self.time_zones.SetSelection(0)
self.text = wx.TextCtrl(panel, -1, 'Central European Time', size=(200, 130),
style=wx.TE_MULTILINE)
self.time = wx.StaticText(panel, -1, '')
btn = wx.Button(panel, wx.ID_CLOSE, 'Close')
hbox1.Add(self.time_zones, 0, wx.TOP, 40)
hbox1.Add(self.text, 1, wx.LEFT | wx.TOP, 40)
hbox2.Add(self.time, 1, wx.ALIGN_CENTRE)
hbox3.Add(btn, 0, wx.ALIGN_CENTRE)
vbox.Add(hbox1, 0, wx.ALIGN_CENTRE)
vbox.Add(hbox2, 1, wx.ALIGN_CENTRE)
vbox.Add(hbox3, 1, wx.ALIGN_CENTRE)
panel.SetSizer(vbox)
self.timer.Start(100)

self.Bind(wx.EVT_BUTTON, self.OnClose, id=wx.ID_CLOSE)


self.Bind(wx.EVT_LISTBOX, self.OnSelect, id=26)
self.Bind(wx.EVT_TIMER, self.OnTimer, id=1)

def OnClose(self, event):


self.Close()

def OnSelect(self, event):


index = event.GetSelection()
time_zone = self.time_zones.GetString(index)
self.diff = self.time_diff[time_zone]
self.text.SetValue(self.full_list[time_zone])

def OnTimer(self, event):


ct = gmtime()
print_time = (ct[0], ct[1], ct[2], ct[3]+self.diff, ct[4], ct[5], ct[6], ct[7],
-1)
self.time.SetLabel(strftime("%H:%M:%S", print_time))

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'listbox.py')
frame.Centre()
frame.Show(True)
return True

app = MyApp(0)
app.MainLoop()

El ejemplo de listbox.py consta de cuatro widgets diferentes. Wx.Listbox , wx.TextCtrl , wx.StaticText


y wx.Button . Los widgets se organizan con wx.BoxSizer-s . Wx.Listbox tiene una lista de seis tiempos
diferentes del mundo. Estas abreviaturas se explican en wx.TextCtrl . La hora actual se muestra en el
widget wx.StaticText . El widget wx.Timer se utiliza para actualizar el tiempo cada 100 milisegundos.
Figura: listbox.py

Wx.SpinCtrl

Este widget le permite incrementar y decrementar un valor. Tiene dos botones de flecha hacia arriba y hacia
abajo para este propsito. El usuario puede introducir un valor en un cuadro o incrementarlo / decrementarlo
mediante estas dos flechas.

Wx.SpinCtrl estilos

Wx.SP_ARROW_KEYS

Wx.SP_WRAP

Wx.SpinCtrl mtodos

integer GetValue () Obtener el valor actual

SetValue (valor entero) Establecer el valor actual

SetValueString (valor de cadena) alguna cosa

SetRange (entero min, entero mximo) Ajuste los valores min y max

integer GetMin () Obtener el valor mnimo


integer GetMax () Obtener el valor mximo

#!/usr/bin/python

# spinctrl.py

import wx

class MyDialog(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(350,
310))

wx.StaticText(self, -1, 'Convert Fahrenheit temperature to Celsius', (20,20))


wx.StaticText(self, -1, 'Fahrenheit: ', (20, 80))
wx.StaticText(self, -1, 'Celsius: ', (20, 150))

self.celsius = wx.StaticText(self, -1, '', (150, 150))


self.sc = wx.SpinCtrl(self, -1, '', (150, 75), (60, -1))
self.sc.SetRange(-459, 1000)
self.sc.SetValue(0)

compute_btn = wx.Button(self, 1, 'Compute', (70, 250))


compute_btn.SetFocus()
clear_btn = wx.Button(self, 2, 'Close', (185, 250))

self.Bind(wx.EVT_BUTTON, self.OnCompute, id=1)


self.Bind(wx.EVT_BUTTON, self.OnClose, id=2)
self.Bind(wx.EVT_CLOSE, self.OnClose)

def OnCompute(self, event):


fahr = self.sc.GetValue()
cels = round((fahr-32)*5/9.0, 2)
self.celsius.SetLabel(str(cels))

def OnClose(self, event):


self.Destroy()

class MyApp(wx.App):
def OnInit(self):
dlg = MyDialog(None, -1, 'spinctrl.py')
dlg.Show(True)
dlg.Centre()
return True

app = MyApp(0)
app.MainLoop()

Spinctrl.py es un script basado en dilogo. Nuestra clase principal hereda de wx.Dialog en lugar de
wx.Frame . La principal diferencia es que no podemos cambiar el tamao de la ventana y llamamos al
mtodo Destroy() en lugar de Close(), cuando salimos de la aplicacin. Spinctrl.py script convierte la
temperatura Fahrenheit a Celsius. Este ejemplo es muy popular y se puede encontrar en la mayora de los
libros de cartillas de programacin.
Figura spinctrl.py

Wx.ListCtrl

Wx.ListCtrl crea listas en los siguientes formatos:

Vista de informe

vista de la lista

Vista de icono

En nuestro ejemplo, tecleamos los estados y sus capitales y los aadimos al widget de lista. Utilizamos la
vista de informe.

#!/usr/bin/python

# capitals.py

import wx

class MyDialog(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title, size=(600,500),
style=wx.DEFAULT_DIALOG_STYLE)

hbox = wx.BoxSizer(wx.HORIZONTAL)
vbox1 = wx.BoxSizer(wx.VERTICAL)
vbox2 = wx.BoxSizer(wx.VERTICAL)
vbox3 = wx.GridSizer(2,2,0,0)
vbox4 = wx.BoxSizer(wx.VERTICAL)
pnl1 = wx.Panel(self, -1, style=wx.SIMPLE_BORDER)
pnl2 = wx.Panel(self, -1, style=wx.SIMPLE_BORDER)
self.lc = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
self.lc.InsertColumn(0, 'State')
self.lc.InsertColumn(1, 'Capital')
self.lc.SetColumnWidth(0, 140)
self.lc.SetColumnWidth(1, 153)
vbox1.Add(pnl1, 1, wx.EXPAND | wx.ALL, 3)
vbox1.Add(pnl2, 1, wx.EXPAND | wx.ALL, 3)
vbox2.Add(self.lc, 1, wx.EXPAND | wx.ALL, 3)
self.tc1 = wx.TextCtrl(pnl1, -1)
self.tc2 = wx.TextCtrl(pnl1, -1)
vbox3.AddMany([ (wx.StaticText(pnl1, -1, 'State'),0, wx.ALIGN_CENTER),
(self.tc1, 0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL),
(wx.StaticText(pnl1, -1, 'Capital'),0,
wx.ALIGN_CENTER_HORIZONTAL),
(self.tc2,0)])
pnl1.SetSizer(vbox3)
vbox4.Add(wx.Button(pnl2, 10, 'Add'), 0, wx.ALIGN_CENTER| wx.TOP, 45)
vbox4.Add(wx.Button(pnl2, 11, 'Remove'), 0, wx.ALIGN_CENTER|wx.TOP, 15)
vbox4.Add(wx.Button(pnl2, 12, 'Clear'), 0, wx.ALIGN_CENTER| wx.TOP, 15)
vbox4.Add(wx.Button(pnl2, 13, 'Close'), 0, wx.ALIGN_CENTER| wx.TOP, 15)
pnl2.SetSizer(vbox4)
self.Bind (wx.EVT_BUTTON, self.OnAdd, id=10)
self.Bind (wx.EVT_BUTTON, self.OnRemove, id=11)
self.Bind (wx.EVT_BUTTON, self.OnClear, id=12)
self.Bind (wx.EVT_BUTTON, self.OnClose, id=13)
hbox.Add(vbox1, 1, wx.EXPAND)
hbox.Add(vbox2, 1, wx.EXPAND)
self.SetSizer(hbox)

def OnAdd(self, event):


if not self.tc1.GetValue() or not self.tc2.GetValue():
return
num_items = self.lc.GetItemCount()
self.lc.InsertStringItem(num_items, self.tc1.GetValue())
self.lc.SetStringItem(num_items, 1, self.tc2.GetValue())
self.tc1.Clear()
self.tc2.Clear()

def OnRemove(self, event):


index = self.lc.GetFocusedItem()
self.lc.DeleteItem(index)

def OnClose(self, event):


self.Close()

def OnClear(self, event):


self.lc.DeleteAllItems()

class MyApp(wx.App):
def OnInit(self):
dia = MyDialog(None, -1, 'capitals.py')
dia.ShowModal()
dia.Destroy()
return True

app = MyApp(0)
app.MainLoop()
Figura: capitals.py

Wx.SplitterWindow

Este widget permite dividir el rea principal de una aplicacin en partes. El usuario puede cambiar
dinmicamente esas partes con el puntero del ratn. Esta solucin se puede ver en los clientes de correo
(evolucin) o en el software de grabacin (k3b). Puede dividir un rea vertical u horizontalmente.

#!/usr/bin/python
# splitterwindow.py
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(350,
300))

splitter = wx.SplitterWindow(self, -1)


panel1 = wx.Panel(splitter, -1)
wx.StaticText(panel1, -1,
"Whether you think that you can, or that you can't, you are usually
right."
"\n\n Henry Ford",
(100,100), style=wx.ALIGN_CENTRE)
panel1.SetBackgroundColour(wx.LIGHT_GREY)
panel2 = wx.Panel(splitter, -1)
panel2.SetBackgroundColour(wx.WHITE)
splitter.SplitVertically(panel1, panel2)
self.Centre()

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'splitterwindow.py')
frame.Show(True)
self.SetTopWindow(frame)
return True

app = MyApp(0)
app.MainLoop()

Wx.ScrolledWindow

Este es uno de los widgets contenedores. Puede ser til, cuando tenemos un rea mayor que una ventana
puede mostrar. En nuestro ejemplo, demostraremos tal caso. Colocamos una imagen grande en nuestra
ventana. Cuando la ventana es ms pequea que nuestra imagen, las barras de desplazamiento se muestran
automticamente.

Mtodos wx.ScrolledWindow

SetScrollbars () Establecer barras de desplazamiento para una ventana

Desplazamiento (int x, int y) Desplaza una ventana

Int GetScrollPageSize (int orient) Obtener el tamao de pgina de desplazamiento

SetScrollPageSize (int orient, int


pageSize) Establecer el tamao de pgina de desplazamiento

SetScrollRate (int xstep, int ystep) Establecer la velocidad de desplazamiento

Wx.Size GetScrollPixelsPerUnit ()
Obtener el tamao de una unidad lgica en unidades
fsicas

SetScrollRate (int xstep, int ystep) Establecer la velocidad de desplazamiento

EnableScrolling (bool x, bool y) Activar o desactivar el desplazamiento

WxPoint GetViewStart () Empieza la vista

SetTargetWindow (objetivo wx.Window) Establecer la ventana de destino para desplazarse

Wx.Window GetTargetWindow () Obtener la ventana de desplazamiento de destino


AdjustScrollbars () Ajustar barras de desplazamiento

#!/usr/bin/python

# myscrolledwindow.py

import wx

class MyScrolledWindow(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(500, 400))

sw = wx.ScrolledWindow(self)
bmp = wx.Image('aliens.jpg',wx.BITMAP_TYPE_JPEG).ConvertToBitmap()
wx.StaticBitmap(sw, -1, bmp)
sw.SetScrollbars(20,20,55,40)

class MyApp(wx.App):
def OnInit(self):
frame = MyScrolledWindow(None, -1, 'Aliens')
frame.Show(True)
frame.Centre()
return True

app = MyApp(0)
app.MainLoop()

Wx.TreeCtrl
Wx.TreeCtrl muestra los datos en una jerarqua.

#!/usr/bin/python

# treectrl.py

import wx

class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(450,
350))

hbox = wx.BoxSizer(wx.HORIZONTAL)
vbox = wx.BoxSizer(wx.VERTICAL)
panel1 = wx.Panel(self, -1)
panel2 = wx.Panel(self, -1)

self.tree = wx.TreeCtrl(panel1, 1, wx.DefaultPosition, (-1,-1),


wx.TR_HIDE_ROOT|wx.TR_HAS_BUTTONS)
root = self.tree.AddRoot('Programmer')
os = self.tree.AppendItem(root, 'Operating Systems')
pl = self.tree.AppendItem(root, 'Programming Languages')
tk = self.tree.AppendItem(root, 'Toolkits')
self.tree.AppendItem(os, 'Linux')
self.tree.AppendItem(os, 'FreeBSD')
self.tree.AppendItem(os, 'OpenBSD')
self.tree.AppendItem(os, 'NetBSD')
self.tree.AppendItem(os, 'Solaris')
cl = self.tree.AppendItem(pl, 'Compiled languages')
sl = self.tree.AppendItem(pl, 'Scripting languages')
self.tree.AppendItem(cl, 'Java')
self.tree.AppendItem(cl, 'C++')
self.tree.AppendItem(cl, 'C')
self.tree.AppendItem(cl, 'Pascal')
self.tree.AppendItem(sl, 'Python')
self.tree.AppendItem(sl, 'Ruby')
self.tree.AppendItem(sl, 'Tcl')
self.tree.AppendItem(sl, 'PHP')
self.tree.AppendItem(tk, 'Qt')
self.tree.AppendItem(tk, 'MFC')
self.tree.AppendItem(tk, 'wxPython')
self.tree.AppendItem(tk, 'GTK+')
self.tree.AppendItem(tk, 'Swing')
self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=1)
self.display = wx.StaticText(panel2, -1, '',(10,10), style=wx.ALIGN_CENTRE)
vbox.Add(self.tree, 1, wx.EXPAND)
hbox.Add(panel1, 1, wx.EXPAND)
hbox.Add(panel2, 1, wx.EXPAND)
panel1.SetSizer(vbox)
self.SetSizer(hbox)
self.Centre()

def OnSelChanged(self, event):


item = event.GetItem()
self.display.SetLabel(self.tree.GetItemText(item))

class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'treectrl.py')
frame.Show(True)
self.SetTopWindow(frame)
return True

app = MyApp(0)
app.MainLoop()
Primero debemos crear un elemento raz.

root = self.tree.AddRoot('Programmer')

En nuestro caso, el elemento raz no se mostrar, porque utilizamos el indicador wx.TR_HIDE_ROOT en


nuestro constructor.

self.tree = wx.TreeCtrl(panel1, 1, wx.DefaultPosition, (-1,-1), wx.TR_HIDE_ROOT|


wx.TR_HAS_BUTTONS)

Aadimos elementos al elemento raz con el mtodo AppendItem () .

Os = self.tree.AppendItem (root, 'Sistemas operativos')


Pl = self.tree.AppendItem (root, 'Lenguajes de programacin')
Tk = self.tree.AppendItem (root, 'Toolkits')

Tambin podemos crear varios niveles simplemente agregando elementos a los elementos existentes.

Capturamos eventos con el controlador de eventos wx.EVT_TREE_SEL_CHANGED ().

Wx.EVT_TREE_SEL_CHANGED (self.tree, 1, self.OnSelChanged)

Varias banderas del estilo del constructor:

TR_NO_BUTTONS

TR_HAS_BUTTONS

TR_NO_LINES

TR_LINES_AT_ROOT

TR_SINGLE

TR_MULTIPLE

TR_EXTENDED

TR_HAS_VARIABLE_ROW_HEIGHT

TR_EDIT_LABELS

TR_HIDE_ROOT

TR_ROW_LINES

TR_FULL_ROW_HIGHLIGHT

TR_DEFAULT_STYLE

TR_TWIST_BUTTONS

TR_MAC_BUTTONS
TR_AQUA_BUTTONS

Figura: treectrl.py

Wx.Notebook

Wx.Notebook widget se une a varias ventanas con las pestaas correspondientes.

Puede posicionar el widget Notebook utilizando los siguientes indicadores de estilo:

Wx.NB_LEFT

Wx.NB_RIGHT

Wx.NB_TOP

Wx.NB_BOTTOM

La posicin predeterminada es wx.NB_TOP.

Mtodos wx.Notebook

integer GetRowCount() Obtener el nmero de filas

SetPadding(wx.Size padding)
Establezca la cantidad de espacio alrededor del icono y la
etiqueta de cada pgina
SetTabSize(wx.Size size) Establecer el tamao de la pestaa

(tab, where) HitTest(wx.Point point) Devuelve la pestaa que se pulsa

wx.Size CalcSizeFromPage(wx.Size size) alguna cosa

Addcontrolbase donde el valor de retorno de la

El mtodo HitTest () puede ser uno de los siguientes :

wx.NB_HITTEST_NOWHERE

wx.NB_HITTEST_ONITEM

En nuestro ejemplo, imitamos el aspecto de una hoja de clculo.

#!/usr/bin/python

# notebook.py

import wx
import wx.lib.sheet as sheet

class MySheet(sheet.CSheet):
def __init__(self, parent):
sheet.CSheet.__init__(self, parent)

self.SetLabelBackgroundColour('#DBD4D4')
self.SetNumberRows(50)
self.SetNumberCols(50)

class Notebook(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(600, 500))

menubar = wx.MenuBar()
file = wx.Menu()
file.Append(101, 'Quit', '' )
menubar.Append(file, "&File")
self.SetMenuBar(menubar)
wx.EVT_MENU(self, 101, self.OnQuit)
nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM)
self.sheet1 = MySheet(nb)
self.sheet2 = MySheet(nb)
self.sheet3 = MySheet(nb)
nb.AddPage(self.sheet1, "Sheet1")
nb.AddPage(self.sheet2, "Sheet2")
nb.AddPage(self.sheet3, "Sheet3")
self.sheet1.SetFocus()
self.StatusBar()

def StatusBar(self):
self.statusbar = self.CreateStatusBar()

def OnQuit(self, event):


self.Close()

class MyApp(wx.App):
def OnInit(self):
frame = Notebook(None, -1, 'notebook.py')
frame.Show(True)
frame.Centre()
return True

app = MyApp(0)
app.MainLoop()

Figura: notebook.py

Clases wx.lib
Bajo el directorio lib podemos encontrar otros widgets, mejoras o extensiones. Aqu vamos a mostrar
algunas clases ms tiles.

Gestos de ratn

Podemos encontrar gestos de ratn en aplicaciones tan exitosas como Firefox o Opera. Realmente ayudan a
los usuarios a ahorrar tiempo mientras navegan por el Interent. Los gestos del ratn se crean con

Wx.lib.gestures.MouseGestures clase en wxPython.

Mtodos posibles

AddGesture(string gesture, action) Registra un gesto del ratn


RemoveGesture(string gesture) Elimina un gesto del ratn

SetGesturePen(wx.Colour colour, integer width Establece el color y el ancho de la lnea dibujada


) para representar visualmente cada gesto

SetGesturesVisible (boolean vis)


Establece si se dibuja una lnea para representar
visualmente cada gesto

SetWobbleTolerance(integer wobbletolerance)
Establece la intensidad para desencadenar un
gesto

SetModifiers(list modifiers)
Toma una lista de constantes wx.Key (Control,
Mays y / o Alt)

SetMouseButton(integer flag)
Toma la constante wx para el mousebutton
objetivo

Gestos disponibles:

L para izquierda

R para la derecha

U para arriba

D para abajo

7 para el noroeste

9 para el noreste

1 para el sudoeste

3 para el sureste

Si usted se pregunta por qu estos nmeros fueron elegidos, echar un vistazo a la almohadilla numrica. Los
gestos del ratn pueden combinarse. De esta manera 'RDLU' es un gesto del ratn activado, cuando hacemos
un cuadrado con un puntero del ratn.

Las posibles banderas son:

wx.MOUSE_BTN_LEFT

wx.MOUSE_BTN_MIDDLE

Wx.MOUSE_BTN_RIGHT
#!/usr/bin/python

# mousegestures.py

import wx
import wx.lib.gestures as gest

class MyMouseGestures(wx.Frame):
def __init__ (self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(600, 500))

panel = wx.Panel(self, -1)


mg = gest.MouseGestures(panel, True, wx.MOUSE_BTN_LEFT)
mg.SetGesturePen(wx.Colour(255, 0, 0), 2)
mg.SetGesturesVisible(True)
mg.AddGesture('DR', self.OnDownRight)

def OnDownRight(self):
self.Close()

class MyApp(wx.App):
def OnInit(self):
frame = MyMouseGestures(None, -1, "mousegestures.py")
frame.Show(True)
frame.Centre()
return True

app = MyApp(0)
app.MainLoop()