Tutorial        

 

Ce tutorial est basé sur les fichiers tut01.py et tut02.py fournis avec PLUIE  (les deux noms précédents sont cliquables).

 

 Notions de base

L'utilisation de PLUIE est décomposé en deux parties (habituellement deux fonctions) :

    • la création d'une fiche (d'un écran) ; dans le tutorial, la fonction est cree()
    • l'utilisation d'une fiche créée ; dans le tutorial, la fonction est utilise()

 

Nous allons, bien sûr, commencer par la partie création d'une fiche.

 

 Propriétés des éléments

Une dernière notion, avant de commencer, c'est le groupe. Dans PLUIE, on ne pose pas les éléments "comme ça". Ils doivent toujours être insérés dans un groupe.

En pratique, on prépare l'objet. On l'insère, un peu plus tard, dans le groupe voulu.

Un groupe peut être inséré dans un autre groupe.

Tout élément de PLUIE a certaines propriétés. Pour l'instant, nous verrons uniquement celles qui vont nous servir. La première, c'est :

ID   est une chaîne qui identifie l'objet. Cette propriété est obligatoire. Mais, si elle est omise, elle sera créée automatiquement par PLUIE (au moment de son insertion dans un groupe).
ID sert à repérer (à se connecter à) l'élément dans une fiche PLUIE (pour affecter, ou lire une valeur, par exemple).
ID permettra également de savoir quel élément est concerné par un évènement, via la propriété "cible" de l'évènement, qui contiendra l'ID.

 

Attaquons-nous maintenant à créer notre première fiche.

 

 Création d'une fiche

Notre but, c'est d'obtenir ça :

       

Le début du code :

import pluie_ini
import pluie,time,os

def cree():
    g0=pluie.ggroup()

L'importation de pluie_ini  (fichier  pluie_ini.py)  permet à PLUIE de connaitre l'emplacement de quelques répertoires-clefs.

La dernière ligne correspond à la préparation d'un groupe. Pour créer un groupe, il faut instancier ggroup de PLUIE. Comme il n'y a pas d'ID, celle-ci sera calculée par PLUIE.

 

 

 

    t1=pluie.glabel(label='Ceci est un texte')

Préparation d'un libellé, à afficher sur l'écran. Nous instancions donc glabel de PLUIE.  Et nous découvrons une nouvelle propriété, label. Cette propriété existe pour glabel, mais pas pour ggroup, que nous avons vu plus haut.
On affecte une valeur à une propriété avec le signe =

 

 

 

    ch1=pluie.gchamp(ID='CH1', label='Calcul')
    ch2=pluie.gchamp(ID='CH2', label='Résultat')

Ici, on crée deux champs, avec, comme ID respectives, CH1 et CH2.  Notez l'utilisation de la propriété label, qui va contenir le texte précédant, à l'écran, chacun des champs.

 

 

 

     br=pluie.gbr(nb=2)

Cette ligne sert à définir  un saut de ligne. Grace à la priopriété nb, on peut indiquer combien de sauts de lignes PLUIE devra utiliser. 
Comme nous n'aurons pas besoin d'accéder ultérieurement à cet élément, nous ignorons l'ID.

 

 

 

    c1=pluie.gbutton(ID='BTCALC', label='Calculer')
    c2=pluie.gbutton(ID='BTQUIT', label='Quitter')

Ces deux lignes préparent deux boutons, dont les ID sont  "BTCALC" & "BTQUIT" . La propriété label sert à indiquer le texte qui sera écrit sur chaque bouton.

 

 

 

    g0.insert(br, t1, br, ch1,ch2, br, c1,c2)

On insère les différents éléments que nous avons préparés, dans le groupe g0.  Notez que l'insertion en une seule ligne n'est pas obligatoire. On aurait tout aussi bien pu écrire :

 

    g0.insert(br, t1, br)
    g0.insert(ch1,ch2, br)
    g0.insert(c1,c2)

 

 

Il ne reste plus qu'à conclure :

 

    pluie.gwrite(g0, template='pluie___.htm', fichier='temp.htm')
    return g0

La première ligne donne l'ordre à PLUIE de générer la fiche, en utilisant le template (squelette) pluie___.htm. La fiche sera écrite dans le fichier temp.htm.

La ligne finale est facultative. Elle ne servira que pour des utilisations avancées de PLUIE, comme la modification ou la création dynamique d'élements.

 

 

 Utilisation d'une fiche

Avec la fonction utilise(), nous allons pouvoir utiliser la fiche que nous venons juste de créer.

def utilise():
    g=pluie.pluie('temp.htm', width=420, height=400)

On ouvre la fiche enregistrée dans le fichier temp.htm, en lui donnant une largeur de 420 pixels, et une hauteur de 400.

C'est une partiocularité de PLUIE, de définir la taille d'une fiche au moment de l'utilisation, et non dans sa préparation. Cela a l'avantage de rendre la préparation des fiches un peu plus indépendante des résolutions de l'écran (enfin, c'est relatif).

Après l'éxécution de la ligne, la fiche est visualisée.

 

    ch1=g.ie.connectid('CH1')
    ch2=g.ie.connectid('CH2')
    ch1.value=''
    ch2.value=''
    ch1.focus()

Ici, on travaille sur la fiche, avant de gérer ses évènements. Donc, on :

  • connecte deux variables aux champs CH1 et CH2
  • on affecte des valeur (chaînes vides) à ces champs
  • on met le focus sur le champ CH1

 

 

 Gérer les évènements de la fiche

Travailler avec une fiche, cela passe par l'obtention d'informations sur les évènements qui s'y produisent.  On va utiliser une boucle qui réagira aux évènements fournis par PLUIE.

La boucle va tourner jusqu'à ce qu'on l'arrête, ou qu'une erreur se produise :

    while True:
        if not g.getnextaction():

Les évènements (blur, focus, clavier, souris, etc.) sont mémorisés dans une file (FIFO ; queue en anglais). Ainsi, on les traite au fur et à mesure, sans en perdre, même si les traitements sont longs. On peut dire qu'il y a un fonctionnement en threads séparés, entre la fiche et son utilisation.
La fonction getnextaction() va retourner l'évènement suivant, qui est en attente. S'il n'y a pas d'évènement, None est retourné. Si la fiche n'est plus disponible, le pseudo évènement "break" est retourné.

Les seuls évènements gérés sont les suivants : 

    • "clic" ; clic sur un bouton de la souris
    • "focus" ; arrivée dans un objet
    • "blur" ; lorsque le curseur quitte un objet
    • "key" ; appuie sur une touche du clavier
    • "changevalue" ; se déclenche, si, lors du "blur" d'un champ, le contenu a changé, depuis le "focus". Cet évènement précède toujours un "blur".
    • "break" ; c'est un pseudo-évènement, retourné par PLUIE, lorsqu'il n'arrive plus à joindre la fiche.

Les évènements disposent de plusieurs propriétés, pour aider à gérer la fiche :

    • .type ; type de l'évènement ("clic", "focus", "blur", "key", "changevalue","break")
    • .kbskey ; peut contenir "shift", "ctrl" ou "alt", si une de ces touches spéciales était enfoncée au moment de l'évènement
    • .cible ; ID de l'objet cible de l'évènement
    • .kbuffer ; code (ASCII) de la touche du clavier
    • .mousebutton ; bouton de la souris enfoncé au moment de l'évènement (1 gauche, 2 droit)

 

 

 

 

            if g.type=='break':
                print 'pluie cassé.'
                break
            else:
                time.sleep(0.050)

Si g.type=='break'  c'est qu'il y a (eu) un problème avec la fiche. On sort donc de la boucle de gestion.

Le time.sleep est là pour soulager le système, lorsqu'il ne se passe rien (pas d'évènement). Une fiche PLUIE au repose ne consomme pratiquement pas de ressources CPU.

 

        else:
            if g.type=='clic':

Teste s'il s'agit d'un clic de la souris. Bien que l'on puisse travailler avec des clics sur presque tous les éléments d'une fiche, nous allons, ici, simplement traiter ceux qui concernent les boutons (les autres clics seront otés de la file, mais ne seront pas traités).

 

                if g.cible=='BTCALC':
                    try:
                        result=eval(ch1.value, locals(),locals())
                    except:
                        result='Erreur dans le calcul.'
                    ch2.value=result

Si l'utilisateur a cliqué sur le bouton BTCALC, on va effectuer un traitement ; ici, on va effectuer un calcul, d'après le contenu du chlmp CH1 (on récèpère la valeur avec  "ch1.value"). Le résultat est affecté au champ CH2, par la dernière ligne.

 

                if g.cible=='BTQUIT':
                    print "Le bouton 'Quitter' a été cliqué."
                    g.close()
                    break

Ce bloc de code gère le cas où l'utilisateur a cliqué sur le bouton "Quitter".

 

Il ne reste plus qu'à lancer nos deux fonctions :

cree()
utilise()
 
 

 

 

 

 Comment fonctionne notre fiche  

Une fois la fiche ouverte, on peut saisir un calcul dans le champ "Calcul". Ensuite il faut cliquer sur le bouton "Calculer", pour voir le résultat dans le champ "Résultat". Pour fermer la fiche, on peut, soit cliquer sur le bouton "Quitter", soit utiliser la croix, en haut à droite.

Certes, cette fiche est simpliste, mais elle nous a permis de découvrir PLUIE.

 

 

 


 

Pour aller un peu plus loin, consultez le Tutorial-2, qui traite de la même fiche, légèrement revue et corrigée.