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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    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 Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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 émérite
    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
    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
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    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 émérite
    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
    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
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    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'

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