IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Changer une variable d'une classe et qu'une autre classe le sache [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut Changer une variable d'une classe et qu'une autre classe le sache
    Bonjour,

    Je suis une nouvelle fois bloqué.

    Le bouton Stop/Start est sensé changer la variable self.game_status mais ensuite je n'arrive pas à transférer le nouvelle état de self.game_status à la class update_tableau.

    Dans un premier temps, j'appelle update_tableau dans le init de Application pour lui transmettre la variable can du canvas et self.game_status . Ca me parait maintenant logique que modifier par la suite self.game_status dans la classe application n'impacte pas la valeur de la variable que j'ai envoyé en instanciant la classe update_tableau mais je n'ai pas de solution.

    Comment faire ? je pense pas régler le problème par l'héritage ou un agrégat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    from tkinter import * 
     
    CASE_SIZE = 20
    CASE_NUMBER = 20
     
    class Application(Frame):   
     
        def __init__(self, boss =None):
            super().__init__() 
            self.pack()  
            self.game_status = 0 
     
            size = CASE_NUMBER*CASE_SIZE
            size = CASE_NUMBER*CASE_SIZE 
            self.can = Canvas(self, width=size, height=size, bg ="black")
     
            button_start = Button(self, text ='Stop/Start',command =self.launch_game)
            button_start.pack(side = RIGHT)
            self.pack()
            update_tableau(self.game_status, self.can)
     
        def launch_game(self):
            self.game_status = not(self.game_status) 
            print(1,':', self.game_status)
     
     
    class update_tableau(Application):
        def __init__(self, game_status,can):
            self.game_status = game_status
            self.can = can
            self.parcourt_tableau()
     
        def parcourt_tableau(self):
                print(2,':', self.game_status)            
                self.can.after(200,self.parcourt_tableau)          
     
    launch = Application()
    launch.mainloop()
    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Salut,

    Citation Envoyé par Kazvert Voir le message
    Ca me parait maintenant logique que modifier par la suite self.game_status dans la classe application n'impacte pas la valeur de la variable que j'ai envoyé en instanciant la classe update_tableau mais je n'ai pas de solution.
    Pourquoi ne pas créer une méthode dans "update_tableau" appelée avec le nouveau game_status en paramètre (lorsqu'il change)?
    note: ce qui suppose de sauvegarder l'instance d'"update_tableau" pour pouvoir l'utiliser/l'appeler plus tard...

    - W

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    Cela marche, merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    from tkinter import * 
     
    CASE_SIZE = 20
    CASE_NUMBER = 20
     
    class Application(Frame):   
     
        def __init__(self, boss =None):
            super().__init__() 
            self.pack()  
            self.game_status = 0 
     
            size = CASE_NUMBER*CASE_SIZE
            size = CASE_NUMBER*CASE_SIZE 
            self.can = Canvas(self, width=size, height=size, bg ="black")
     
            button_start = Button(self, text ='Stop/Start',command =self.launch_game)
            button_start.pack(side = RIGHT)
            self.pack()
            self.tableau_object = update_tableau(self.game_status, self.can)
     
        def launch_game(self):
            self.game_status = not(self.game_status) 
            print(1,':', self.game_status)
            self.tableau_object.change_game_statut(self.game_status)
     
    class update_tableau(Application):
        def __init__(self, game_status,can):
            self.game_status = game_status
            self.can = can
            self.parcourt_tableau()
     
        def change_game_statut(self, game_status):
            self.game_status = game_status
     
        def parcourt_tableau(self):
                print(2,':', self.game_status)            
                self.can.after(200,self.parcourt_tableau)          
     
    launch = Application()
    launch.mainloop()

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Re Salut,

    Maintenant posez vous la question sur l'intérêt d'avoir un héritage de la classe Application par update_tableau (d'autant que le constructeur de la classe mère est surchargé mais pas appelé...).

    - W

  5. #5
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    En supprimant cet héritage, cela fonctionne toujours bien . Au final, dans les différents programmes que j'ai fait, il ne me semble pas avoir utilisé l'héritage de manière utile (soit je suis passé par des agrégats comme tu m'avais conseillé dans un précédent poste, soit j'ai crée des méthodes pour transférer les données comme ici).

    L'héritage n'est utile que si j'utilisais des méthodes du parent dans l'enfant ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Citation Envoyé par Kazvert Voir le message
    L'héritage n'est utile que si j'utilisais des méthodes du parent dans l'enfant ?
    L'héritage est surtout utile pour fabriquer une classe semblable a celle qui est héritée. Dans la pratique, on doit pouvoir dire que "update_tableau" est une "Application". C'est ce qu'on appelle le principe de substitution.
    Mais comme vous ne le respectez même pas avec Application (est-ce une Frame?) vous fabriquez des "class" sans trop savoir ce qu'est la POO (c'est pas grave, il faut bien débuter).

    - W

  7. #7
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    merci pour les indications, il est temps alors que je relise des documents sur la POO. J'ai mis Frame dans Application car j'ai vu que c'est ce que Swinnen faisait.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/10/2012, 16h34
  2. Réponses: 1
    Dernier message: 09/09/2011, 16h38
  3. Réponses: 4
    Dernier message: 10/10/2010, 23h06
  4. Réponses: 9
    Dernier message: 25/02/2008, 11h40
  5. Exploiter le nom d'une classe contenu dans une variable
    Par 84mickael dans le forum Langage
    Réponses: 2
    Dernier message: 15/06/2006, 14h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo