PyMT 0.2, enfin !


Presque 2 mois d’écart avec la 0.1, voici PyMT 0.2 qui est sorti. Pleins de bonnes choses, mais le succès ramène aussi son lot de soucis.

Ainsi, j’ai pu découvrir une analogie entre le monde du web et le monde d’opengl. Parfois, opengl est ATI ce que le javascript est à IE. Je vous passe les détails, mais si vous êtes possesseur d’une carte ATI, vous passerez votre chemin encore une fois… Mais on travaille dessus !

Sinon, avec cette nouvelle version, j’ai une base pour Noya très fonctionnelle, que je montrerais en vidéo très bientôt !


Au retour du TouchCamp…


C’était déconcertant et géant.

Arrivé un peu en retard le samedi matin (merci la SNCF de m’avoir donné un AR Paris formule Duo, alors que j’étais tout seul), j’arrive à la cantine où pleins de gens étaient en train d’écouter un autre gens. (difficile de retenir une masse de prénom.)

Déconcertant car en fait, c’était un tour de table, et la totalité des gens est passé par la case “je me présente au micro”. Pourquoi pas, c’est ca, un Bar Camp : tout le monde acteur. Et ca continue, on a du remplir sur un grand tableau archaïque (bah oui, c’est THE événement du multitouch, et on utilise la craie !) pour faire l’emploi du temps de la journée.

Sur le tableau, pleins de colonnes représentant les tables multitouchs disponibles dont Touchtou, Immersion, Muchomedia, Surface… Premier défi : trouver les représentants des tables, et voir si je peux démarrer PyMT dessus. D’ailleurs les gens là bas disait “pimp”, ca me donne des idées de slogans (Pimp my table).

Et c’est sur Immersion qu’est tombée la lourde tâche de me laisser un accès à leur table 🙂 La conférence PyMT s’est déroulée en début d’après midi. N’ayant pas pu tester le framework avant sur la table (j’ai du faire un allé/retour à Montgallet: j’avais laissé ma batterie de pc à Lille…), la première dizaine de minutes a été laborieuse. Difficile de commencer la présentation + configurer l’ensemble avec la table. Cela a agacé quelques personnes, mais une fois que la démo a commencée, un max de gens était autour de la table. Un vrai succès, malgré avoir essuyer pas mal de bug en live. Certains sont intéressés et impatient de faire une application sous PyMT.

Il a trop à raconter, je vais terminer ce billet en remerciant grandement Jim’, pour son charisme et son investissement sur ce TouchCamp, c’était une réussite. (et merci pour le reste à toi et ln, j’espère sincérement te revoir bientôt 🙂 )


Python et les decorateurs avec __init__


Question: comment faire pour générer un évenement de chargement après l’initialisation d’une classe, de manière générique ?

Sur cette simple question, prenons un example :

  1. class A(object):
  2. def __init__(self):
  3. print 'init A'
  4.  
  5. class B(A):
  6. def __init__(self):
  7. print 'init B'
  8. super(B, self).__init__()
  9. print 'fin init B'
  10.  
  11. B()

Le programme affiche successivement :

init B
init A
fin init B

Le but est d’exécuter une fonction, à la fin de init B. Pour cela, on peut faire appel au décorateur python.
Voilà de quoi j’ai rêvé cette nuit (mmh…) :

  1. def decorate_onload(f):
  2. def my_init(*args, **kwargs):
  3. inst = args[0]
  4. if hasattr(inst, '__decorate_onload__'):
  5. return f(*args, **kwargs)
  6. inst.__setattr__('__decorate_onload__', True)
  7. f(*args, **kwargs)
  8. print 'launch on_load!'
  9. return my_init
  10.  
  11. class A(object):
  12. @decorate_onload
  13. def __init__(self):
  14. print 'init A'
  15.  
  16. class B(A):
  17. @decorate_onload
  18. def __init__(self):
  19. print 'init B'
  20. super(B, self).__init__()
  21. print 'fin init B'
  22.  
  23. class C(B):
  24. @decorate_onload
  25. def __init__(self):
  26. print 'init C'
  27. super(C, self).__init__()
  28. print 'fin init C'
  29.  
  30. C()

Et ce code magique affiche… :

init C
init B
init A
fin init B
fin init C
launch on_load!

Le print ‘on_load’, est bien appellé seulement quand l’intégralité du widget a terminé de charger !
Comment ca marche ? C’est tout simple :

  1. def decorate_onload(f):
  2. def my_init(*args, **kwargs):
  3. inst = args[0]

Ici, on définit un nouveau décorateur, et on récupère l’instance de la classe en cours d’initialisation

  1. if hasattr(inst, '__decorate_onload__'):
  2. return f(*args, **kwargs)

L’instance de la classe est unique. Si la fonction de chargement est déjà hooker par un init, on ne fait rien.

  1. inst.__setattr__('__decorate_onload__', True)

Sinon, on indique que l’on gère le onload. Cela sera valable au tout premier appel du décorateur sur l’instance => il sera toujours executé par le init de plus haut niveau.

  1. f(*args, **kwargs)
  2. print 'launch on_load!'
  3. return my_init

On exécute le init normalement, et on affiche ‘on_load’. C’est ici que l’on peut remplacer par un appel de fonction sur l’instance de l’object.

Simple, encore fallait-il le trouver.