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

Python Discussion :

Solution exercice 8.21 Tkinter méthode Swinnen et question [Python 3.X]


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    employé
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : employé

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Points : 103
    Points
    103
    Par défaut Solution exercice 8.21 Tkinter méthode Swinnen et question
    Bonjour à tous,

    Voici l'énoncé:


    Exercice 8.21:
    Écrivez un programme qui fait apparaître une fenêtre avec un canevas et un bouton. Dans le canevas, tracez un rectangle gris foncé,
    lequel représentera une route, et par-dessus, une série de rectangles jaunes censés représenter un passage pour piétons.
    Ajoutez quatre cercles colorés pour figurer les feux de circulation concernant les piétons et les véhicules. Chaque utilisation du
    bouton devra provoquer le changement de couleur des feux:

    Nom : 8.21.png
Affichages : 1037
Taille : 3,2 Ko




    Mon code n'est pas représentatif de l'image ci-dessus, il est plus grand au niveau des proportions et surement moins bien cadré mais s'en rapproche énormément

    Voici mon code:

    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
    from tkinter import *
     
    def change_coul():
        global c
        if c ==0:
            #Feu
            can.create_oval(115-15,185-15,115+15,185+15,fill= coul[0])
            can.create_oval(430-15,185-15,430+15,185+15,fill= coul[1])
            can.create_oval(115-15,300-15,115+15,300+15,fill= coul[1])
            can.create_oval(430-15,300-15,430+15,300+15,fill= coul[0])
            c=1
        else:
            #Feu
            can.create_oval(115-15,185-15,115+15,185+15,fill= coul[1])
            can.create_oval(430-15,185-15,430+15,185+15,fill= coul[0])
            can.create_oval(115-15,300-15,115+15,300+15,fill= coul[0])
            can.create_oval(430-15,300-15,430+15,300+15,fill= coul[1])
            c = 0
     
    def rectangle(x,y,y1,x1, coul):
        i = 0
        while i < 8:
            can.create_rectangle(x,y,x+v,y+d, fill=coul)
            i+=1
            x+=v*2
     
     
    coul = ["red","green"]
    c = 0
    v = 15
    d = 100
    fen = Tk()
    can = Canvas(fen, width = 500, height = 500, bg="silver")
    # ROUTE
    can.create_rectangle(150,0,400,500, fill="grey")
    #PASSAGE PIETON
    i = 0
    while i < 8:
        rectangle(160,200,20,250, "yellow")
        i+=1
    #Feu
    can.create_oval(115-15,185-15,115+15,185+15,fill= coul[1])
    can.create_oval(430-15,185-15,430+15,185+15,fill= coul[0])
    can.create_oval(115-15,300-15,115+15,300+15,fill= coul[0])
    can.create_oval(430-15,300-15,430+15,300+15,fill= coul[1])
     
    Button(fen, text="feu rouge", command=change_coul).pack(side=BOTTOM)
    can.pack()
     
    fen.mainloop()
    Mes Questions:

    j'aurais souhaité savoir si une méthode assez simple permettrait d'alléger la partie feu, car ça rajoute 12 lignes et donc grossi le code.

    Savoir également, si comme la question du dessus, une façon de faire plus adéquate aurait été préférable ?

    Merci pour les courageux et bonne lecture.

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 604
    Points : 56 721
    Points
    56 721
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        if c ==0:
            #Feu
            can.create_oval(115-15,185-15,115+15,185+15,fill= coul[0])
            can.create_oval(430-15,185-15,430+15,185+15,fill= coul[1])
            can.create_oval(115-15,300-15,115+15,300+15,fill= coul[1])
            can.create_oval(430-15,300-15,430+15,300+15,fill= coul[0])
            c=1
        else:
            #Feu
            can.create_oval(115-15,185-15,115+15,185+15,fill= coul[1])
            can.create_oval(430-15,185-15,430+15,185+15,fill= coul[0])
            can.create_oval(115-15,300-15,115+15,300+15,fill= coul[0])
            can.create_oval(430-15,300-15,430+15,300+15,fill= coul[1])
            c = 0

    Je suppose que tu peux remplacer par :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            can.create_oval(115-15,185-15,115+15,185+15,fill= coul[c])
            can.create_oval(430-15,185-15,430+15,185+15,fill= coul[1-c])
            can.create_oval(115-15,300-15,115+15,300+15,fill= coul[1-c])
            can.create_oval(430-15,300-15,430+15,300+15,fill= coul[c])
            c = 1-c

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Le principal défaut est que les .create_oval empilent les ovales les uns sur les autres.
    Puis on peut penser "tags" et "polymorphisme".
    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 *
     
    def change_coul():
        global c
        c = not c
        can.itemconfigure('voiture', fill=coul[c])
        can.itemconfigure('pieton', fill=coul[1-c])
     
    def rectangle(x,y,y1,x1, coul):
        i = 0
        while i < 8:
            can.create_rectangle(x,y,x+v,y+d, fill=coul)
            i+=1
            x+=v*2
     
     
    coul = ["red","green"]
    c = True
    v = 15
    d = 100
    fen = Tk()
    can = Canvas(fen, width = 500, height = 500, bg="silver")
    # ROUTE
    can.create_rectangle(150,0,400,500, fill="grey")
    #PASSAGE PIETON
    i = 0
    while i < 8:
        rectangle(160,200,20,250, "yellow")
        i+=1
    #Feu
    can.create_oval(115-15,185-15,115+15,185+15,fill= coul[1], tag="voiture")
    can.create_oval(430-15,185-15,430+15,185+15,fill= coul[0], tag='pieton')
    can.create_oval(115-15,300-15,115+15,300+15,fill= coul[0], tag='pieton')
    can.create_oval(430-15,300-15,430+15,300+15,fill= coul[1], tag="voiture")
     
    Button(fen, text="feu rouge", command=change_coul).pack(side=BOTTOM)
    can.pack()
     
    fen.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre régulier
    Homme Profil pro
    employé
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : employé

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Points : 103
    Points
    103
    Par défaut
    aaaaaaaaah Merci à vous pour un joli condensé !

    Oui je suis tout à fait d'accord avec toi pour le create_oval, et en créant une fonction cercle(x,y,r): ?
    Après avec la fonction cercle, vu la quantité de create_oval, j'ai surtout peur de rajouter des lignes avec l'appel de la fonction à foison !

    Tu entends quoi par "polymorphisme" ?
    Cc'est le fait de mettre un nom en tag et itemconfigure ?


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

Discussions similaires

  1. Exercice (création d'une méthode)
    Par romain1 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 07/09/2008, 12h46
  2. Obtenir la solution exercices du bouquin Swinnen
    Par rlejeune dans le forum Général Python
    Réponses: 1
    Dernier message: 26/08/2007, 04h53
  3. [Tkinter] Méthode get() dans une boucle while
    Par Thundie dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/02/2006, 00h06

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