# Autres langages > Python > GUI >  Tkinter et Matplotlib

## LittleBN

Bonjour  tous ! 

Alors j'ai crer un programme ou il y a un graphique avec matplotlib mais j'aimerai pouvoir le "cacher" avec un place_forget() Le problme c'est que lorsque que je fais cela j'ai le message d'erreur suivant : 

              AttributeError: 'FigureCanvasTkAgg' object has no attribute 'place_forget'

Voici la portion de code concern pour l'affichage : 



```

```

Et celle pour le "cacher" : 



```

```


Merci de vos rponses !

----------


## wiztricks

Salut,

Relisez le message d'erreur:


```
AttributeError: 'FigureCanvasTkAgg' object has no attribute 'place_forget'
```

Si un objet de type FigureCanvasTkAgg n'a pas de mthode place_forget c'est qu'il n'est pas widget Tkinter.

D'ailleurs quand vous crivez:


```
canvas.get_tk_widget().place(x=150, y =200)
```

Vous appliquez la mthode .place au widget Tkinter associ  l'instance de FigureCanvasTkAgg et rcupr via l'appel canvas.get_tk_widget().

Plus court d'crire "en Python" que d'essayer de traduire en franais, n'est-il pas?
Mais crire:


```
canvas.place_forget()
```

est trop court. 
L'interprteur ne va mme pas essayer d'inventer le bout qui manque: il gueule "AttributeError".


- W

----------


## LittleBN

Merci pour la rponse ! 

En effet il manquait un bout de code, j'ai donc essay : 



```
canvas.get_tk_widget().place_forget()
```

Et le message d'erreur est parti ! Par contre mon graphique ne s'enlve toujours pas :/. Que faire ?

Merci

----------


## wiztricks

Peut tre que poster un code plus complet serait un bon dbut.
Sans pouvoir "reproduire" ce que vous voyez autant discuter du sexe des anges.

- W

----------


## LittleBN

Mais je sais pas trop ce qui pourrait t'aider donc 

Tous le programme (en travaux) : 



```

```


Ligne 209 il y a le fameux canvas et le place_forget qui ne veut pas fonctionner !

----------


## wiztricks

Salut,

Il manque trop de bouts  votre code pour pouvoir le faire fonctionner.

Une lecture en diagonale me laisse penser que le canvas construit dans le callback recherche_coef_trajectoire n'est pas le canvas dclar en "global". Le graphique s'affiche dans ce canvas l... Mais canvas.get_tk_widget().place_forget() ne tape pas sur le bon widget.

A vous de voir comment corriger .

- W

----------


## LittleBN

Bonjour, 

J'ai cherch en vain mais je ne trouve pas de solution ! Pouvez vous m'clairer d'avantage ?

Merci !

----------


## wiztricks

Reprenez le code que vous avez post.
Cherchez les appels  FigureCanvasTkAgg.
A chaque appel vous fabriquez un nouveau canvas.
Quel est celui auquel est appliqu le .place_forget()?

- W

----------


## LittleBN

Un appel c'est bien quand je fais canvas = FigureCanvasTkAgg(f, master=p2) ?

Dans ce cas l je l'appelle deux fois, un ligne 85 dans la fonction recherche_coef_trajectoire() et un ligne 355.

Et si je suis l'ordre dexcution du programme le place_forget() s'applique au canvas ligne 355.

Je ne vois donc pas do le problme peux venir sachant que les noms concordent sauf pour le global mais si je met : global canvas.get_tk_widget() cela ne fonctionne pas ! 

Que faire ?

----------


## wiztricks

La question est de savoir si vous voulez:
- un seul canvas (pourquoi en crer deux via 2 appels  FigureCanvasTkAgg),
- deux canvas et dans ce cas tre sr que vous appliquez .place_forget au bon.
Impossible de corriger le code sans savoir ce que vous voulez.

- W

----------


## LittleBN

Et bien si j'en fais deux c'est parce que je n'ai pas le choix ! Est ce que vous avez lanc le programme ? 

Si oui vous avez vu que mon but est de pouvoir changer le panneau situ  droite en cliquant sur les "modes" dans les listes  gauche.

Mais comme je souhaite qu'il y ai dj quelque chose d'afficher au lancement du programme, il faut que je mette deux fois le contenu de ce qui sera afficher  l'ouverture du programme. 

Il existe peut tre un meilleur moyen de faire ce que je souhaite ?

J'espre m'tre fais comprendre 

Merci.

----------


## wiztricks

> Et bien si j'en fais deux c'est parce que je n'ai pas le choix ! Est ce que vous avez lanc le programme ?


hum, votre programme est aussi embrouill que vos explications.
Pour moi, il tourne avec plein d'erreurs mais il tourne.
Est ce qu'il fait ce que vous voudriez? 
Probablement pas sinon vous ne rleriez pas ici.




> Si oui vous avez vu que mon but est de pouvoir changer le panneau situ  droite en cliquant sur les "modes" dans les listes  gauche.


Lorsque je clique sur les options  gauche, le menu affich  droite change parfois.

Aprs essayer de comprendre par ou a passe dans votre code, bonjour! 
C'est en fonction d'un index dans des listes lP, lM,...
Il y a des variables globales partout avec des noms a1, a2,....
Et le tout sur 400 lignes!

C'est pas un reproche. Je faisais probablement pire  mes dbuts. 
Mais a part tout reprendre calmement pour essayer de dcortiquer ce que vous avez voulu faire, il m'est difficile de faire quelque chose avec votre code except "run" et croiser les doigts.

Dsol
- W

----------


## LittleBN

Je comprend bien ce que vous voulez dire ! En effet c'est mon tout premier programme que je fais pour la nouvelle option ISN (Informatiques et Sciences du Numrique) en Terminale S. Mais les profs ne sont pas plus renseigns que nous !

En effet les options  gauches ne sont pas encore toute disponible car je n'ai pas finis le programme (seulement quation second degrs et quation d'une parabole). Pour l'instant j'essaye de rsoudre ce problme d'affichage.

Les variables Global tait ncessaire car sans elle j'obtiens un message d'erreur de ce genre : 



```
UnboundLocalError: local variable 'presentation' referenced before assignment
```

Si vous ne comprenez pas quelque chose dites le moi ! Mais ma vrai question est de pouvoir faire un affichage qui varie avec les options  gauches. Peut tre que vous connaissez une mthode plus "rglementaire"

Merci.

----------


## wiztricks

Salut,

Si vous ne comprenez plus ce que votre code fait, c'est bien dommage mais le mettre  la "poubelle" risque d'tre la moins mauvaise solution. Vous ne refaites pas tout, vous essayez de mettre le truc "au propre".

Cela fait on reconstruit comment? C'est le boulot de vos profs de vous expliquer cela. Ils ont du temps et en plus sont pays pour . Ici vous tes dans un forum d'entre-aide ou les contributeurs ne peuvent pas passer des journes avec vous. En plus comme nous ne savons pas ce que vous avez appris, pas facile de vous proposer les constructions les plus digestes.

La seule chose que je peux vous proposer est de dcouper votre truc en morceaux.
Ces morceaux ralisent un s/ensemble des fonctionnalits attendues.
Lorsque vous tes "satisfait" du morceau vous l'assemblez, l'intgrer.

Exemple "ct Figure", je suis amus  amliorer l'exemple de la documentation matplotlib pour raliser des fonctions qui font a peu prs ce que vous attendez:


```

```

Vous vous rendez compte que ce que  affiche est anecdotique compar au reste.
Et le reste est la "structure", i.e. le minimum syndical pour faire fonctionner afficher, masquer, dessiner, nettoyer,...
Ce minimum n'est pas trivial: il faut lire la doc., tester, ...
Et au plus vous allez ajouter des grigris sur votre interface utilisateur, au plus il y aura du monde pour faire le boulot derrire. Si la structure n'est pas assez solide, le machin va crouler sous son poids.

Bon courage,

- W

----------


## LittleBN

Merci ! Votre exemple est parfait la fonction figure_hide() m'a permis de me rendre compte que j'avais effectivement oubli quelque chose ! 

Dans la ligne figure.canvas.get_tk_widget().pack_forget()  j'avais oublier de mettre figure au dbut ce qui faisait que a ne marchais pas ! 

Sinon je prend en note le conseille de ranger mon code et de rorganiser tout a ! 

Je considre le topic rsolu ! Merci encore !

----------

