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

Reply via email to