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 :

Aide exercice 8.11 Apprendre Python3 G.Swinnen.


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Points : 23
    Points
    23
    Par défaut Aide exercice 8.11 Apprendre Python3 G.Swinnen.
    Bonsoir, de nouveau je me permets de faire appel à vos services qui m'avaient été d'une grande aide la dernière fois. Je suis bloqué sur un exercice d'un cours python, le cours Python de Swinnen et je pense en comprendre le principe mais je n'ai aucune idée de comment l'appliquer. J'ai essayé plusieurs tests (plutôt fumeux) mais rien à faire.

    Voici l'exercice:

    Modifiez le script ci-dessous de manière à faire apparaître un petit cercle rouge à l’endroit où l’utilisateur a effectué son clic (vous devrez d’abord remplacer le widget Frame par un widget Canvas).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from tkinter import * 
    def pointeur(event): 
        chaine.configure(text = "Clic détecté en X =" + str(event.x) +\ 
                                ", Y =" + str(event.y)) 
    fen = Tk() 
    cadre = Frame(fen, width =200, height =150, bg="light yellow") 
    cadre.bind("<Button-1>", pointeur) 
    cadre.pack() 
    chaine = Label(fen) 
    chaine.pack() 
    fen.mainloop()
    En vous remerciant par avance pour un début de piste. Je continue à chercher de mon coté...

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    1) Remplacez le widget Frame par un Canvas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cadre = Frame(fen, width =200, height =150, bg="light yellow")
    2) faire apparaître un petit cercle rouge à l’endroit où l’utilisateur a effectué son clic.
    Dans pointeur vous récupérez déjà event.x et event.y.
    Pour créér un cercle dans un Canvas c'est canvas.create_oval(x1, y1, x2, y2, options).
    Vous devez donc remplacer le chaine.configure de pointeur par un cadre.create_oval et utiliser event.x et event.y pour le placer. A vous de voir pour le diametre (comprendre + et -).
    Petit rappel sur create_oval :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    x1y1---------------
    I                 I
    I                 I
    I                 I
    I                 I
    I                 I
    _______________x2y2
    Pour la couleur l'option c'est fill.
    Du coup chaine est inutile.

    Bon code
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Re,

    Vous comprendrez a la relecture du tuto que le but ici n'est pas de vous former à tkinter mais de vous amener une logique (une 'tête bien faite'). tkinter étant quasi universel et les gui la façon la plus ludique d'entrevoir les classes, instances et objets.
    Dans cette optique je vous conseillerais de revoir plus précisément ce que vous aurez appris à la fin de chaque chapitre. Par exemple, puisque c'est dans le sujet, lorsque dans le chapitre on vous parle du Widget Canvas pensez à prendre le temps d'en regarder toutes les possibilités.
    Une tête bien faite et bien pleine c'est pratique.

    Bonne découverte
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Bonsoir, merci une fois de plus votre aide m'a été d'une grande utilité voici ma soution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from tkinter import * 
    def pointeur(event): 
        can.create_oval(event.x - r,event.y - r,event.x + r,event.y + r,outline= "red")
     
    r = 5
     
    fen = Tk() 
    can = Canvas(fen, width =200, height =150, bg="light yellow") 
    can.bind("<Button-1>", pointeur) 
    can.pack() 
    fen.mainloop()
    Je m'assure pourtant à chaque fin de chapitre d'être sur d'avoir assimilé le cours et les exercices mais parfois la solution ne me saute pas aux yeux donc encore merci pour votre aide rapide et efficace.

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Et vous m'avez bien eu sur ce coup là. L'énoncé parle d'un cercle donc vous avez raison avec outline.
    Je me rattraperais (c'est presque de la mauvaise foi ) en disant que le fait de rajouter la variable r est inutile.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Re, comment supprimer la variable r ? En remplaçant r par une valeur numérique à l'intérieur de create_oval:
    can.create_oval(event.x - 5,event.y - 5,event.x + 5,event.y + 5,outline= "red") ?
    Ou vous pensez à une autre solution ?

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    C'est bien cela.
    Mais c'est sans importance ici.
    Merci d'utiliser le forum pour les questions techniques.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Ok merci beaucoup.

  9. #9
    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
    *souffle sur le sujet pour y retirer la poussière*

    Pour ceux qui cherche et qui ne savent pas retirer les cercles après clique, vous pouvez rajouter la fonction can.delete(ALL).
    Elle efface le dessin avant chaque clique, ce qui permet de s'amuser sans avoir à relancer le petit programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from tkinter import *
    def pointeur(event):
        can.delete(ALL)
        can.create_oval(event.x-5, event.y-5, event.x+5, event.y+5, fill ="red")
     
    fen = Tk()
    can = Canvas(fen, width = 200, height = 200, bg = "white")
    can.bind("<Button-1>", pointeur)
    can.pack()
    fen.mainloop()
    Surement une réponse inutile mais l'aide m'a permis de comprendre cette exercice, et de jouer un peu avec !

  10. #10
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bien sur, tout est possible (ou presque).
    Vous pouvez aussi utiliser le .move(item, dx, dy) du Canvas pour déplacer le même item sans effacer tout les items du Canvas par exemple.
    Si vous positionnez le create hors du visuel cela n'est pas mal aussi
    C'est comme les lego : Soit vous cassez tout pour refaire soit vous déplacez. Perso cela me donne de l'urticaire de refaire
    Merci d'utiliser le forum pour les questions techniques.

  11. #11
    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
    ah oui mais c'est pompette de calculer les dx, dy dans ce cas.
    Mais bien plus simple avec la fonction "cachée" moveto:

    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
    from tkinter import *
     
    class MyCanvas(Canvas):
        def moveto(self, *args):
            self.tk.call((self._w, 'moveto') + args)
     
    def pointeur(event):
        print (event.x, event.y)
        canvas.moveto('rond', event.x, event.y)
     
    fen = Tk()
    canvas = MyCanvas(fen, width = 200, height = 200, bg = "white")
    canvas.create_oval(-20, -20, -10, -10, fill ="red", tag='rond')
    canvas.bind("<Button-1>", pointeur)
    canvas.pack()
    fen.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    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
    Ma fois, j'ai bien fait de souffler fort sur le sujet !!

    C'est super intéressant ce que vous dites, je viens de tester le code de wiztricks.

    Dans la méthode swinnen, il n'y a pas le tag ni le move to mais comme il le précise, il donne juste le basique.

    Le dx, dy, est assez hard, mais vu que je recommence le tuto, j'aurais le temps de bien retravailler ça !

    Connaîtriez-vous, un tutoriel qui permettrait d'apprendre d'avantage de chose sur tkinter ? ou un livre à acheter concernant tkinter ?

  13. #13
    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,

    Citation Envoyé par papyfouette Voir le message
    Dans la méthode swinnen, il n'y a pas le tag ni le move to mais comme il le précise, il donne juste le basique.
    Le Swinnen est très bien pour débuter, mais vu la quantité de sujets à découvrir lorsqu'on aborde la programmation, on reste longtemps "débutant".

    Le dx, dy, est assez hard, mais vu que je recommence le tuto, j'aurais le temps de bien retravailler ça !

    Connaîtriez-vous, un tutoriel qui permettrait d'apprendre d'avantage de chose sur tkinter ? ou un livre à acheter concernant tkinter ?
    "tkinter" est d'abord une bibliothèque du langage TCL qui s'appelle Tk. Et, il en existe des pendants pour PERL et Ruby (d'autres langages de scriptings). La communauté TCL/Tk a fait pas mal d'efforts ces dernières années pour remettre Tk aux goûts du jours et en faciliter la découverte. Vous pouvez consulter le site TkDocs qui est pas mal pour avoir une présentation des fonctionnalités de tous les widgets avec quelques cas d'utilisation.
    Le wiki Python sur Tkinter vous donne lui aussi pas mal de pistes.
    Vous avez aussi la documentation TCL/Tk qui est un peu plus rude à lire mais qui contient tout ce qu'il faut.

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

  14. #14
    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
    Fort bien,

    Oui je me doutes que débutant on le reste même la méthode swinnen fini, et heureusement, ça serait pas drôle de se lancer dans quelques chose de facile.
    Merci à vous deux pour toutes les informations.

  15. #15
    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
    ah oui mais c'est pompette de calculer les dx, dy dans ce cas.
    Bonjour,
    Ho ben quand même!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from tkinter import * 
    def pointeur(event):
        global pos
        x, y = event.x-pos[0], event.y-pos[1]
        can.move(cerc, x, y)
        pos = (event.x, event.y)
     
    pos = (-20,-20)
    fen = Tk() 
    can = Canvas(fen, width =200, height =150, bg="light yellow") 
    can.bind("<Button-1>", pointeur) 
    can.pack() 
    cerc = can.create_oval(-20,-20,-10,-10,outline= "red")
    fen.mainloop()
    Je fais une erreur quelque part?

    Clodion

  16. #16
    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,

    Citation Envoyé par Clodion Voir le message
    Je fais une erreur quelque part?
    Il n'y a pas d'erreur, çà montre bien qu'on doit stocker (ou récupérer) la position courante dans une variable globale pour calculer les dx, dy... alors qu'on peut s'en passer (dans ce cas).

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

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Merci pour la solution, je n'apporterai rien de plus mais j'avais compris le principe de ce qu'il fallait trouver. Par contre je me suis emmêlé les pinceaux.

    alors je met quand même mon faux 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
    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    #  swinnen8.11.py
    #  
    # 
    #  
    #  This program is free software; you can redistribute it and/or modify
    #  it under the terms of the GNU General Public License as published by
    #  the Free Software Foundation; either version 2 of the License, or
    #  (at your option) any later version.
    #  
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #  
    #  You should have received a copy of the GNU General Public License
    #  along with this program; if not, write to the Free Software
    #  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
    #  MA 02110-1301, USA.
    #  
    #  
     
     
    from tkinter import *
    from random import randrange
     
     
    def cercle (x,y,r):
     
        canvas.create_oval(x-r,y-r,x+r,y+r, fill = 'red')
     
    # correction
    #def cercle (event):
    #    r = randrange(0,30) 
     
    #    canvas.create_oval(event.x-r,event.y-r,event.x+r,event.y+r, fill = 'red')
     
    def dessinercercle(event):
     
     
        x = tirX
        y = tirY
        x = event.x
        y = event.y
        r = randrange(0,10)
     
        #~ print (x,y,r)  #perso
        cercle(x,y,r) 
     
    def tir(event):
     
        chaine.configure(text = "X = " + str(event.x) + " Y = " + str(event.y))
     
    def tirX(event):
     
        chaine.configure(event.x)
     
    def tirY(event):
     
        chaine.configure(event.y)
     
     
     
     
    fen = Tk()
     
    but = Button(fen, text = "Quit",command = fen.quit)
    but.pack(side = BOTTOM)
    but2 = Button (fen, text = "Tirer", command = cercle)
    but2.pack(side = RIGHT)
     
    canvas = Canvas(fen, width = 200, height = 200, bg = 'grey')
    canvas.bind("<Button-1>", tir) #cercle
    canvas.pack(padx = 10, pady = 10)
     
    chaine = Label(fen) # objet label() rajouté pour afficher
    chaine.pack()       # les coordonnées x y (perso)
     
     
     
    fen.mainloop()
    fen.destroy()
    evidement c'est un code à rallonge qui n'en fini plus de nouvelles erreurs.
    Il faut dire que l'intertprétation dans le cours de G.Swinnen est un peu confuse, je croyais que la variable "event" etait réservé à la méthode bind. En lisant la solution c'est devenu de suite plus clair.

    Merci

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

Discussions similaires

  1. Aide exercice 8.14 apprendre Python G.swinnen
    Par Asimoov dans le forum Tkinter
    Réponses: 1
    Dernier message: 25/03/2011, 03h08
  2. Aide exercice de math/Algorithmique
    Par laurent2628 dans le forum Mathématiques
    Réponses: 11
    Dernier message: 10/06/2008, 13h24
  3. Aide exercices Java débutant
    Par dalil777 dans le forum Général Java
    Réponses: 9
    Dernier message: 08/02/2008, 22h19
  4. Aide exercice C
    Par lkaiman dans le forum C
    Réponses: 3
    Dernier message: 31/12/2007, 12h57

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