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 :

Créer et modifier oval


Sujet :

Tkinter Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut Créer et modifier oval
    Bonjour à tous

    Je ne trouve pas ce qui ne va pas.

    Je souhaite créer une classe feux avec 3 méthodes: le constructeur , l'allumer rouge, l'allumer gris.

    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
    from tkinter import *
     
    class feux:
        def __init__(self, nom_can, pos_x, pos_y, taille_x, taille_y):
            nom_can.create_oval(pos_x, pos_y, pos_x + taille_x, pos_y + taille_y, width=2, fill='grey')
     
        def allume_rouge(self, nom_can):
            nom_can.itemconfigure(self, fill='red')
     
    window = Tk()
     
    can1 = Canvas(window, bg='dark grey', height=330, width=400)
    can1.pack(expand="YES")
     
    feux1 = feux(can1, 30, 90, 50, 50)
    feux1.allume_rouge(can1)
     
    can1.update()
    window.update()
     
    window.mainloop()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par tm68780 Voir le message
    Je souhaite créer une classe feux avec 3 méthodes: le constructeur , l'allumer rouge, l'allumer gris.
    Commencez avec de simples fonctions pour apprendre à utiliser les méthodes du Canvas. Quand çà marche, fabriquer une classe, c'est juste décider quelles variables globales transformer en attributs.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Oui j'ai essayé le create et le .configure avant de créer une classe.
    C'est la référence au canevas qui ne colle pas, le constructeur de la classe fonctionne lui

    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
    from tkinter import *
    import time
     
    class feux:
        #def __init__(self, nom_can, pos_x, pos_y, taille_x, taille_y):
        #    nom_can.create_oval(pos_x, pos_y, pos_x + taille_x, pos_y + taille_y, width=2, fill='grey')
        def __init__(self, nom_can):
            nom_can.create_oval(30, 30, 60, 60, width=2, fill='grey')
     
        def allume_rouge(self, nom_can):
            nom_can.itemconfigure(self, fill='red')
     
     
    window = Tk()
    window.title("Feux de départ")
    window.geometry("480x360")
    window.config(background="#41B77F")
     
    can1 = Canvas(window,bg='dark grey',height=330, width=400)
    can1.pack(expand="YES")
     
    #feux1 = can1.create_oval(30, 30, 60, 60, width=2, fill='grey')
    feux1 = feux(can1)
     
    #can1.itemconfigure(feux1, fill='red')
    #feux1.allume_rouge(can1)
     
    window.mainloop()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par tm68780 Voir le message
    Oui j'ai essayé le create et le .configure avant de créer une classe.
    Si vous ne montrez pas ce que vous avez fait, on ne peut pas comparer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    C'était après les #

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    feux1 = can1.create_oval(30, 30, 60, 60, width=2, fill='grey')
    can1.itemconfigure(feux1, fill='red')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class feux:
        def __init__(self, nom_can):
            nom_can.create_oval(30, 30, 60, 60, width=2, fill='grey')
     
        def allume_rouge(self, nom_can):
            nom_can.itemconfigure(self, fill='red')
     
    feux1 = feux(can1)
    feux1.allume_rouge(can1)

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Relisez votre code, can1.create_oval retourne un identifiant que vous passez à .itemconfigure...

    Et dans la mouture "classe", cet identifiant est ignoré.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Dans ce code Feux1 est du type INT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    feux1 = can1.create_oval(30, 30, 60, 60, width=2, fill='grey')
    can1.itemconfigure(feux1, fill='red')
    Dans ce code feux1 est une instance de la classe feux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class feux:
        def __init__(self, nom_can):
            nom_can.create_oval(30, 30, 60, 60, width=2, fill='grey')
     
        def allume_rouge(self, nom_can):
            nom_can.itemconfigure(self, fill='red')
     
    feux1 = feux(can1)
    feux1.allume_rouge(can1)

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par tm68780 Voir le message
    Dans ce code feux1 est une instance de la classe feux
    Vous avez décidé de structurer votre code avec des "class" et vous espérez que la méthode .itemconfigure acceptera un autre argument que ce qu'elle attend?

    tkinter pourrait jeter une erreur disant "arrêtez de faire n'importe quoi"... mais il se contente de prendre ce que vous lui donner, regarde si çà correspond à un item, et si ce n'est pas le cas, il ne fait rien.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Merci pour la réponse

    Oui c'est bien ce que je viens de dire la méthode attend l'identifiant de l'objet et du type INT
    Moi je veux passer l'identifiant de l'objet.
    Par la bidouille on peut passer 1 pour le 1er objet et ainsi de suite, mais le but est de ne pas bricoler

    Si je ne peux pas utiliser cette méthode (seule trouvée pour un objet ovale) quelle autre méthode peut-on utiliser ???

  10. #10
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    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
    from tkinter import *
    import time
     
     
    class feux:
        # def __init__(self, nom_can, pos_x, pos_y, taille_x, taille_y):
        #    nom_can.create_oval(pos_x, pos_y, pos_x + taille_x, pos_y + taille_y, width=2, fill='grey')
        def __init__(self, nom_can):
            self.mon_objet = nom_can.create_oval(30, 30, 60, 60, width=2, fill='grey')
     
        def allume_rouge(self, nom_can):
            nom_can.itemconfigure(self.mon_objet, fill='red')
     
        def etteind(self, nom_can):
            nom_can.itemconfigure(self.mon_objet, fill='grey')
     
     
    window = Tk()
    window.title("Feux de départ")
    window.geometry("480x360")
    window.config(background="#41B77F")
     
    can1 = Canvas(window, bg='dark grey', height=330, width=400)
    can1.pack(expand="YES")
     
    feux1 = feux(can1)
    window.update()
    time.sleep(1)
    feux1.allume_rouge(can1)
    window.update()
    time.sleep(1)
    feux1.etteind(can1)
    window.update()
     
    window.mainloop()

  11. #11
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    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
    from tkinter import *
    import time
     
     
    class feux:
        def __init__(self, nom_can, pos_x, pos_y, taille_x, taille_y):
            self.mon_objet = nom_can.create_oval(pos_x, pos_y, taille_x, taille_y, width=2, fill='grey')
        def allume_rouge(self, nom_can):
            nom_can.itemconfigure(self.mon_objet, fill='red')
     
        def etteind(self, nom_can):
            nom_can.itemconfigure(self.mon_objet, fill='grey')
     
     
    window = Tk()
    window.title("Feux de départ")
    window.geometry("480x360")
    window.config(background="#41B77F")
     
    can1 = Canvas(window, bg='dark grey', height=330, width=400)
    can1.pack(expand="YES")
     
    feux1 = feux(can1, 30, 30, 60, 60)
    window.update()
    time.sleep(1)
    feux1.allume_rouge(can1)
    window.update()
    time.sleep(1)
    feux1.etteind(can1)
    window.update()
     
    window.mainloop()

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par tm68780 Voir le message
    Oui c'est bien ce que je viens de dire la méthode attend l'identifiant de l'objet et du type INT
    Moi je veux passer l'identifiant de l'objet.
    Problème résolu alors?

    Sans classe, on écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    feux1 = can1.create_oval(30, 30, 60, 60, width=2, fill='grey')
    can1.itemconfigure(feux1, fill='red')
    On stocke l'identifiant retourné par .create dans une variable (globale) pour pouvoir la passer ensuite à .itemconfigure car il faut bien préciser quels items on veut modifier.

    Pousser ces lignes dans des méthodes de classe ne change pas la gymnastique à faire: il faut toujours stocker l'identifiant dans une variable si on veut pour pouvoir la passer à une autre méthode.

    La seule différence est qu'on pourra créer cette variable dans l'espace de noms de l'instance qui se distingue de l'espace de noms du module (les variables globales) en ayant les noms préfixé par "self."

    Ce qui donne la même chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.feux1 = can1.create_oval(30, 30, 60, 60, width=2, fill='grey')
    can1.itemconfigure(self.feux1, fill='red')
    (si on veut être cohérent avec le nom (mal) choisi au départ).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Problème résolu alors?
    - W
    Bonjour,

    Si on considère que résolu est: lorsque le programme semble faire ce qu'on attend alors oui

    Sinon non, il y a certainement des améliorations à faire

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    from tkinter import *
    import time
     
     
    class ampoules:
        def __init__(self, nom_can, pos_amp_x, pos_amp_y, taille):
            print (pos_amp_x, "  ", pos_amp_y)
            self.ampoule = nom_can.create_oval(pos_amp_x, pos_amp_y, pos_amp_x+taille, pos_amp_y+taille, width=2, fill='grey')
     
        def allume_lamp(self, nom_can):
            nom_can.itemconfigure(self.ampoule, fill='red')
     
        def etteind_lamp(self, nom_can):
            nom_can.itemconfigure(self.ampoule, fill='grey')
     
    class feux:
        def __init__(self, nom_can, pos_feux_x, pos_feux_y, taille, ecart):
            self.ampoule1 = ampoules(nom_can, pos_feux_x, pos_feux_y, taille)
            pos_feux_y = (pos_feux_y+taille+ecart)
            self.ampoule2 = ampoules(nom_can, pos_feux_x, pos_feux_y, taille)
     
        def allume_feux(self, nom_can):
            self.ampoule1.allume_lamp(can1)
            self.ampoule2.allume_lamp(can1)
     
        def etteind_feux(self, nom_can):
            self.ampoule1.etteind_lamp(can1)
            self.ampoule2.etteind_lamp(can1)
     
    class panneau_feux:
        def __init__(self, nom_can, pos_panneau_x, pos_panneau_y):
            self.taille = 60
            self.ecart = 20
            self.feux1 = feux(nom_can, pos_panneau_x, pos_panneau_y, self.taille, self.ecart)
            pos_panneau_x = (pos_panneau_x + self.taille+self.ecart)
            self.feux2 = feux(nom_can, pos_panneau_x, pos_panneau_y, self.taille, self.ecart)
            pos_panneau_x = (pos_panneau_x + self.taille + self.ecart)
            self.feux3 = feux(nom_can, pos_panneau_x, pos_panneau_y, self.taille, self.ecart)
            pos_panneau_x = (pos_panneau_x + self.taille + self.ecart)
            self.feux4 = feux(nom_can, pos_panneau_x, pos_panneau_y, self.taille, self.ecart)
            pos_panneau_x = (pos_panneau_x + self.taille + self.ecart)
            self.feux5 = feux(nom_can, pos_panneau_x, pos_panneau_y, self.taille, self.ecart)
     
     
        def allume_panneau(self, nom_can):
            pass
     
        def etteind_panneau(self, nom_can):
            self.feux1.etteind_feux(can1)
            self.feux2.etteind_feux(can1)
            self.feux3.etteind_feux(can1)
            self.feux4.etteind_feux(can1)
            self.feux5.etteind_feux(can1)
     
        def demarre_course(self):
            time.sleep(3)
            self.feux1.allume_feux(can1)
            can1.update()
            time.sleep(1)
            self.feux2.allume_feux(can1)
            can1.update()
            time.sleep(1)
            self.feux3.allume_feux(can1)
            can1.update()
            time.sleep(1)
            self.feux4.allume_feux(can1)
            can1.update()
            time.sleep(1)
            self.feux5.allume_feux(can1)
            can1.update()
            time.sleep(1)
            self.etteind_panneau(can1)
            can1.update()
            time.sleep(1)
     
    window = Tk()
    window.title("Feux de départ")
    window.geometry("480x360")
    window.config(background="#41B77F")
     
    can1 = Canvas(window, bg='dark grey', height=330, width=440)
    can1.pack(expand="YES")
     
    panneau1 = panneau_feux(can1, 30, 30)
    can1.update()
    panneau1.demarre_course()
     
    window.mainloop()

  14. #14
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def etteind_panneau(self, nom_can):
            feux = ["feux1","feux2","feux","feux4","feux5"]
            for nom_feux in range [feux]:
                self.nom_feux.etteind_feux(can1)

  15. #15
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    La dernière amélioration (post précédent) est une connerie

  16. #16
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par tm68780 Voir le message
    Sinon non, il y a certainement des améliorations à faire
    Çà c'est sûr: vous débutez. Si vous continuer à progresser, dans 6 mois, vous risquez de ne pas être fier des bouts de code que vous écrivez aujourd'hui.

    Après si vous vous acharnez à vouloir programmer en séquentiel avec tkinter alors que c'est une bibliothèque évènementielle qui permet d'apprendre à jouer avec les "callbacks", ben, vous avez oublié de passer du temps dans un tuto. avant de coder.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  17. #17
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Après si vous vous acharnez à vouloir programmer en séquentiel avec tkinter alors que c'est une bibliothèque évènementielle qui permet d'apprendre à jouer avec les "callbacks", ben, vous avez oublié de passer du temps dans un tuto. avant de coder.

    - W
    Merci pour la réponse.

    Oui je vois dans la théorie, un bouton qui sur évènement va appeler un callback qui sera dans mon cas, par exemple, la méthode "demarre_course"
    Lorsque vous dites "programmer en séquentiel" vous parler de cette méthode "demarre_course" ?
    Pour l'instant je ne vois pas comment utiliser un callback pour écrire cette méthode.

  18. #18
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par tm68780 Voir le message
    Pour l'instant je ne vois pas comment utiliser un callback pour écrire cette méthode.
    Lorsque vous voyez des instructions qui se répètent, vous n'avez pas encore le réflexe de faire une boucle pour dérouler les mêmes instructions sur chaque élément d'une liste d'objets.

    C'est pourtant le b.a.ba qu'on acquiert avant même de fabriquer des fonctions. Le boulot du programmeur, c'est quand même d'utiliser un ordinateur pour ce qu'il sait faire le mieux (des boucles!).

    Ce concept acquis, vous allez naturellement vous poser la question de comment réaliser la même chose avec des callbacks.
    Si vous aviez pris le temps d'apprendre comment on programme tkinter dans un tuto., vous sauriez où trouver la réponse à ce genre de question.

    On peut toujours vous montrer un code qui... ce qui est important, c'est la démarche qui a permis de le construire (et non le résultat de cette démarche)...
    Et çà, on ne peut pas vous le donner: à vous d'avoir la patience de l'acquérir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  19. #19
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Bonjour,

    Si ce réflexe je l'ai encore faut-il savoir que mettre dans la boucle (voir la connerie que j'avais posté) qui en était une...
    Alors en attendant de savoir quoi mettre dans cette boucle, le fait de faire bêtement du séquentiel me permet de tester le reste du travail

    Ca tombe bien, Je ne demande à personne du tout cuit, mais éventuellement qu'on me dise quel point de mon code n'est pas correct et me donner une indication sur le concept à comprendre
    Alors si vous avez envie de commenter voici le dernier code merci d'avance.


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    from tkinter import *
    import time
    import gc
     
    class ampoules:
        def __init__(self, nom_can, pos_amp_x, pos_amp_y, taille):
            self.ampoule = nom_can.create_oval(pos_amp_x, pos_amp_y, pos_amp_x+taille, pos_amp_y+taille, width=4, fill='grey')
     
        def allume_lamp(self, nom_can):
            nom_can.itemconfigure(self.ampoule, fill='red')
     
        def etteind_lamp(self, nom_can):
            nom_can.itemconfigure(self.ampoule, fill='grey')
     
    class feux:
        def __init__(self, nom_can, pos_feux_x, pos_feux_y, taille, ecart):
            global liste_feux
            self.ampoule1 = ampoules(nom_can, pos_feux_x, pos_feux_y, taille)
            pos_feux_y = (pos_feux_y+taille+ecart)
            self.ampoule2 = ampoules(nom_can, pos_feux_x, pos_feux_y, taille)
            liste_feux.append(self)
     
        def allume_feux(self, nom_can):
            self.ampoule1.allume_lamp(can1)
            self.ampoule2.allume_lamp(can1)
     
        def etteind_feux(self, nom_can):
            self.ampoule1.etteind_lamp(can1)
            self.ampoule2.etteind_lamp(can1)
     
    class panneau_feux:
        def __init__(self, nom_can, pos_panneau_x, pos_panneau_y):
            global liste_feux
            liste_feux = []
            liste_nom_feux  = ["feux1","feux2","feux3","feux4","feux5"]
            self.taille = 60
            self.ecart = 20
     
            liste_objets = ["feux1", "feux2", "feux3"]
     
            for le_nom in liste_nom_feux:
                commande = 'self.'+le_nom+'=feux(nom_can, pos_panneau_x, pos_panneau_y, self.taille, self.ecart)'
                exec(commande)
                pos_panneau_x = (pos_panneau_x + self.taille + self.ecart)
     
        def allume_panneau(self, nom_can):
            pass
     
        def etteind_panneau(self, nom_can):
            global liste_feux
            for le_feux in liste_feux:
                le_feux.etteind_feux(nom_can)
     
        def demarre_course(self, nom_can):
            global liste_feux
            time.sleep(3)
            for le_feux in liste_feux:
                le_feux.allume_feux(nom_can)
                nom_can.update()
                time.sleep(1)
            self.etteind_panneau(nom_can)
            nom_can.update()
            time.sleep(1)
     
     
    window = Tk()
    window.title("Feux de départ")
    window.geometry("480x360")
    window.config(background="#41B77F")
    can1 = Canvas(window, bg='dark grey', height=330, width=440)
    can1.pack(expand="YES")
     
     
    panneau1 = panneau_feux(can1, 30, 30)
    can1.update()
    panneau1.demarre_course(can1)
     
    window.mainloop()

  20. #20
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par tm68780 Voir le message
    Alors si vous avez envie de commenter voici le dernier code merci d'avance.
    C'est déjà mieux.
    Citation Envoyé par tm68780 Voir le message
    Alors en attendant de savoir quoi mettre dans cette boucle, le fait de faire bêtement du séquentiel me permet de tester le reste du travail
    Le code qu'on écrit est organisé en fonction de la représentation que vous vous faites du problème à résoudre: comment organiser les données, quelles sont les opérations à réaliser, ... Le code suit derrière et en le lisant, en principe, on devrait y retrouver cela.

    Quand on débute, on est tellement peu à l'aise avec rien qu'on organise ses lignes de code qu'on sait fonctionner comme on peut. Çà crée un tas de boue car il n'y a pas de fil directeur, de colonne vertébrale,...

    Le programmeur a une démarche "top down": on divise le problème en sous problèmes et on organise le boulot à faire avant de coder.
    Le débutant à une approche "bottom up": il écrit des lignes et s'arrange pour que çà tombe en marche.

    Essayez de vous passer de global (vous utilisez des class donc vous n'en avez pas besoin), évitez exec et time.sleep... (les utiliser traduisent des problèmes de compréhension ou de conception).

    Et si vous avez des questions particulières ouvrez un nouveau sujet: l'intérêt d'un forum est que le débutant puisse trouver des idées de résolution de problème. Quand la discussion s'éternise, plus grand monde ne fera l'effort d'en tirer quelque chose.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Créer ou modifier un shell avec interface python et le lancer
    Par jameson dans le forum Général Python
    Réponses: 11
    Dernier message: 26/08/2008, 09h59
  2. Créer ou modifier un dossier en fonction d'une valeur dans une cellule
    Par Pierre.g dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/08/2008, 17h37
  3. Réponses: 2
    Dernier message: 14/05/2008, 11h17
  4. Réponses: 6
    Dernier message: 21/09/2006, 16h08
  5. [JAVA] Lien expliquant comment créer/ lire / modifier un XML
    Par The_revival dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 07/12/2005, 17h10

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