# Autres langages > Python > GUI >  [kivy] Liste rinitialise avec ScreenManager

## Arsene12

Bonjour,

j'utilise Kivy et je pensais pouvoir utiliser une liste pour transmettre des paramtres lors de changement de fentre avec screenmanager. Or je m'aperois que lorsque je modifie une liste et qu'ensuite je clique pour passer  l'cran suivant, ma liste est rinitialise. Sauriez-vous comment remdier  ce problme svp? 



```

```

----------


## VinsS

Salut,

Tu parles de la liste _monText_ ?

On se demande  quoi elle sert, mais de toutes faons tu la recres vide  chaque action, donc elle ne peut contenir qu'un seul terme.

----------


## bistouille

Salut.




> "Ce bouton devrait afficher \"Th\" ou \"Caf\""


Tes boutons sont crs  l'instance de ta classe *ScreenTwo*, et c'est pas en modifiant ta liste que les textes des boutons vont se mettre  jour par magie. T'es quand mme trs mal parti, le principe de la poo n'est pas de tout fourrer dans l'init des classes en esprant que a marche, avec des bouts de codes glans ici et l, si tu ne structures pas ton code correctement ds le dpart tu vas droit dans le mur. Il serait quand mme judicieux de suivre un tutoriel sur comment coder en poo, a ne s'improvise pas, cela demande beaucoup de temps d'apprentissage, de tests, avant de s'attaquer  une bibliothque complexe comme kivy.

----------


## Arsene12

Merci pour vos rponses. Je pense que je suis sur la bonne voie. J'ai cr ce code qui montre comment faire passer une liste d'un cran  un autre, ventuellement la modifier, puis la repasser  un autre et ainsi de suite. Ds que j'aurai ma solution, je la posterai. 

Le problme que je rencontre est que je ne peux pas faire usage de la liste au moment du transfert (changement d'cran), pour par exemple remplacer le texte du bouton par le premier lment de la liste.



```

```

----------


## bistouille

Salut.

Pour partager un objet (des objets) entre plusieurs objet, bah un simple hritage suffit  le faire.



```

```

Ce qui dans ton code reviendrait  crer une classe drive de Screen, qui pourrait avoir comme allure un truc comme.



```

```

Et que donc tes classes Screen* hriteraient au lieu de Screen.

Sachant que *on_enter* est appel lors du changement d'cran, rien ne t'empeĉhe de mettre  jour tes boutons dans cette mthode.

----------


## wiztricks

> J'ai cr ce code qui montre comment faire passer une liste d'un cran  un autre, ventuellement la modifier, puis la repasser  un autre et ainsi de suite. Ds que j'aurai ma solution, je la posterai.


Les diffrences avec le code prcdent sont que la variable globale est devenue variable de classe, mais comme vous ne la r-initialisez plus... c'est tomb en marche.

Pour partager un objet entre plusieurs instances le passer en paramtre  la cration de l'instance est quand mme le plus naturel:


```

```

Puis de l'attraper lors de l' initialisation:



```

```

- W

----------


## Arsene12

> Les diffrences avec le code prcdent sont que la variable globale est devenue variable de classe, mais comme vous ne la r-initialisez plus... c'est tomb en marche.
> 
> Pour partager un objet entre plusieurs instances le passer en paramtre  la cration de l'instance est quand mme le plus naturel.


Merci. J'ai appliqu vos instructions. Je dclare la liste dans tous les crans de ScreenManager. Mais lorsque je passe de l'cran 1  l'cran 2 en modifiant la liste, je rcupre la liste initiale alors que je veux rcuprer la liste modifie. Le problme reste le mme.

Si on modifie la liste en cliquant sur "Modifier Liste" sur le 2me cran, puis qu'on passe  l'cran 3, on rcupre toujours la liste initiale.




```

```

Je trouve ScreenManager trs bien mais s'il me scratche mas variables je vais devoir l'abandonner et je le regrette.

Quand je rinitialise l'cran 2 dans la "class Screen 1" aprs avoir modifi la liste, je la transfre bien dans la "class 2", mais elle se rinitialise avec le super(Screen2, self)



```

```

----------


## wiztricks

> Mais lorsque je passe de l'cran 1  l'cran 2 en modifiant la liste, je rcupre la liste initiale alors que je veux rcuprer la liste modifie.


Ah ben oui... cependant dans votre premier post vous saviez apparemment le faire.
Difficile de ne pas penser que vous ne comprenez pas trop les lignes de codes que vous crivez et que vous n'avez pas pris le temps d'assimiler des notions de bases du langage auxquelles se confrontent tous les dbutants: porte des variables, objets mutables ou non,... 
Mais vous n'tes pas en train de batailler pour comprendre une de ces notions de base en essayant de faire un exercice...

- W

----------


## Arsene12

Rcuprer des paramtres est quelque chose de basique et je comprends pas pourquoi avec screenmanager on puisse pas y arriver simplement. J'ai une liste  l'cran 1 que je modifie lorsque je passe  l'cran 2. Je voudrai qu'un bouton de l'cran 2 affiche cette liste. En l'occurence, mon bouton devrait afficher [4,5,6] et non [1,2,3]



```

```





Voici comment je programme sans ScreenManager, a fonctionne trs bien.



```

```

----------


## bistouille

Salut.




> Rcuprer des paramtres est quelque chose de basique et je comprends pas pourquoi avec screenmanager on puisse pas y arriver simplement.


J'extrapole avec ce qui semble te poser problme, n'tant pas sr d'avoir tout saisi :
_
Je pense que tu n'as pas compris comment a fonctionne, le manager ne recre pas tes objets screen*  chaque changement d'cran (puisque c'est toi qui les instancies), tout est gard en mmoire, donc si quelque chose doit changer sur l'un des crans, c'est  toi de le mettre  jour._

Exemple simple (et crade), mais pas sr que ce soit la meilleure mthode ne connaissant pas vraiment kivy et les fonctionnalits proposes.



```

```

Mais pour moi, vu les impacts que peut causer la liste sur les diffrents crans, ta liste devrait tre un objet un peu plus complexe, auquel on pourrait inscrire des callbacks  appeler  chaque changements de ses valeurs.

----------


## wiztricks

Salut,




> Rcuprer des paramtres est quelque chose de basique et je comprends pas pourquoi avec screenmanager on puisse pas y arriver simplement.


Commencez par crer une classe  vous, deux instances qui partagent une liste, des mthodes qui modifient cette liste (partage) et une mthode qui l'affiche. Si vous y arrivez, vous aurez fait un grand pas dans la comprhension du problme et sur comment le rsoudre.

- W

----------


## Arsene12

Merci beaucoup pour toutes vos explications. Je commence  mieux comprendre et vous m'avez permis de trouver la solution. Elle repose sur la fonction *on_enter(self)*. La rponse m'tait donne par Bistouille  14h24 mais je l'avais pas vu, j'avais lu que la rponse suivante.  :8O:  Je me suis donc servi de la fonction _def on_enter(self):_ pour modifier ce que j'ai initialis avec _def __init__(self, **kwargs):_  Dans mon code ci-dessous, je n'ai pas cr de liste commune et j'ai utilis la mthode 

```
self.manager.get_screen("screen X").list = list(self.list)
```

 pour transfrer la liste  l'cran suivant.



```

```

----------

