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 :

Programme Python Tkinter


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 3
    Points
    3
    Par défaut Programme Python Tkinter
    Bonjour à tous, je suis en terminale S et j'ai pris la spécialité Isn car je m'intéresse à l'informatique. Pour mon projet de fin d'année j'ai décidé de faire une sorte de partie de ping pong en tkinter, mon programme à du mal à avancer mais il est trop tard pour faire demi tour. J'ai besoin de votre aide car je suis bloqué (message d'erreur) et je ne comprend pas pourquoi.Aidez moi svp. Voici mon programme :

    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
    from tkinter import * 
    import math,random
    fenetre = Tk()
     
    LARGEUR = 480
    HAUTEUR = 320
    RAYON = 5 # rayon de la balle
     
    # position initiale au milieu
    X = LARGEUR/2
    Y = HAUTEUR/2
     
    # direction initiale aléatoire
    vitesse = random.uniform(1.8,2)*5
    angle = random.uniform(0,2*math.pi)
    DX = vitesse*math.cos(angle)
    DY = vitesse*math.sin(angle)
     
    # fonction touche clavier
    def clavier(event):
        global coords
     
        touche = event.keysym
     
        if touche == "Up":
            coords = (coords[0], coords[1] - 10)
        elif touche == "Down":
            coords = (coords[0], coords[1] + 10)
     
        # changement de coordonnées pour le rectangle
        canvas.coords(rectangle, coords[0], coords[1], coords[0]+25, coords[1]+50)
     
    # fonction déplacement de balle
    def deplacement():
        global X,Y,DX,DY,RAYON,LARGEUR,HAUTEUR
     
        # rebond à droite
        if X+RAYON+DX > LARGEUR:
            X = 2*(LARGEUR-RAYON)-X
            DX = -DX
     
        # rebond à gauche
        if X-RAYON+DX < 0:
            X = 2*RAYON-X
            DX = -DX
     
        # rebond en bas
        if Y+RAYON+DY > HAUTEUR:
            Y = 2*(HAUTEUR-RAYON)-Y
            DY = -DY
     
        # rebond en haut
        if Y-RAYON+DY < 0:
            Y = 2*RAYON-Y
            DY = -DY
     
        X = X+DX
        Y = Y+DY
     
        # affichage
        canvas.coords(Balle,X-RAYON,Y-RAYON,X+RAYON,Y+RAYON)
     
        # mise à jour toutes les 50 ms
        Mafenetre.after(50,deplacement)
     
    # coordonnées initiales
    coords = (0, 0)
    # création du rectangle
    rectangle = Canvas.create_rectangle(0,0,25,50,fill="violet")
    # Création de la balle
    Balle = Canvas.create_oval(X-RAYON,Y-RAYON,X+RAYON,Y+RAYON,width=1,fill='green')
    # ajout du bond sur les touches du clavier
    canvas.focus_set()
    canvas.bind("<Key>", clavier)
    # Création canvas
    canvas = Canvas(fenetre,height=HAUTEUR,width=LARGEUR,bg='white')
    canvas.pack(padx=5,pady=5)

  2. #2
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Pas d'aide par mp.

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

    Citation Envoyé par LeSmaug Voir le message
    Bonjour à tous, je suis en terminale S et j'ai pris la spécialité Isn car je m'intéresse à l'informatique. Pour mon projet de fin d'année j'ai décidé de faire une sorte de partie de ping pong en tkinter, mon programme à du mal à avancer mais il est trop tard pour faire demi tour. J'ai besoin de votre aide car je suis bloqué (message d'erreur) et je ne comprend pas pourquoi.Aidez moi svp.
    Postez le message d'erreur que vous avez: si on recopiait le code pour voir, rien ne dit qu'on ait le même que vous!

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

  4. #4
    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
    Bonjour,
    À quoi correspond la variable "Mafenetre"?
    On n'utilise pas "create_rectangle" ni "create_oval" à partir de la classe "Canvas" mais à partir d'une instance de celle-ci.
    D'où est appelée la fonction "deplacement" la première fois?
    Un "mainloop()" est souvent utile.

    Clodion

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Clodion, merci "Mafenetre" était une faute . J'ai rajouté un "mainloop()" à la fin mais pourrais tu me dire comment une utilise un "create" stp ?

  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 LeSmaug Voir le message
    Clodion, merci "Mafenetre" était une faute . J'ai rajouté un "mainloop()" à la fin mais pourrais tu me dire comment une utilise un "create" stp ?
    Bonjour,
    Ainsi que je l'ai écrit dans la réponse précédente, il faut utiliser les "create" des canevas sur des instances.
    Une instance est quelque chose de la forme:
    "tkinter" est la bibliothèque, "Canvas" est la classe qui nous intéresse.
    Les classes peuvent être instanciées avec des paramètres. C'est le cas ici.
    Le premier paramètre est le parent: en général on a au préalable créé une fenêtre ("Frame") de la bibliothèque "tkinter", et le canevas créé dépend de cette fenêtre (on peut ajouter d'autres widgets dans cette même fenêtre).
    C'est à partir de cette instance (le canevas sans majuscule) que sont effectuées toutes les opérations souhaitées.

    Cela donne généralement quelque chose de ce style.
    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
    import tkinter as tk
     
    def bouge():
        can.move(balle, 5, 5)
     
    larg, haut = 200, 200
    fen = tk.Tk()
    can = tk.Canvas(fen, width=larg, height=haut, bg='blue')
    can.pack()
     
    r = 15
    balle = can.create_oval(larg/2-r, haut/2-r, larg/2+r, haut/2+r, fill='green')
     
    bt = tk.Button(fen, text="bouge", command=bouge)
    bt.pack(side="right")
    btq = tk.Button(fen, text="quitte", command=fen.quit)
    btq.pack(side="left")
     
    fen.mainloop()
    Généralement l'image utilisée est celle de "moule" pour fabriquer des objets. Les objets sont les instances sur lesquelles on peut travailler.

    Mais il serait bon de lire le livre de G.Swennen (gratuit et disponible sur developpez) qui aborde ces sujets de manière très pédagogique et qui est très facile d'abord.

    Il semble que plusieurs notions sont déjà acquises mais que de grosses lacunes bloquent la progression.

    Clodion
    PS: le livre de G.Swinnen se lit très facilement et il aborde toutes les notions de bases qui permettent de progresser. Il se lit en très peu de temps.
    PS2: dans le script de départ, à part ces corrections, il faut aussi lancer la fonction "deplacement", par exemple juste avant le "mainloop" (qui doit être appliqué à la fenêtre). Il est aussi, bien sûr, nécessaire de créer le canevas avant la création de la raquette et de la balle.
    PS3: les constantes sont en majuscule, ok. Elles n'ont pas besoin d'être déclarées "global". Les variables sont elles en minuscule et doivent être déclarées globales. Plus exactement, ce sont les variables qui sont modifiées au sein de la fonction qui doivent être globales.
    PS4: éviter les noms d'instance identiques aux noms de classes (à une majuscule prêt): ie: can = Canvas(…) ou mon_can… plutôt que canvas = Canvas()…

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Merci Clodion, je ne connaissait pas ce livre et il m'aide beaucoup. J'ai essayé de prendre en compte vos conseils mais un message d'erreur apparaît ( qui est le même que celui de la première version de mon programme ) et je n'arrive pas à le comprendre. Pourriez vous me dire comment résoudre ce problème svp ?
    Message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     rectangle=Canvas.create_rectangle(0,0,25,50,fill="violet")
      File "C:\Users\Ordinateur\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 2340, in create_rectangle
        return self._create('rectangle', args, kw)
    AttributeError: 'int' object has no attribute '_create'

  8. #8
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Comme on te l'a dit précédemment, tu dois créer ton canevas en premier et ensuite seulement le rectangle et l'ovale.

    Dans ton invocation rectangle=Canvas.create_rectangle(0,0,25,50,fill="violet") je parie une Trappiste que c'est le premier zéro qui est passé comme instance, d'où l'erreur.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    VinsS désolé, je n'avais pas précisé que j'avais "mis à jour" mon programme, j'avais bien créé mon canevas en premier. Quand à mon invocation , je comprend ce que vous voulez me dire mais comment régler cette erreur ?
    Mon programme actuel :

    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
    from tkinter import * 
    import math,random
    fenetre = Tk()
     
    larg = 480
    haut = 320
    r = 5 # rayon de la balle
     
    # Création canvas
    canvas = Canvas(fenetre,height=haut,width=larg,bg='white')
    canvas.pack(padx=5,pady=5)
    # création du rectangle
    rectangle=Canvas.create_rectangle(0,0,25,50,fill="violet")
    # Création de la balle
    balle=Canvas.create_oval(x-r,y-r,x+r,y+r,width=1,fill='green')
    # coordonnées initiales
    coords = (0, 0)
    # ajout du bond sur les touches du clavier
    Canvas.focus_set()
    Canvas.bind("<Key>", clavier)
     
    # position initiale au milieu
    x = 240
    y = 160
     
    # direction initiale aléatoire
    vitesse = random.uniform(1.8,2)*5
    angle = random.uniform(0,2*math.pi)
    dx = vitesse*math.cos(angle)
    dy = vitesse*math.sin(angle)
     
    # fonction touche clavier
    def clavier(event):
        global coords
     
        touche = event.keysym
     
        if touche == "Up":
            coords = (coords[0], coords[1] - 10)
        elif touche == "Down":
            coords = (coords[0], coords[1] + 10)
     
        # changement de coordonnées pour le rectangle
        Canvas.coords(rectangle, coords[0], coords[1], coords[0]+25, coords[1]+50)
     
    # fonction déplacement de balle
    def deplacement():
        global x,y,dx,dy,r,larg,haut
     
        # rebond à droite
        if x+r+dx > larg:
            x = 2*(larg-r)-x
            dx = -dx
     
        # rebond à gauche
        if x-r+dx < 0:
            x = 2*r-x
            dx = -dx
     
        # rebond en bas
        if y+r+dy > haut:
            y = 2*(haut-r)-y
            dy = -dy
     
        # rebond en haut
        if y-r+dy < 0:
            y = 2*r-y
            dy = -dy
     
        x = x+dx
        Y = y+dy
     
        # affichage
        Canvas.coords(Balle,x-r,y-r,x+r,y+r)
     
        # mise à jour toutes les 50 ms
        fenetre.after(50,deplacement)
     
    fenetre.mainloop()

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par LeSmaug Voir le message
    VinsS désolé, je n'avais pas précisé que j'avais "mis à jour" mon programme, j'avais bien créé mon canevas en premier. Quand à mon invocation , je comprend ce que vous voulez me dire mais comment régler cette erreur ?
    Relisez le PS4 tout en bas du message de Clodion.
    Si ça ne fonctionne pas (re)lisez aussi le reste.

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

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Ah oui ! (je me sens un peu bête ) merci beaucoup vous m'avez débloqué.

  12. #12
    Membre habitué
    Avatar de Benbout
    Homme Profil pro
    Avide de savoir
    Inscrit en
    Avril 2016
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Avide de savoir

    Informations forums :
    Inscription : Avril 2016
    Messages : 62
    Points : 142
    Points
    142
    Billets dans le blog
    1
    Par défaut
    Moi je te te répondrais autrement,pas sur le coté technique car la réponse à ton probleme précis tu l'as recu.

    En premier lieu, et avant de passer à la conception de ton programme, tu devrais t'interesser aux objets que tu manipules, car par exemple dans le cas de ton canvas, cette instance que tu créé à partir de la classe canvas, certes tu as compris comment faire pour créer un canvas, mais as tu compris ce qu'est une instance ou ce qu'est une classe et à quoi ca sert concretement? Avant de te lancer dans ton script, étudie ce que tu manipules et lorsque ce sera fait, tu aura une vue différente sur ton projet et comment le mener à bien, comment le construire et sous quelle forme. C'est d'autant plus interessant que tu script sur un langage qui pousse beaucoup à programmer de cette manière (meme si sous python tu peux programmer de multiples facon).

    J'étais un peu comme toi il y a quelques temps, et pour ma part je ne cherchais meme pas à comprendre l'interet de l'orienté objet car je programmais des mode de jeu multi joueur sur une plateforme qui utilise un langage proche du C, donc qui ne m'a jamais poussé à essayer de comprendre cela. Mais, quand je me suis retrouvé avec un code source de 70 000 lignes (je te laisse imaginer le nombres de fonctions, de variables globales, de tableaux et d'énumérations en tout genre sans compter toutes les données diverses et variées à stocker dans une base de données), j'ai enfin réalisé ce à quoi les programmeurs de logiciels ont du faire face avant que ce type de programmation soit inventée car j'étais moi même confronté à ces problèmes (conflits de variables globales, travail harassant pour continuer à maintenir et developper le programme, difficultés à subdiviser le programme en sous programmes (du moins dans mon cas) etc). Je te rassure, il ne te faudra pas coder un programme de 70k de lignes dans un autre langage pour comprendre l'interet de la poo, tu commences directement sous python et il ne te faudra que quelques jours voire quelques semaines tout au plus pour comprendre les notions relatives à la programmation objet, gràce à la lecture et il y a de bons livres sur ce forum, mais passe par la d'abord avant de construire ton programme, c'est mon conseil en résumé. Il te reste 2 mois grand maximum, tu as le temps avant de faire ton programme et après tout la conception du programme n'est qu'un simple travail de traduction, ce qui compte avant tout c'est de modéliser avant de concevoir (aussi basique soit le programme je te le redis!) et de toute facon tu dois en passer par la, car tu vas devoir expliquer à ton prof comment fonctionne ton programme, comment tu l'as programmé, en nspirant de quoi et meme en lui racontant les problemes auxquels tu as été confronté lors de l'écriture de ton premier programme car c'est surtout ce qu'il cherche à savoir bien avant de voir que tu as reussi à faire un programme de ceci ou cela.

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Benbout, je comprend ce que vous voulez dire et je suis d'accord avec vous. L'année prochaine, je ferai une licence en informatique et je sais que de toute façons je vais devoir passer par là. Ceci dit, il ne me reste pas 2 mois mais plutôt une semaine pour finir mon programme , je n'est donc pas vraiment le temps de lire des livres sur la programmation ( malheureusement ).

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Bonjour, j'ai (encore ) un problème , pour la partie de ping pong, je créé 2 raquettes mais elles ne veulent pas se déplacer du tout, lorsque j'en fait une seule, tout fonctionne bien mais 2 à la fois, ça ne fonctionne pas, quelqu'un pourrait m'aider svp ?
    mon programme:
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    from tkinter import * 
    import math,random
    fenetre = Tk()
     
    larg = 480
    haut = 320
    r = 5 # rayon de la balle
     
    # position initiale au milieu
    x = 240
    y = 160
     
    # direction initiale aléatoire
    vitesse = random.uniform(1.8,2)*5
    angle = random.uniform(0,2*math.pi)
    dx = vitesse*math.cos(angle)
    dy = vitesse*math.sin(angle)
     
    # Création canvas
    can = Canvas(fenetre,height=haut,width=larg,bg='white')
    can.pack(padx=5,pady=5)
    # création des rectangles
    rectangle1=can.create_rectangle(0,0,25,50,fill="violet")
    rectangle2=can.create_rectangle(0,0,25,50,fill="red")
    # Création de la balle
    balle=can.create_oval(x-r,y-r,x+r,y+r,width=1,fill='green')
    # coordonnées initiales
    coords1 = (0, 0)
    coords2 = (458, 0)
     
     
    # fonction touche clavier
    def clavier(event):
        global coords1
     
        touche = event.keysym
     
        if touche == "Up":
            coords = (coords1[0], coords1[1] - 10)
        elif touche == "Down":
            coords = (coords1[0], coords1[1] + 10)
     
        # changement de coordonnées pour le rectangle1
        can.coords1(rectangle1, coords1[0], coords1[1], coords1[0]+25, coords1[1]+50)
     
     
    def clavier(event):
        global coords2
     
        touche = event.keysym
     
        if touche == "a":
            coords = (coords2[0], coords2[1] - 10)
        elif touche == "q":
            coords = (coords2[0], coords2[1] + 10)
     
        # changement de coordonnées pour le rectangle2
        can.coords(rectangle2, coords2[0], coords2[1], coords2[0]+25, coords2[1]+50)
     
     
    # ajout du bond sur les touches du clavier
    can.focus_set()
    can.bind("<Key>", clavier)
     
     
    # fonction déplacement de balle
    def deplacement():
        global x,y,dx,dy,r,larg,haut
     
        # rebond à droite
        if x+r+dx > larg:
            x = 2*(larg-r)-x
            dx = -dx
     
        # rebond à gauche
        if x-r+dx < 0:
            x = 2*r-x
            dx = -dx
     
        # rebond en bas
        if y+r+dy > haut:
            y = 2*(haut-r)-y
            dy = -dy
     
        # rebond en haut
        if y-r+dy < 0:
            y = 2*r-y
            dy = -dy
     
        x = x+dx
        Y = y+dy
     
        # affichage
        can.coords(balle,x-r,y-r,x+r,y+r)
     
        # mise à jour toutes les 50 ms
        fenetre.after(50,deplacement)
     
    deplacement()
    fenetre.mainloop()

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par LeSmaug Voir le message
    Bonjour, j'ai (encore ) un problème , pour la partie de ping pong, je créé 2 raquettes mais elles ne veulent pas se déplacer du tout, lorsque j'en fait une seule, tout fonctionne bien mais 2 à la fois, ça ne fonctionne pas, quelqu'un pourrait m'aider svp ?
    Relisez votre code. Vous avez fait un copie&coller de la fonction "clavier" en gardant le même nom. La deuxième définition écrase la première. Il faut avoir le déplacement des deux raquettes contrôlé par la même fonction et "bouger" la bonne raquette en fonction du caractère reçu. C'est du if...then..else... de base.

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

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Je vois, merci wiztricks , mais j'ai fais une autre erreur , je ne sais pas où. J'ai créé une seule fonction "clavier" pour le déplacement des deux raquettes, mais le résultat reste le même. (désolé si je vous embête)
    Programme:
    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
    85
    86
    87
    88
    89
    90
    from tkinter import * 
    import math,random
    fenetre = Tk()
     
    larg = 480
    haut = 320
    r = 5 # rayon de la balle
     
    # position initiale au milieu
    x = 240
    y = 160
     
    # direction initiale aléatoire
    vitesse = random.uniform(1.8,2)*5
    angle = random.uniform(0,2*math.pi)
    dx = vitesse*math.cos(angle)
    dy = vitesse*math.sin(angle)
     
    # Création canvas
    can = Canvas(fenetre,height=haut,width=larg,bg='white')
    can.pack(padx=5,pady=5)
    # création des rectangles
    rectangle1=can.create_rectangle(0,0,25,50,fill="violet")
    rectangle2=can.create_rectangle(0,0,25,50,fill="red")
    # Création de la balle
    balle=can.create_oval(x-r,y-r,x+r,y+r,width=1,fill='green')
    # coordonnées initiales
    coords1 = (0, 0)
    coords2 = (458, 0)
     
     
    # fonction touche clavier
    def clavier(event):
        global coords1, coords2
        touche = event.keysym
     
        if touche == "Up":
            coords = (coords1[0], coords1[1] - 10)
        elif touche == "Down":
            coords = (coords1[0], coords1[1] + 10)
        elif touche == "a":
            coords = (coords2[0], coords2[1] - 10)
        elif touche == "q":
            coords = (coords2[0], coords2[1] + 10)
        # changement de coordonnées pour le rectangle1
        can.coords(rectangle1, coords1[0], coords1[1], coords1[0]+25, coords1[1]+50)
        # changement de coordonnées pour le rectangle2
        can.coords(rectangle2, coords2[0], coords2[1], coords2[0]+25, coords2[1]+50)
     
     
    # ajout du bond sur les touches du clavier
    can.focus_set()
    can.bind("<Key>", clavier)
     
     
    # fonction déplacement de balle
    def deplacement():
        global x,y,dx,dy,r,larg,haut
     
        # rebond à droite
        if x+r+dx > larg:
            x = 2*(larg-r)-x
            dx = -dx
     
        # rebond à gauche
        if x-r+dx < 0:
            x = 2*r-x
            dx = -dx
     
        # rebond en bas
        if y+r+dy > haut:
            y = 2*(haut-r)-y
            dy = -dy
     
        # rebond en haut
        if y-r+dy < 0:
            y = 2*r-y
            dy = -dy
     
        x = x+dx
        Y = y+dy
     
        # affichage
        can.coords(balle,x-r,y-r,x+r,y+r)
     
        # mise à jour toutes les 50 ms
        fenetre.after(50,deplacement)
     
    deplacement()
    fenetre.mainloop()

  17. #17
    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 LeSmaug Voir le message
    Je vois, merci wiztricks , mais j'ai fais une autre erreur , je ne sais pas où. J'ai créé une seule fonction "clavier" pour le déplacement des deux raquettes, mais le résultat reste le même. (désolé si je vous embête)
    Programme:
    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
    85
    86
    87
    88
    89
    90
    from tkinter import * 
    import math,random
    fenetre = Tk()
     
    larg = 480
    haut = 320
    r = 5 # rayon de la balle
     
    # position initiale au milieu
    x = 240
    y = 160
     
    # direction initiale aléatoire
    vitesse = random.uniform(1.8,2)*5
    angle = random.uniform(0,2*math.pi)
    dx = vitesse*math.cos(angle)
    dy = vitesse*math.sin(angle)
     
    # Création canvas
    can = Canvas(fenetre,height=haut,width=larg,bg='white')
    can.pack(padx=5,pady=5)
    # création des rectangles
    rectangle1=can.create_rectangle(0,0,25,50,fill="violet")
    rectangle2=can.create_rectangle(0,0,25,50,fill="red")
    # Création de la balle
    balle=can.create_oval(x-r,y-r,x+r,y+r,width=1,fill='green')
    # coordonnées initiales
    coords1 = (0, 0)
    coords2 = (458, 0)
     
     
    # fonction touche clavier
    def clavier(event):
        global coords1, coords2
        touche = event.keysym
     
        if touche == "Up":
            coords = (coords1[0], coords1[1] - 10)
        elif touche == "Down":
            coords = (coords1[0], coords1[1] + 10)
        elif touche == "a":
            coords = (coords2[0], coords2[1] - 10)
        elif touche == "q":
            coords = (coords2[0], coords2[1] + 10)
        # changement de coordonnées pour le rectangle1
        can.coords(rectangle1, coords1[0], coords1[1], coords1[0]+25, coords1[1]+50)
        # changement de coordonnées pour le rectangle2
        can.coords(rectangle2, coords2[0], coords2[1], coords2[0]+25, coords2[1]+50)
     
     
    # ajout du bond sur les touches du clavier
    can.focus_set()
    can.bind("<Key>", clavier)
     
     
    # fonction déplacement de balle
    def deplacement():
        global x,y,dx,dy,r,larg,haut
     
        # rebond à droite
        if x+r+dx > larg:
            x = 2*(larg-r)-x
            dx = -dx
     
        # rebond à gauche
        if x-r+dx < 0:
            x = 2*r-x
            dx = -dx
     
        # rebond en bas
        if y+r+dy > haut:
            y = 2*(haut-r)-y
            dy = -dy
     
        # rebond en haut
        if y-r+dy < 0:
            y = 2*r-y
            dy = -dy
     
        x = x+dx
        Y = y+dy
     
        # affichage
        can.coords(balle,x-r,y-r,x+r,y+r)
     
        # mise à jour toutes les 50 ms
        fenetre.after(50,deplacement)
     
    deplacement()
    fenetre.mainloop()
    Bonjour,
    Attention aux variables!!
    Déjà, nommer une variable "coords" est mal venu (mot de tkinter).
    Mais ici c'est un mélange peu digeste dans la fonction clavier!!
    C'est la variable "coords" qui est crée et mise jour… Et ce sont les valeurs globales qui sont utilisées pour déplacer les raquettes… Donc toujours les mêmes valeurs!!!

    Ainsi que le notait Wiztricks, une simple imbrication de "if…" et le problème n'existe pas!!!
    -> en premier trouver la bonne raquette:
    -->"if touche == "Up" or touche == "Down": on traite la première raquette (et son déplacement en même temps)


    Oui?

    Clodion

    PS: ce ne serait pas du luxe d'initialiser la seconde raquette à la bonne position (et pas sur l'autre raquette)
    PS2: Ce serait encore mieux (plus facile) que "coords1 et coords2" soient des listes, plutôt que des tuples.
    Alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        if touche == "Up" or touche == "Down":
            if touche == "Up":
                coords1[1] -= 10
            else:
                coords1[1] += 10
            can.coords(rectangle1, coords1[0], coords1[1], coords1[0]+25, coords1[1]+50)
    Et ainsi, même plus besoin de déclarer ces variables globales!

  18. #18
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Mon programme commence à prendre forme, merci Clodion. C'est effectivement plus simple de manipuler les coordonnées en tant que listes. J'ai deux questions :
    1) Est-il possible de manipuler les deux raquettes en même temps ? ( question de fluidité )
    2)Je me suis également dit qu'il était mieux d'initialiser les raquettes à leur place j'ai cherché mais je n'ai pas trouvé, comment faire ?

  19. #19
    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 LeSmaug Voir le message
    …C'est effectivement plus simple de manipuler les coordonnées en tant que listes. J'ai deux questions :
    1) Est-il possible de manipuler les deux raquettes en même temps ? ( question de fluidité )
    2)Je me suis également dit qu'il était mieux d'initialiser les raquettes à leur place j'ai cherché mais je n'ai pas trouvé, comment faire ?
    Bonjour,
    Les deux raquettes sont manipulées en "même temps"… Le seul problème se sont les touches: on ne peut pas écrire un "a" tout en utilisant les flèches de direction (du moins à ma connaissance). La seule échappatoire serait d'utiliser non pas la détection d'une touche, mais la détection de l'appui sur une touche en ayant à gérer la "libération" (release) de la touche. C'est, sans doutes, possible, mais cela conduit nettement plus loin!

    Pour la deuxième question, il ne faut quand même pas exagérer!! Lors de la création par "rectangle2=can.create_rectangle(…" il suffit de passer les coordonnées adéquates

    Clodion

  20. #20
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Ah oui je part souvent trop loin merci

Discussions similaires

  1. Projet ISN Python programme Piano Tkinter
    Par Biloute42 dans le forum Programmation multimédia/Jeux
    Réponses: 4
    Dernier message: 07/05/2014, 18h11
  2. Réponses: 145
    Dernier message: 15/02/2009, 11h51
  3. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

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