Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Register
  • Sign in
  • PYTHON - Atelier MatPlotLib PYTHON - Atelier MatPlotLib
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar

La forge institutionnelle d'INRAE étant en production depuis le 10 juin 2025, nous vous recommandons d'y créer tous vos nouveaux projets.

  • Poulard Christine
  • PYTHON - Atelier MatPlotLibPYTHON - Atelier MatPlotLib
  • Wiki
  • Atelier_G_widgets

Atelier_G_widgets · Changes

Page history
Update Atelier_G_widgets authored Dec 01, 2021 by Poulard Christine's avatar Poulard Christine
Show whitespace changes
Inline Side-by-side
Atelier_G_widgets.md
View page @ 11356815
......@@ -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
......
Clone repository
  • AtelierB1_Graphiques_simples
  • AtelierB2_Lire_un_fichier
  • AtelierC
  • Atelier_D_carte
  • Atelier_D_carte_a_partir_de_fichiers_binaires
  • Atelier_E_longues_series
  • Atelier_G_widgets
  • Atelier_clic_afficher
  • Atelier_clics
  • Cartes focus sur le redimensionnement
  • GUI avec QT
  • La doc avec Sphinx
  • Lexique
  • Point Théorie Subplots
  • Pour les contributeurs
View All Pages