Hola,
he intentado infructuosamente subir el material que he preparado para el
curso al trac. No puedo crear páginas nuevas así que decidí pegarlo en
la propia pagina del curso y cuando lo tenía todo bonito me suelta:
Submission rejected as potential spam (Maximum number of external links
per post exceeded, Akismet says content is spam)
asi que adjuntos van unos ficheros en formato trac. Contienen un par de
apuntes que me servirán de guión para desarrollarlos durante el curso y
también "ejemplos interactivos" de código.
El curso es esta tarde a las 19.0000h
s,j
== aplicación ==
* app = wx.App()
* app.MainLoop()
* inicialización:
"""
class MyApp(App):
def OnInit():
pass
"""
== frame ==
* Un frame es lo que comúnmente conocemos como "ventana":
* titulo
* botones maximizar, etc
* manubar, toolbar, statusbar
* Una aplicación puede tener varias frames
== dialog ==
* Es un frame con caracterÃsticas concretas de diálogos
* modal
== panel ==
* Un panel es el tablero sobre el que se colocan los widgets u otros paneles
* Normalmente a un frame se asigna un panel que ocupa toda su extensión
== widgets ==
* botones, selectores, radioboxes y demás cacharros
== sizers ==
* Son un infierno
* sirven para organizar los elementos en un panel
1. Los widgets se crean con un panel como padre
2. Los widgets se añaden a un sizer y ciertos parámetros configuran su
comportamiento
3. Los sizers se pueden anidar
4. Al panel se le asigna un sizer que indica cómo tiene que dibujar sus
elementos hijos
== jearquÃa de los objetos ==
* Independiente de la jerarquÃa de los objetos en los módulos y clases python
* Los objetos tienen "parent", eso define la jerarquÃa
* object.GetParent() === object.Parent
* object.GrandParent
* independiente del sizer al que se haya asignado
== wxids y nombres ==
* Prácticamente cualquier widget o ventana tiene un nombre y un id
* Existen ids definidos por wx:
* wx.ID_OPEN, wx.ID_HELP, wx.ID_EXIT, etc
* podemos obtener un nuevo id: wx.NewId()
* podemos dejar que wxpython asigne un id automáticamente al objeto:
wx.ID_ANY
* object.getId() === object.Id
* object.getName() === object.Name
* wx.FindWindowById(parent = None)
* wx.FindWindowByName(parent = None)
* wx.FindWindowByLabel(parent = None)
== event binding ==
* Eventos: click en un botón, dobleclick, click con botón derecho, meter
texto, cerrar una ventana...
* Los eventos son generados en un widget o ventana. Si el widget no captura el
evento, éste sube a su padre y su padre y su padre... Quien captura el evento
puede decidir que se siga propagando hacia arriba después de hacer sus
gestiones.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import wx
def CreateMenuBar():
mb = wx.MenuBar()
m1 = wx.Menu()
m1.Append(-1, "foo")
m1.Append(-1, "bar")
m1.AppendSeparator()
m1.Append(wx.ID_EXIT, "Salir")
m2 = wx.Menu()
m2.Append(wx.ID_HELP, "Ayuda")
m2.Append(wx.ID_ABOUT, "Acerca de")
mb.Append(m1, "&Archivo")
mb.Append(m2, "A&yuda")
return mb
if __name__ == '__main__':
app = wx.App()
frame = wx.Frame(None, title = "Hackademy")
panel = wx.Panel(frame)
btn1 = wx.Button(panel, label = "timbre00")
btn2 = wx.Button(panel, label = "timbre01")
sizer = wx.BoxSizer()
sizer.Add(btn1, 1, wx.EXPAND, 5)
sizer.Add(btn2, 1, wx.ALL, 5)
panel.SetSizer(sizer)
menu = CreateMenuBar()
frame.SetMenuBar(menu)
btn1.Bind(wx.EVT_BUTTON, OnButton)
frame.Show()
app.MainLoop()
### Chuleta
"""
1. panel con color de fondo
panel = wx.Panel(frame)
panel.SetBackgroundColour(wx.BLUE)
eq:
panel.BackgroundColour = wx.BLUE
panel.SetBackgroundColour(wx.Colour(142,0,0))
2. menubar
def CreateMenuBar():
mb = wx.MenuBar()
m1 = wx.Menu()
m1.Append(-1, "foo")
m1.Append(-1, "bar")
m1.AppendSeparator()
m1.Append(wx.ID_EXIT, "Salir")
m2 = wx.Menu()
m2.Append(wx.ID_HELP, "Ayuda")
m2.Append(wx.ID_ABOUT, "Acerca de")
mb.Append(m1, "&Archivo")
mb.Append(m2, "A&yuda")
return mb
-----
menu = CreateMenuBar()
frame.SetMenuBar(menu)
3. statusbar
frame.CreateStatusBar(number = 2)
frame.SetStatusWidths([100, -1])
frame.SetStatusText("ping", 0)
frame.SetStatusText("pong", 1)
4. un botón
btn = wx.Button(frame, label = "timbre")
btn = wx.Button(panel, label = "timbre")
4.1 dos botones
btn = wx.Button(frame, label = "timbre00")
btn = wx.Button(frame, label = "timbre01")
5. sizer básico
sizer = wx.BoxSizer() # wx.VERTICAL # wx.EXPAND
sizer.Add(btn1) # , 0, wx.ALL, 5
sizer.Add(btn2)
panel.SetSizer(sizer)
----
#sizer.AddSpacer(10)
#sizer.AddStretchSpacer(1)
6. anidar sizers
sizer2 = wx.BoxSizer(wx.VERTICAL)
sizer2.AddStretchSpacer(1)
sizer2.Add(sizer)
sizer2.AddStretchSpacer(1)
panel.SetSizer(sizer2)
7. binding
7.1 el menú exit
def OnExit(evt):
import sys
sys.exit()
frame.Bind(wx.EVT_MENU, OnExit, id = wx.ID_EXIT)
7.2 un botón
def OnButton(evt):
app = wx.GetApp()
frame = app.GetTopWindow()
a = wx.MessageDialog(frame, "Están tocando la puerta", "Hey!")
a.ShowModal()
panel.Bind(wx.EVT_BUTTON, OnButton, btn1)
btn1.Bind(wx.EVT_BUTTON, OnButton)
"""
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import wx
class LaAplicacion(wx.App):
def OnInit(self):
self.loc = wx.Locale(wx.LANGUAGE_SPANISH)
self.frame = self.CreaElFrame()
# self.manager = wx.aui.AuiManager(self.frame)
self.SetTopWindow(self.frame)
self.frame.Show()
return True
def CreaElFrame(self):
frame = wx.Frame(None, title = "Hackademy")
mb = self.CreaElMenuBar()
frame.SetMenuBar(mb)
self.CreaLaStatusBar(frame)
frame.Bind(wx.EVT_MENU, self.OnExit, id = wx.ID_EXIT)
panel = wx.Panel(frame)
btn1 = wx.Button(panel, label = "timbre00")
btn2 = wx.Button(panel, label = "timbre01")
sizer = wx.BoxSizer()
sizer.Add(btn1, 1, wx.EXPAND, 5)
sizer.Add(btn2, 1, wx.ALL, 5)
panel.SetSizer(sizer)
btn1.Bind(wx.EVT_BUTTON, self.OnTimbre)
return frame
def CreaElMenuBar(self):
mb = wx.MenuBar()
m1 = wx.Menu()
m1.Append(-1, "foo")
m1.Append(-1, "bar")
m1.AppendSeparator()
m1.Append(wx.ID_EXIT, "Salir")
m2 = wx.Menu()
m2.Append(wx.ID_HELP, "Ayuda")
m2.Append(wx.ID_ABOUT, "Acerca de")
mb.Append(m1, "&Archivo")
mb.Append(m2, "A&yuda")
return mb
def CreaLaStatusBar(self, frame):
frame.CreateStatusBar(number = 2)
frame.SetStatusWidths([100, -1])
frame.SetStatusText("ping", 0)
frame.SetStatusText("pong", 1)
def OnExit(self, evt):
import sys
sys.exit()
def OnTimbre(self, evt):
a = wx.MessageDialog(self.frame, "Están tocando la puerta", "Hey!")
a.ShowModal()
if __name__ == '__main__':
app = LaAplicacion()
app.MainLoop()
== curso de wxpython ==
=== que es wxpython ===
* Es un toolkit gráfico basado en wxwidgets.
* wxwidgets antes se llamaba wxwindows. Problemas de
* wxwidgets está programado en C++
* wxpython es un binding a python de wxwidgets
* Robin Dunn
==== caracteristicas principales de wxwidgets y wxpython ====
* wxwidgets ademas de toolkit gráfico tiene gestión de conexiones de red,
algo de mutimedia, animaciones, opengl, pubsub
* la gestión de red creo que no está portada a wxpython ya que python tiene
buenas librerÃas estándar
* wxwidgets es multiplatforma. Es un wrapper (envoltorio) de la librerÃa
gráfica nativa del sistema operativo
* en windows wxwidgets utiliza MFC
* en mac, ¿aqua se llama?
* para sistemas gnu/linux se usa gtk (nadie se ha currado la adaptación a qt
u otros)
* existen ports para otros sistemas raros (solaris?)
* "gtk, qt y otras también son multiplataforma"
* gtk, qt y otras tienen su propia renderización y pueden emular el
look&feel del sistema operativo
* wxwidgets/wxpython usa directamente los widgets nativos del s.o.
* esto no necesariamente es una ventaja de wx.
* con cualquier toolkit siempre tendremos que probar en todos los s.o. en los
que queramos que corra la app
* wxwidgets o wxpython implementan widgets propios que no están soportados en
mfc,aqua,gtk
* opción 1: un widget nativo de gtk no disponible en los otros: se
implementa en los otros para compatibilizar
* opción 2: un widget que no existe en gtk,mfc,aqua: se implementa sobre la
api de wxwidgets/wxpython
* "pure-python widgets"
* versión estable actual 2.8
* las versiones pares son estables, las impares inestables
* wxwebkit
=== instalación ===
* windows
* mac
* gnu/linux:
* apt para debian y ubuntu
"""
curl http://apt.wxwidgets.org/key.asc | sudo apt-key add -
# wxWidgets/wxPython repository at apt.wxwidgets.org
deb http://apt.wxwidgets.org/ DIST-wx main
deb-src http://apt.wxwidgets.org/ DIST-wx main
apt-get install python-wxgtk2.8 python-wxtools wx2.8-examples wx2.8-doc
"""
=== contenido de los paquetes ===
* python-wxgtk2.8 = las librerÃas wxpython
* python-wxtools = unas cuantas aplicaciones para desarrollo
* wx2.8-examples = la demo de wxpython
* wx2.8-doc = la documentación de wxwidgets
== python-wxgtk2.8 ==
* depende del paquete de la librerÃa c++ de wx
* compilado para pythno 2.4 y 2.5
* instala wxpython en el sitio habitual:
- /usr/lib/python2.5/site-packages/wx-2.8-gtk2-unicode
- /usr/share/pyshared/wx-2.8-gtk2-unicode
* contiene algunas aplicaciones además de la librerÃa:
* xrced: /usr/share/pyshared/wx-2.8-gtk2-unicode/wx/tools/XRCed (necesita
python-xml)
* editra: /usr/share/pyshared/wx-2.8-gtk2-unicode/wx/tools/Editra
== python-wxtools ==
* pyshell
* pycrust
* pyalacarte, pyalamode y otros
== wx2.8-examples ==
* /usr/share/doc/wx2.8-examples/
* código de ejemplo de wxwidgets (c++)
* la demo de wxpython
=== instalar la demo ===
"""
cd /usr/share/doc/wx2.8-examples/examples
./unpack_examples.sh wxPython /usr/src/wxpython-examples
/usr/src/wxpython-examples/wxPython/demo.py
"""
== wx2.8-doc ==
* manual de wxwidgets para usarlo offline
* lynx /usr/share/doc/wx2.8-doc/wx-manual.html/index.html
* nota: la api de wxpython también se puede descargar en tarball desde
http://wxpython.org
== otros paquetes ==
* python-wxglade
* boa-constructor
* pythoncard
=== documentación ===
* El manual de wxwidgets: es la referencia "de fondo" sobre el toolkit y la
forma de uso de las distintas clases. Está escrita para el toolkit principal
en C++. Incorpora anotaciones extra para wxpython y wxperl.
* La API de wxpython: es la referencia de las clases y funciones de wxpython.
Es una API generada automáticamente a partir de la documentación del código
fuente.
* El wiki de wxpython: está un poco desfasado porque mucho código es para
wxpython 2.4 y 2.6, pero incluye información clave para resolver ciertas cosas
con wxpython.
* La demo de wxpython
==== otros recursos ====
* La lista de correos wxpython-users es muy activa
* La demo de wxpython
* es un buen recurso para ver ejemplos de qué se puede hacer con wxpython
* se puede ver el código de los ejemplos, modificarlo, ejecutarlo, guardarlo
* Widgets para wxpython:
* el subdirectorio lib/ (ver en la api)
* El gran Andrea Gavana:
* http://xoomer.virgilio.it/infinity77/main/freeware.html
* /usr/share/pyshared/wx-2.8-gtk2-unicode/wx/lib/agw
=== enlaces ===
* http://wxwidgets.org/
* http://wxpython.org/
* APT:
* Documentación:
* Manual de wxwidgets: http://docs.wxwidgets.org/stable/
* API de wxpython:
* online: http://wxpython.org/docs/api/
* tarball:
http://downloads.sourceforge.net/wxpython/wxPython-newdocs-2.8.9.2.tar.bz2
* Wiki de wxpython: http://wiki.wxpython.org
* Listas de correo:
* http://wxpython.org/maillist.php
_______________________________________________
Hackademy mailing list
Hackademy@listas.sindominio.net
https://listas.sindominio.net/mailman/listinfo/hackademy