Partage
  • Partager sur Facebook
  • Partager sur Twitter

Créer une variable globale

Sujet résolu
    26 janvier 2015 à 17:06:02

    Hello tout le monde ;)

    Tout est dans le titre, je souhaite créer une varibla globale qui pourra être modifiée dans les différentes fonctions de différentes classes.

    J'ai déjà essayé de mettre maVariable = 1, puis lors de l'appel à une fonction d'une classe 1 je mets :

    global maVariable

    maVariable = 2

    Et dans une classe 2, je mets alors print maVariable et j'obtiens maVariable = 1...

    Auriez-vous une idée de comment faire?

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      26 janvier 2015 à 17:15:32

      Personne te conseillera pour cette mauvaise idée...

      Pour te guider,

      >>> def modify(var):
      ...     return 2
      ... 
      >>> a = 5
      >>> a = modify(a)
      >>> a
      2
      



      • Partager sur Facebook
      • Partager sur Twitter
        26 janvier 2015 à 17:18:28

        Lol est-ce vraiment une mauvaise idée ? Mon programme est beaucoup plus complexe que ce que j'explique.

        En fait, j'utilise Kivy et j'ai fait un screen manager, j'aimerai pouvoir récupérer des variables entrées tout au long des pages... Chaque page étant définie dans une classe, je me suis dit que je pouvais stocker ça dans des variables globales. Pour pouvoir les afficher à la fin...

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          26 janvier 2015 à 17:24:38

          Lol est-ce vraiment une mauvaise idée ?

          Oui je te le dis !

          j'aimerai pouvoir récupérer des variables entrées tout au long des pages... Chaque page étant définie dans une classe

          Il n'y a absolument pas besoin de variables globales, je confirme...

          >>> class A:
          ...     def __init__(self):
          ...         self.v = 5
          ... 
          >>> a.v
          5
          >>> a.v = 3
          >>> a.v
          3
          



          • Partager sur Facebook
          • Partager sur Twitter
            26 janvier 2015 à 17:30:16

            D'accord, alors comment appeler a.v dans une classe B puisque dans le code on n'instancie pas a?

            (Désolée je débute en python...)

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              26 janvier 2015 à 17:33:39

              Montre un exemple de code où ce que tu veux faire n'est pas fonctionnel, un code simple.
              • Partager sur Facebook
              • Partager sur Twitter
                26 janvier 2015 à 17:37:45

                 class OneScreen(Screen):
                 m = ObjectProperty(None)
                 f = ObjectProperty(None) s = 'undefined'
                 def save(self):
                  if self.m.state == 'down':
                   s = 'm'
                  elif self.f.state == 'down':
                   s = 'f'
                class Test(Screen):
                 lab = ObjectProperty(None)
                 o = OneScreen()  lab = o.s
                sm = ScreenManager()
                sm.add_widget(OneScreen(name='menu'))
                sm.add_widget(Test(name='test'))
                Voilà en très simplifié, et quand je fais lab = s, je ne sais pas comment faire pour dire que je veux la valeur de s qui a été donnée dans la classe précédente...

                -
                Edité par Nouiiille 26 janvier 2015 à 17:48:17

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  26 janvier 2015 à 17:45:11

                  Qu'est-ce qui t'empêche d'instancier OneScreen dans Test, si tu en as besoin ?

                  EDIT:

                  ou peut-être créer une fonction

                  class Test(Screen):
                      # ...
                      def modify(self, widget):
                          self.lab = widget.s



                  -
                  Edité par Anonyme 26 janvier 2015 à 17:48:27

                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 janvier 2015 à 17:47:12

                    Oui je viens de modifier mon post, j'ai tenté mais cela ne prend pas en compte les modifications faites dans la fonction.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 janvier 2015 à 17:49:24

                      class OneScreen(Screen):
                      	m = ObjectProperty(None)
                      	f = ObjectProperty(None)	s = 'undefined'
                      	def save(self):
                      		if self.m.state == 'down':
                      			s = 'm'
                      		elif self.f.state == 'down':
                      			s = 'f'
                      
                      class Test(Screen):
                      	lab = ObjectProperty(None)
                      	o = OneScreen()		lab = o.s
                      
                      sm = ScreenManager()
                      sm.add_widget(OneScreen(name='menu'))
                      sm.add_widget(Test(name='test'))
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        26 janvier 2015 à 17:50:57

                        Sur le principe ce que je veux dire donnerait cela

                        >>> class A:
                        ...     def __init__(self):
                        ...         self.v = 3
                        ... 
                        >>> class B:
                        ...     def __init__(self):
                        ...         self.a = A()
                        ...         self.lab = self.a.v
                        ... 
                        >>> b = B()
                        >>> b.lab
                        3
                        



                        -
                        Edité par Anonyme 26 janvier 2015 à 18:18:12

                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 janvier 2015 à 11:01:35

                          Non cela ne fonctionne pas car dans B cela recrée une instance de A, donc ça marche si v est modifié dans l'initialisation mais si v se modifie par une condition, l'instance recréée de A dans B ne prendra pas cette modif en compte...
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            27 janvier 2015 à 11:51:47

                            >>> varState = {'m': 'down', 'f': 'down', 's': None}
                            >>> class Test:
                            ...     if varState['m'] == 'down' and varState['f'] == 'down':
                            ...         lab = varState['s'] = 'm'
                            ... 
                            >>> t = Test()
                            >>> t.lab
                            'm'
                            
                            Avec un dictionnaire pour contrôler tes variables, peut-être ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              27 janvier 2015 à 14:24:14

                              J'ai tenté mais cela ne fonctionne pas, je ne peux pas entrer l'état par défaut de m et f car en fait dans mon appli kivy ce sont des boutons et le 'down' signifie qu'on a appuyé sur ces boutons.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                27 janvier 2015 à 14:40:13

                                Quand cela fonctionne sur un code simple, ça fonctionne aussi sur un code complexe, il suffit de donner le bon code simple à mettre en place pour tes tests.

                                Je crois fermement que cette solution est celle que tu souhaites, seulement, tu ne dois pas l'utiliser correctement. Quelques questions pour guider un peu...

                                Tu as dû créer un callback permettant de d'agir lorsqu'on appui sur un bouton, de là qu'as-tu fais ?

                                Pour faire simple, 

                                varState = {'m': None, 'f': None, 's': None}
                                
                                def callback(instance):
                                    varState['m'] = 'down'
                                
                                

                                Évidemment je fais tout cela en freestyle, mais ça doit fonctionner et modifier la clé m du dictionnaire, lorsqu'on appui sur le bouton avec cette ligne

                                bouton = Button(text='Apply')
                                bouton.bind(on_press=callback)

                                Je connais pas Kivy, je précise, je me contente de lire la documentation.

                                Si ce simple code est fonctionnel, qu'est-ce qui t'empêche de le faire via une classe ?

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 janvier 2015 à 14:47:41

                                  Bon finalement j'ai tout mis dans une même classe et j'ai passé mes variables en argumant.

                                  Merci beaucoup pour ton aide ! :)

                                  Je mets le sujet en résolu !

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Créer une variable globale

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown