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 :

Comment faire bouger des instances d'une classe "voiture" sur un canvas ?


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Par défaut Comment faire bouger des instances d'une classe "voiture" sur un canvas ?
    Bonjour,

    Pourriez vous m'aider à comprendre comment "conceptualiser au mieux" l'outil classes?

    Par exemple si on se fixe de faire une classe Voiture:
    et de faire bouger ensuite (i.e. avec move(), after() ), de façons différentes, des instances de cette classe sur un canvas.
    Comment structurer classe, méthode, fenetre Tk, canvas? Ou et comment placer after() pour que voit1 bouge?

    Autrement dit, comment feriez vous proprement (et en m'expliquant un peu hein ) ce cas de figure?
    En tous cas merci d'avance pour toute forme d'enseignement.

    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 *
     
    class voiture:
        """ classe fabriquant des objets voiture """
        def __init__(self, couleur, canvas, x1, y1, taille):
            self.couleur = couleur
            self.can = canvas
            self.x1 = x1
            self.y1 = y1
            self.taille = taille
            self.w = self.can.create_rectangle(self.x1, self.y1, self.x1+self.taille, self.y1+self.taille, fill=self.couleur)
     
        def bouge(self, dx, dy, vitesse ):
            self.dx = dx
            self.dy = dy
            self.vitesse = vitesse
            self.can.move(self.w, self.dx, self.dy)
     
     
    # creation fenetre
    fen = Tk()
    # creation canvas
    canW = 500
    canH = 500
    canBg = "ivory"
    can = Canvas(fen, height=canH, width=canW, bg=canBg)
    can.pack()
     
    # instanciation de deux objets voiture
    voit1 = voiture("red", can, 10, 20, 50)
    voit2 = voiture("blue", can, 50, 60, 25)
     
    # application de la methode bouge() aux "voitures"
    voit1.bouge(200, 200, 500)
    voit2.bouge(100, 100, 1000)
    # gestionaire d'evenement bouclé
    fen.mainloop()

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

    Citation Envoyé par Jma06 Voir le message
    Comment structurer classe, méthode, fenetre Tk, canvas? Ou et comment placer after() pour que voit1 bouge?
    Il serait plus simple que vous essayiez de coder quelque chose pour illustrer les questions que vous vous posez.

    "structurer" i.e. c'est juste définir la hiérarchie de boîtes dans laquelle ranger le code.

    Partez de la structure minimale que vous offre tkinter: pas besoin de classes, une fonction pour créez les rectangles que vous appelez "voitures", un tag "voiture" pour avoir la liste de toutes les voiture, un tag "moving" pour savoir celles qui se déplacent (vous pouvez remplacer tags par listes Python). Et un seul .after qui va faire bouger les "moving" toutes les ... ms.

    Après si vous voulez fabriquer une classe Voiture, déjà il faut expliquer ce que çà va apporter par rapport à la baseline précédente.
    Et çà il n'y a que vous pour le dire.

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

  3. #3
    Membre actif
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Par défaut
    Bonjour Wiztricks,

    Citation Envoyé par wiztricks Voir le message
    Après si vous voulez fabriquer une classe Voiture, déjà il faut expliquer ce que çà va apporter par rapport à la baseline précédente.
    Et çà il n'y a que vous pour le dire.
    A vrai dire, je voudrai traiter d'une classe pour apprendre comment ça peut (doit?) fonctionner en pratique.
    Le faire avec des conseils de pro m'apporterai (je pense, j'espère) de ne pas trop "apprendre de travers".
    Je suis parti sur l'exemple voiture car cela me semblait adapté de faire des objets avec des caractéristiques (couleur, taille) et une méthode pour les bouger..

    Pour cause, je vois parfois des fenêtres Tk directement initialisées dans la classe, ou parfois que le canvas... j'ai du mal a me faire une religion.
    voila pourquoi j'ai préféré venir "travailler cette question" ici avec votre aide et cet exemple.


    Cela dit, votre proposition d'une structure basale, sans classe, est si chouette que je vais essayer de m'y avancer.
    Merci

  4. #4
    Membre actif
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Il serait plus simple que vous essayiez de coder quelque chose pour illustrer les questions que vous vous posez.
    j'ai bien essayé de faire le petit bout de code fourni dans mon premier message, mais je sais pas si je me suis pas déjà complètement fourvoyé, si j'ai pas mis des self. qui servent à rien etc..
    c'est d’ailleurs en écrivant ce lignes que je suis dit qu'il faudrait me faire aider avant de partir dans des "mauvaise habitudes".

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

    Citation Envoyé par Jma06 Voir le message
    j'ai bien essayé de faire le petit bout de code fourni dans mon premier message, mais je sais pas si je me suis pas déjà complètement fourvoyé, si j'ai pas mis des self. qui servent à rien etc..
    Pour chaque instruction/ligne que vous avez écrite, essayez par vous même de répondre aux questions: est-elle nécessaire? à quoi sert-elle?
    Si vous êtes "confortable" avec le code que vous avez écrit...çà va bien. Sinon racontez ce qui nous chagrine.

    note: dans 6 mois, si vous continuez à apprendre à programmer, vous y trouverez des défauts par vous même. Le code ne marchera pas mieux, votre regard aura changé.

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

  6. #6
    Membre actif
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Par défaut
    Oui je vous rejoins à 100%

    Tenez, j'ai essayé ce petit quelque chose, sans classe, en essayant l'approche "basale" que vous aviez évoquée.
    j'ai pris un dico (car ça m'a fait un training, j'avais encore jamais eu l'occasion d'en utiliser un )

    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
     
    from tkinter import *
     
    def voiture(couleur, taille, x1, y1, voitNom):
        global voitures
     
        # eviter d'avoir deux clefs identiques dans le dict
        if voitNom not in voitures.keys():
            voitures[voitNom] = can.create_rectangle(x1, y1, x1+taille, y1+taille, fill=couleur, tag=voiture )
        # sinon on crée un nom generique incrémenté d'après le nombre d'eléments du dict
        else:
            nomGen = "Car#"+str(len(voitures)+1)
            voitures[nomGen] = can.create_rectangle(x1, y1, x1+taille, y1+taille, fill=couleur, tag=voiture )
     
     
    def bouge(vitesse, nomVoit ):
        dx=5
        dy=5
        voitId = voitures[nomVoit]
        c = can.coords(voitId)
        can.move(voitId, dx, dy)
        can.after(vitesse, lambda: bouge(vitesse, nomVoit))
     
     
    # creation fenetre
    fen = Tk()
     
    # creation canvas
    canW = 500
    canH = 500
    canBg = "ivory"
    can = Canvas(fen, height=canH, width=canW, bg=canBg)
    can.pack()
     
    # dico avec clef nom de voiture et valeur son id canvas
    voitures = {}
     
    # creation de deux voitures différentes
    voiture("red", 100, 10, 10, "titine")
    voiture("blue", 100, 100, 100, "tuture")
     
    # faire bouger une des voitures
    bouge(500, "titine")
     
    # gestionaire d'evenement bouclé
    fen.mainloop()
    Ça fait le petit job que je lui demande.
    Du coup avec une "classe" ça pourrait donner un truc comme ça:
    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
     
    from tkinter import *
     
    class voiture:
        """ classe fabriquant des objets voiture """
        def __init__(self, couleur, canvas, x1, y1, taille):
            self.couleur = couleur
            self.can = canvas
            self.x1 = x1
            self.y1 = y1
            self.taille = taille
            self.w = self.can.create_rectangle(self.x1, self.y1, self.x1+self.taille, self.y1+self.taille, fill=self.couleur)
     
        def bouge(self, dx, dy, vitesse ):
            self.dx = dx
            self.dy = dy
            self.vitesse = vitesse
            self.can.move(self.w, self.dx, self.dy)
            self.can.after(self.vitesse, lambda: self.bouge(dx, dy, vitesse) )
     
     
    # creation fenetre
    fen = Tk()
    # creation canvas
    canW = 500
    canH = 500
    canBg = "ivory"
    can = Canvas(fen, height=canH, width=canW, bg=canBg)
    can.pack()
     
    # instanciation de deux objets voiture
    voit1 = voiture("red", can, 10, 20, 50)
    voit2 = voiture("blue", can, 50, 60, 25)
     
    # application de la methode bouge() aux "voitures"
    voit1.bouge(10, 10, 500)
    voit2.bouge(25, 25, 1000)
    # gestionaire d'evenement bouclé
    fen.mainloop()
    Pour circonstancier une question claire:
    Comment l'auriez vous écrite pour que ce soit propre?
    car je sais pas si c'est utile, pour ne citer que ce doute, d'initier le canvas dans la classe..

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

    Je vous ai déjà suggéré de vous relire et de réfléchir aux instructions que vous avez écrit.

    Déjà dans ces quelques lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def voiture(couleur, taille, x1, y1, voitNom):
        global voitures
     
        # eviter d'avoir deux clefs identiques dans le dict
        if voitNom not in voitures.keys():
            voitures[voitNom] = can.create_rectangle(x1, y1, x1+taille, y1+taille, fill=couleur, tag=voiture )
    A quoi sert le global voitures?
    Si vous avez ouvert la documentation du Canvas, vous sauriez que canvas.create_... retourne un identifiant unique (pour la durée de vie du Canvas). Donc le if voitNom not in voitures.keys() ne sert à rien.
    Enfin si vous stockez vos identifiants dans une collection liste/dictionnaire côté Python, inutile d'avoir par dessus un tag.

    Si déjà en écrivant ces quelques lignes vous n'arrivez pas à vous relire de façon "critique" (est ce que j'ai écrit sert à quelque chose? pourquoi?), ajouter des difficultés comme les classes est un peu prématuré.

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

Discussions similaires

  1. Liste des instances d'une classe
    Par alexdevl dans le forum Général Python
    Réponses: 32
    Dernier message: 14/09/2011, 22h52
  2. Réponses: 0
    Dernier message: 26/06/2009, 09h23
  3. Nommer des instances d'une classe dynamiquement ?
    Par Demosis dans le forum Langage
    Réponses: 4
    Dernier message: 04/11/2007, 14h22
  4. Réponses: 9
    Dernier message: 18/10/2007, 20h06
  5. Comment faire apparaitre des données dans une listbox
    Par nuans dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 14/05/2007, 15h04

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