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 :

[cours de G.Swinnen] exercice 66


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut [cours de G.Swinnen] exercice 66
    je pose ici une solution différente de celle proposé par g.swinnen dans son cours Python.
    Cela s'adresse en particulier a ceux qui comme moi apprenne Python et qui souhaitent confronter leur solution d'un même exercice.

    ennoncé: Créer un court prog dessinnant les cinq anneaux olympiques, dans un rectangle de fond blanc.

    solution G.Swinnen:

    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
    from Tkinter import *
    # Coordonnées X,Y des 5 anneaux :
    coord = [[20,30], [120,30], [220, 30], [70,80], [170,80]]
    # Couleurs des 5 anneaux :
    coul = ["red", "yellow", "blue", "green", "black"]
    base = Tk()
    can = Canvas(base, width =335, height =200, bg ="white")
    can.pack()
    bou = Button(base, text ="Quitter", command =base.quit)
    bou.pack(side = RIGHT)
    # Dessin des 5 anneaux :
    i = 0
    while i < 5:
         x1, y1 = coord[i][0], coord[i][1]
         can.create_oval(x1, y1, x1+100, y1 +100, width =2, outline =coul[i])
         i = i +1
    base.mainloop()

    Mon code: Je trouvais bete de def les coordonnées des cinq anneaux

    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
    def anneau():
             global x1,y1,coul,a
             can1.create_oval(x1,y1,x1+60,y1+60,outline=coul[a])
             x1,y1=x1+60,y1
     
     
    ##########
    from Tkinter import *
     
    fen=Tk()
    Button(fen,text='Quitter',command=fen.quit).grid(row=0,column=1,padx=5,pady=5,sticky=S)
    can1=Canvas(fen,bg='white',height=150,width=220)
    can1.grid(row=0)
    a=-1
    x1,y1=20,50
    coul=['blue','red','yellow','green','grey']
    while a<2:
        a=a+1
        anneau()
     
    x1,y1=50,80
    while a<4:
        a=a+1
        anneau()
     
     
    fen.mainloop()
    certe c'est un peu plus long, mais j'evite de definir une variable avec les coordonnées de chaque anneaux (alors que python se les calcule seul), et puis j'utilise une fonction pour dessinner mes cercles.

    Par exemple je n'ai pas réussi a me passer de "global" dans ma fonction.
    Si qqu'un a une variante, je suis intérréssé.

    Edit par Guigui_: le gras remplacé par les balises [Code]

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Pour éviter les variables globales, il faut que tu passes des variables en tant que paramètres à ta fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def anneau(x1,y1,couleur): 
             can1.create_oval(x1,y1,x1+60,y1+60,outline=couleur)
    Et après dans tes while:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while a<2: 
        a=a+1 
        anneau(x1,y1,coul[a])
        x1,y1=x1+60,y1

  3. #3
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    une variante, utilisant un plus large panel des opérations arithmétiques de Python (dont la division entière // ) et l'instruction for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # -*- coding: cp1252 -*-
    from Tkinter import * 
    # Couleurs des 5 anneaux : 
    coul = ["red", "yellow", "blue", "green", "black"] 
    base = Tk() 
    can = Canvas(base, width =335, height =200, bg ="white") 
    can.pack() 
    bou = Button(base, text ="Quitter", command =base.quit) 
    bou.pack(side = RIGHT) 
    # Dessin des 5 anneaux :
    for i in range(len(coul)):
         x1, y1 = (i * 100 + 20) - (i // 3 * 250), i // 3 * 50 + 30
         can.create_oval(x1, y1, x1+100, y1 +100, width =2, outline =coul[i]) 
    base.mainloop()
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    Citation Envoyé par GrandFather
    Bonjour,

    une variante, utilisant un plus large panel des opérations arithmétiques de Python (dont la division entière // ) et l'instruction for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    .....
    # Dessin des 5 anneaux :
    for i in range(len(coul)):
         x1, y1 = (i * 100 + 20) - (i // 3 * 250), i // 3 * 50 + 30
         .......
    Merci pour cette variante, est il possible d'avoir un peu d'explication sur le bout de code ci haut.
    J'ai bien compris le reste mais pour la fin je suis pas sûr de comprendre.
    merci

  5. #5
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    range() génère une liste d'entiers, allant de zéro (par défaut, mais tu peux préciser une autre valeur de départ) à la valeur passée en paramètre moins 1 ; ici, cette valeur est égal au nombre d'élément de la liste coul. Le for va donc faire une itération sur les entiers de 0 à 4.

    Pour le calcul des coordonnées, l'astuce est d'utiliser la division entière.
    i // 3 est égal à 0 pour i < 3, et 1 pour 3 <= i < 6.

    Si on prend x1 = (i * 100 + 20), la suite générée est 20, 120, 220, 320 et 420. Les quatrièmes et cinquième anneaux sortent du canvas. En soustrayant (i // 3 * 250), la suite devient : 20, 120, 220, 70, 270.

    Evidemment, ce code n'est ni très performant, ni très lisible, mais c'était juste pour illustrer qu'avec Python, comme tous les autres langages, il y a beaucoup de moyens différents d'arriver au même résultat.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

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

Discussions similaires

  1. [Python 3.X] Swinnen exercice 10.32
    Par loncle dans le forum Général Python
    Réponses: 4
    Dernier message: 03/01/2015, 22h10
  2. Réponses: 2
    Dernier message: 06/06/2011, 10h10
  3. Livre de Swinnen Exercice 8.13
    Par Piett dans le forum Tkinter
    Réponses: 1
    Dernier message: 12/03/2008, 11h18
  4. [Cours Swinnen][Tkinter] bloqué à un exercice
    Par babar89 dans le forum Tkinter
    Réponses: 4
    Dernier message: 18/10/2005, 16h48
  5. Un cours de C/C++ avec exercices corrigés
    Par merrheim dans le forum C++
    Réponses: 65
    Dernier message: 18/01/2005, 22h30

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