... | ... | @@ -9,9 +9,20 @@ Cette session "G" a été ajoutée pour permettre de manipuler les **widgets de |
|
|
- :stop_button: boutons : Buttons.
|
|
|
|
|
|
On commence par un exemple simple avec Textbox, et pour la suite on va commenter des codes plus complets.
|
|
|
Au passage, on verra : **annotate**, les pièges de la portée des variables, **scatter** et un peu **numpy**.
|
|
|
|
|
|
A noter : on peut aussi ajouter des outils :tools: à la barre d'outil de matplotlib, ou reconfigurer mes outils existants.
|
|
|
|
|
|
Au passage, on manipulera la notion de "portée des variables". Certaines fonctions utilisent le mot-clef "global" pour pouvoir changer la valeur d'une variable du corps du programme dans une fonction. Cela est à utiliser avec précaution toutefois...
|
|
|
|
|
|
## à propos des widgets de matplotlib,
|
|
|
|
|
|
Il s'agit bien des widgets **de matplotlib**, intégrés aux figures, ce qui peut rendre service en phase de test sans assurer un rendu parfait... mais en s'épargnant le recours à une bibliothèque d'interface (Tkinter, PyQT ou PySide...). Il existe des bibliothèques tierces avec des améliorations de ces widgets, signalée [dans la rubrique Third Party Packages de MatPlotLib](https://matplotlib.org/stable/thirdpartypackages/index.html). Pour les curseurs, on trouve ainsi: mplcursors (interactive data cursors for Matplotlib), MplDataCursor ( toolkit to provide interactive "data cursors" (clickable annotation boxes) et mpl_interactions (easy to create interactive plots controlled by sliders and other widgets), non encore testées.
|
|
|
|
|
|
On signale ici qu'il existe aussi une bibliothèque iPython pour ajouter des widgets à un notebook Jupyter (non testé ici).
|
|
|
|
|
|
:warning: erreur courante : si vous définissez des widgets à l'intérieur d'une fonction, ils vont fonctionner un moment, jusqu'à ce que le "garbage collector" (ramasse-miette en français) considère, une fois la fonction terminée, que ces objets ne sont plus référencés même si la fenêtre matplotlib est toujours ouverte avec les widgets dessus ! Il va donc les supprimer :recycle:. Paradoxalement, ils seront toujours présents sur les figures mais inactifs (non-responsive en anglais, si vous cherchez des compléments sur les forums). Il faut donc veiller à ce que leur nom soit déclaré au-dehors de la fonction, soit en le définissant comme retour de fonction, soit en créant un attribut d'un objet mon_objet_qui_existe_dans_le_main.slider = mon_slider_dans_la_fonction. Le même problème existe pour les images intégrées dans une interface, il faut absolument leur donner un nom pour que l'objet correspondant ne soit pas jeté par le GC.
|
|
|
|
|
|
## Exemple simple : "textbox" et mise à jour d'une courbe
|
|
|
|
|
|
Dans cet exemple, on définit une figure avec deux vignettes : **ax** va accueillir le graphique tandis que **ax_tbox** , en dessous, va servir à placer la textbox. La textbox a :
|
... | ... | @@ -104,15 +115,7 @@ illustrations ; [fenêtre matplotlib de GenerateurCruesMaxAnnuels avec widgets e |
|
|
|
|
|
![Sample2Gumbel screenshot](/images/DixAnsAvecCentennaleEtQuinquennale.png)
|
|
|
|
|
|
Au passage, on manipulera la notion de "portée des variables". Certaines fonctions utilisent le mot-clef "global" pour pouvoir changer la valeur d'une variable du corps du programme dans une fonction. Cela est à utiliser avec précaution toutefois...
|
|
|
|
|
|
### à propos des widgets de matplotlib,
|
|
|
|
|
|
Il s'agit bien des widgets de matplotlib, ce qui peut rendre service en phase de test sans assurer un rendu parfait... mais en s'épargnant le recours à une bibliothèque d'interface (Tkinter, PyQT ou PySide...). Il existe des bibliothèques tierces avec des améliorations de ces widgets, signalée [dans la rubrique Third Party Packages de MatPlotLib](https://matplotlib.org/stable/thirdpartypackages/index.html). Pour les curseurs, on trouve ainsi: mplcursors (interactive data cursors for Matplotlib), MplDataCursor ( toolkit to provide interactive "data cursors" (clickable annotation boxes) et mpl_interactions (easy to create interactive plots controlled by sliders and other widgets), non encore testées.
|
|
|
|
|
|
On signale ici qu'il existe aussi une bibliothèque iPython pour ajouter des widgets à un notebook Jupyter (non testé ici).
|
|
|
|
|
|
:warning: :recycle: erreur courante : si vous définissez des widgets à l'intérieur d'une fonction, ils vont fonctionner un moment, jusqu'à ce que le "garbage collector" (ramasse-miette en français) considère, une fois la fonction terminée, que ces objets ne sont plus référencés même si la fenêtre matplotlib est toujours ouverte avec les widgets dessus ! Il va donc les supprimer. Ils seront toujours tracés, mais inactifs (non-responsive en anglais, si vous cherchez des compléments sur les forums). Il faut donc veiller à ce que leur nom soit déclaré au-dehors de la fonction, soit en le définissant comme retour de fonction, soit en créant un attribut d'un objet mon_objet_qui_existe_dans_le_main.slider = mon_slider_dans_la_fonction. Le même problème existe pour les images intégrées dans une interface, il faut absolument leur donner un nom pour que l'objet correspondant ne soit pas jeté par le GC.
|
|
|
|
|
|
### à propos des codes
|
|
|
|
... | ... | |