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 :

Apprendre à Programmer avec Python 3 G.Swinnen 8.6.2 [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Apprendre à Programmer avec Python 3 G.Swinnen 8.6.2
    Bonjours,
    Comme l'indique le titre, j'ai un problème avec l'exercice 8.6 tiret 2 du livre de G.Swinnen des cours Python :
    Premièrement, voici, le code source :


    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
     
    #-*- coding:Utf8 -*-
    #########################################################################
    # #Nom: Traceur de ligne                                                                                                                        # #
    # #                                                                                                                                                      # #
    # #But: tracer une ligne dans un canevas avec des couleurs aléatoires                                                            # #
    # #                                                                                                                                                      # #
    # #copyright : nietoparang ©                                                                                                                   # #
    #########################################################################
     
    #importation des modules :
    from tkinter import *
    from random import randrange
     
    #definition des fonctions:
     
    def drawline2():
        "trace une croix en rouge"
        can1.create_line(100, 0, 100, 200, fill='red')
        can1.create_line(0, 100, 200, 100, fill='red')
     
    def drawline(x1, y1, x2, y2, coul):
        "tracé d'une ligne dans le canevas can1"
        can1.create_line(x1, y1, x2, y2, width=2, fill=coul)
     
        #modification des coordonnées sur la ligne suivante:
        y1, y2= y1-10, y2+10
     
     
    def changecolor():
        "changement aleatoire de la couleur du tracé"
        global coul
        pal = ['cyan', 'maroon', 'green']
        c = randrange(3)
        coul = pal[c]
     
     
    # ----Programme Principal----:
     
    x1, y1, x2, y2 = 10, 190, 160, 10
    coul= 'dark green'
     
    #widget principal:
    fen1 = Tk()
     
    #widget esclaves:
    can1 = Canvas (fen1, bg='dark grey', height=200, width=200)
    can1.pack(side=LEFT)
    bou1= Button(fen1,text='Quitter',command=fen1.quit)
    bou1.pack(side=BOTTOM)
    bou2= Button(fen1,text='Tracer une Ligne',command= drawline(x1, y1, x2, y2, coul))
    bou2.pack()
    bou3= Button(fen1,text='Changer couleur',command=changecolor)
    bou3.pack()
    bou4= Button(fen1,text='viseur', command = drawline2)
    bou4.pack()
     
    fen1.mainloop()
     
    fen1.destroy()
    Alors voilà le problème:
    Au lieu de fonctionner normalement, il se fige :
    Nom : Capture.PNG
Affichages : 488
Taille : 31,9 Ko
    Je peut afficher le viseur mais c'est tout...
    Est-ce normal? Le but de l'exercice?
    Est-ce que quelqu'un peut m'expliquer comment ça se fait?

    Merci d'avance pour vos réponses

  2. #2
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par nietoparang Voir le message
    Bonjours,
    Comme l'indique le titre, j'ai un problème avec l'exercice 8.6 tiret 2 du livre de G.Swinnen:
    Premièrement, voici, le code source :

    Alors voilà le problème:
    Au lieu de fonctionner normalement, il se fige :
    […]
    Je peut afficher le viseur mais c'est tout...
    Est-ce normal? Le but de l'exercice?
    Est-ce que quelqu'un peut m'expliquer comment ça se fait?

    Merci d'avance pour vos réponses
    Bonsoir,
    Le problème se situe ligne 51:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bou2= Button(fen1,text='Tracer une Ligne',command= drawline(x1, y1, x2, y2, coul))
    Ici, la fonction "drawline" est exécutée lors de la création du bouton et les valeurs de "x1, y1, x2, y2 et coul" sont enregistrées par tkinter! À chaque appuis sur le bouton, la même fonction est appelée avec les même paramètres!!!
    Ici, il faut trouver un moyen d'appeler une fonction sans ses paramètres (et donc sans parenthèses) comme cela est fait pour les 3 autres boutons!!

    D'autre part, il faut faire attention aux variables (entre le local et le global)!!

    La solution est vraiment très très proche (une ou deux lignes à modifier)!

    Oui?

    Clodion

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Citation Envoyé par Clodion Voir le message
    À chaque appuis sur le bouton, la même fonction est appelée avec les même paramètres!!!
    Salut,

    Pour moi, la commande liée à bou2 est None.

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

    Ce n'est pas un exercice mais le premier exemple de code donné intégralement comme suit:

    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
    # Petit exercice utilisant la bibliothèque graphique tkinter
     
    from tkinter import *
    from random import randrange
     
    # --- définition des fonctions gestionnaires d'événements : ---
    def drawline():
     "Tracé d'une ligne dans le canevas can1"
     global x1, y1, x2, y2, coul
     can1.create_line(x1,y1,x2,y2,width=2,fill=coul)
     
     # modification des coordonnées pour la ligne suivante :
     y2, y1 = y2+10, y1-10
     
    def changecolor():
     "Changement aléatoire de la couleur du tracé"
     global coul
     pal=['purple','cyan','maroon','green','red','blue','orange','yellow']
     c = randrange(8)      # => génère un nombre aléatoire de 0 à 7
     coul = pal[c]
     
    #------ Programme principal -------
     
    # les variables suivantes seront utilisées de manière globale :
    x1, y1, x2, y2 = 10, 190, 190, 10      # coordonnées de la ligne
    coul = 'dark green'	      # couleur de la ligne
     
    # Création du widget principal ("maître") :
    fen1 = Tk()
    # création des widgets "esclaves" :
    can1 = Canvas(fen1,bg='dark grey',height=200,width=200)
    can1.pack(side=LEFT)
    bou1 = Button(fen1,text='Quitter',command=fen1.quit)
    bou1.pack(side=BOTTOM)
    bou2 = Button(fen1,text='Tracer une ligne',command=drawline)
    bou2.pack()
    bou3 = Button(fen1,text='Autre couleur',command=changecolor)
    bou3.pack()
     
    fen1.mainloop()        # démarrage du réceptionnaire d'événements
     
    fen1.destroy()	       # destruction (fermeture) de la fenêtre
    Il sert à illustrer les différents Widgets et à introduire pas mal de concepts.
    Pas facile de modifier ce genre de code sans en avoir compris les subtilités.

    - W

  5. #5
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Pour moi, la commande liée à bou2 est None.
    Bonjour,
    Oui, j'ai été trop vite!

    Clodion

  6. #6
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Ce n'est pas un exercice mais le premier exemple de code donné intégralement comme suit:

    Il sert à illustrer les différents Widgets et à introduire pas mal de concepts.
    Pas facile de modifier ce genre de code sans en avoir compris les subtilités.

    - W
    Bonjour,
    Oui, mais au bas de la page 78 du pdf, ce code est utilisé pour quelques exercices afin de faire manipuler les nouveaux concepts…
    (C'est juste avant le le paragraphe 10-C-2).
    Donc bon… Au cas ou…

    Clodion

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

    Citation Envoyé par Clodion Voir le message
    Oui, mais au bas de la page 78 du pdf, ce code est utilisé pour quelques exercices afin de faire manipuler les nouveaux concepts…
    (C'est juste avant le le paragraphe 10-C-2).
    Tout à fait, çà dit:
    Citation Envoyé par Swinnen
    - Supprimez la ligne global x1, y1, x2, y2 dans la fonction drawline du programme original. Que se passe-t-il ? Pourquoi ?
    - Si vous placez plutôt « x1, y1, x2, y2 » entre les parenthèses, dans la ligne de définition de la fonction drawline, de manière à transmettre ces variables à la fonction en tant que paramètres, le programme fonctionne-t-il encore ? N'oubliez pas de modifier aussi la ligne du programme qui fait appel à cette fonction !
    On se doute que le programme ne fonctionne plus... mais ce n'est pas la raison technique qui est intéressante mais les questions qu'on va se poser sur...

    - W

  8. #8
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci à tous,
    Le problème est que je ne vois pas comment mettre ceci en arguments de la fonction drawline
    j'ai également essayé :
    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
     
    #-*- coding:Utf8 -*-
     
    #########################################################################
    # #Nom: Traceur de ligne                                                                                                                     
    # #                                                                                                                                                    
    # #But: tracer une ligne dans un canevas avec des couleurs aléatoires                                                       
    # #                                                                                                                                                     
    # #copyright : nietoparang ©                                                                                                           
    #########################################################################
     
    #importation des modules :
    from tkinter import *
    from random import randrange
     
    #definition des fonctions:
     
    def drawline2():
        "trace une croix en rouge"
        can1.create_line(100, 0, 100, 200, fill='red')
        can1.create_line(0, 100, 200, 100, fill='red')
     
    def drawline(x1, y1, x2, y2, coul):
        "tracé d'une ligne dans le canevas can1"
        can1.create_line(x1, y1, x2, y2, width=2, fill=coul)
     
        #modification des coordonnées sur la ligne suivante:
        coor[1], coor[3]= coor[1]-10, coor[3]+10
     
     
    def changecolor():
        "changement aleatoire de la couleur du tracé"
        global coul
        pal = ['cyan', 'maroon', 'green']
        c = randrange(3)
        coul = pal[c]
     
     
    # ----Programme Principal----:
     
    coor= [10, 190, 160, 10,'dark green']
     
     
    #widget principal:
    fen1 = Tk()
     
    #widget esclaves:
    can1 = Canvas (fen1, bg='dark grey', height=200, width=200)
    can1.pack(side=LEFT)
    bou1= Button(fen1,text='Quitter',command=fen1.quit)
    bou1.pack(side=BOTTOM)
    bou2= Button(fen1,text='Tracer une Ligne',command= drawline(*coor))
    bou2.pack()
    bou3= Button(fen1,text='Changer couleur',command=changecolor)
    bou3.pack()
    bou4= Button(fen1,text='viseur', command = drawline2)
    bou4.pack()
     
    fen1.mainloop()
     
    fen1.destroy()
    Donc c'est peut-être le but de l'exercice de montrer l'utilité des des variables globales?
    Pourquoi bou2 est none? ça veut dire quoi? Que l'instruction est invalide et donc est executée seulement avec les paramètres de départ, lors de la création du bouton , ou qu'a chaque fois qu'on l'execute, elle utilise les paramètres fournis, au moment où le bouton est ajouté au winget principal( pack())?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par nietoparang Voir le message
    Merci à tous,
    Le problème est que je ne vois pas comment mettre ceci en arguments de la fonction drawline
    j'ai également essayé :


    Donc c'est peut-être le but de l'exercice de montrer l'utilité des des variables globales?
    Pourquoi bou2 est none? ça veut dire quoi? Que l'instruction est invalide et donc est executée seulement avec les paramètres de départ, lors de la création du bouton , ou qu'a chaque fois qu'on l'execute, elle utilise les paramètres fournis, au moment où le bouton est ajouté au winget principal( pack())?
    Bonjour,
    Il serait plus judicieux d'utiliser les balises codes que citations afin que l'on puisse tester ce code! :-)

    Je pense qu'il serait bon de relire le paragraphe "10-C-1 - Exemple graphique :tracé de lignes dans un canevas" du guide de G. Swinnen (mes références sont celles du pdf téléchargé sur developpez.com).
    C'est à cet endroit qu'il explique le fonctionnement du script.

    L'utilisation de cette structure est:
    mon_bouton = Button(fen, text="mon texte", command = ma_fonction)
    exemple qui est utilisé dans le script:
    bou1= Button(fen1,text='Quitter',command=fen1.quit)

    Si après "command" vient quelque chose d'évaluable, tkinter l'évalue!
    C'est pour cela que, avec raison, VinsS écrivait que "command" était None puisque la fonction n'a pas de "return".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> def f(x):
    	x += 1
     
     
    >>> ma_var = f(2)
    >>> print(ma_var)
    None
    >>> 
    >>> ma_var = f
    >>> print(ma_var)
    <function f at 0x7f9a6332c158>
    >>>
    Sans parenthèses après la fonction, "command" contient une référence à la fonction à appeler. Alors qu'avec des parenthèses, la fonction est évaluée et c'est son résultat que contient "command".
    Et à chaque appui sur le bouton, c'est cette commande qui sera exécutée: la fonction dont "command" contient la référence (dans l'exemple "function f at 0x7f9a6332c158") ou rien si "command" ne contient rien à exécuter (ou d'exécutable).

    Sinon, oui, apparaît un petit problème de variables globales/locales.

    Pour résoudre ce problème, l'une des solutions est de déclarer les variables (x1…y2) dans le corps du script puis de les utiliser dans la fonction appelée par "command" en déclarant ces variables comme étant "global" (elles sont alors disponibles en lecture et écriture au sein de la fonction)

    Ainsi avec les variables x1…y2 déjà initialisées dans le corps du script la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def drawline():
        global y1, y2
        can1.create_line(x1, y1, x2, y2, width=2, fill=coul)
        y1, y2= y1-10, y2+10
    permet de résoudre le petit problème.
    Ici, cela permet d'affecter "drawline" à "command" sans que la fonction ne soit exécutée lors de la création du bouton. Et la fonction s'exécute à chaque appui sur le bouton.

    Oui?
    Mais tout ceci est expliqué en détails dans le chapitre correspondant du livre de G. Swinnen!

    Clodion

  10. #10
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci à tous,
    problème résolu!

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

Discussions similaires

  1. Réponses: 29
    Dernier message: 06/08/2021, 21h46
  2. Apprendre à programmer avec Python exercices 4.2
    Par bellamy dans le forum Général Python
    Réponses: 5
    Dernier message: 15/10/2009, 14h53
  3. Apprendre à programmer avec Python exercices 5.14
    Par bellamy dans le forum Général Python
    Réponses: 7
    Dernier message: 02/08/2008, 10h03

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