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

Programmation multimédia/Jeux Python Discussion :

Affichage dynamique d'une trajectoire


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Affichage dynamique d'une trajectoire
    Bonjour,

    J'essaye de programmer un simulateur d'orbite en langage python.

    J'ai déjà réussi à afficher une trajectoire mais j'aimerais qu'on puisse la voir s'afficher au cours du temps sauf que le seul affichage graphique que je connaisse est pylab.plot

    J'ai entendu parler du module Tkinter mais je ne trouve aucune documentation sur lui sauf pour afficher un widget...

    Merci d'avance !

  2. #2
    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

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    J'ai trouvé le code suivant dans ce site :

    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
    from Tkinter import *
     
    # définition des gestionnaires
    # d'événements :
     
    def move():
        "déplacement de la balle"
        global x1, y1, dx, dy, flag
        x1, y1 = x1 +dx, y1 + dy
        if x1 >210:
            x1, dx, dy = 210, 0, 15
        if y1 >210:
            y1, dx, dy = 210, -15, 0
        if x1 <10:
            x1, dx, dy = 10, 0, -15
        if y1 <10:
            y1, dx, dy = 10, 15, 0
        can1.coords(oval1,x1,y1,x1+30,y1+30)
        if flag >0:
            fen1.after(50,move)         # => boucler après 50 millisecondes
     
     
    def stop_it():
        "arret de l'animation"
        global flag
        flag =0
     
    def start_it():
        "démarrage de l'animation"
        global flag
        if flag ==0:         # pour ne lancer qu'une seule boucle
        flag =1
        move()
     
    #========== Programme principal =============
     
    # les variables suivantes seront utilisées de manière globale :
    x1, y1 = 10, 10         # coordonnées initiales
    dx, dy = 15, 0          # 'pas' du déplacement
    flag =0                 # commutateur
     
    # Création du widget principal ("parent") :
    fen1 = Tk()
    fen1.title("Exercice d'animation avec Tkinter")
    # création des widgets "enfants" :
    can1 = Canvas(fen1,bg='dark grey',height=250, width=250)
    can1.pack(side=LEFT, padx =5, pady =5)
    oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill='red')
    bou1 = Button(fen1,text='Quitter', width =8, command=fen1.quit)
    bou1.pack(side=BOTTOM)
    bou2 = Button(fen1, text='Démarrer', width =8, command=start_it)
    bou2.pack()
    bou3 = Button(fen1, text='Arrêter', width =8, command=stop_it)
    bou3.pack()
    # démarrage du réceptionnaire d'évènements (boucle principale) :
    fen1.mainloop()
    Cependant la fonction move() utilise des dx et des dy presque toujours identiques.

    Or dans mon programme, dx et dy sont des fonctions de x1 et y1.

    J'ai donc essayé de modifier le code de la fonction move() mais sans succès :

    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
    dx1 = N.zeros(n-1)
    dy1 = N.zeros(n-1)
     
    for i in range (0,n-1) :
    	dx1[i] = x[i+1] - x[i]
    	dy1[i] = y[i+1] - y[i]
     
    t = N.zeros((n-1,4))
    dx0 = dx1[0]
    dy0 = dy1[0] 
     
    def fct (i) :
    	xi = x[i]
    	yi = y[i]
    	dxi = dx1[i]
    	dyi = dy1[i]
    	t[i] = (xi, yi, dxi, dyi)
     
    def move():
        "déplacement de la balle"
        global x1, y1, dx, dy, flag
        x1, y1 = x1 +dx, y1 + dy
        for i in range (0,n-1) :
    	coord = fct(i)
    	x1 = coord[i,0]
    	y1 = coord[i,1]
    	dx = coord[i,2]
    	dy = coord[i,3]
        can1.coords(oval1,x1,y1,x1+30,y1+30)
        if flag >0:
            fen1.after(50,move)
    Les vecteurs x, y, dx1, dy1 sont des tableaux que j'ai défini au préalable dans mon programme et lorsque j'essaye de le lancer, le terminal affichage ce message :

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
    File "proto1.py", line 244, in start_it
    move()
    File "proto1.py", line 225, in move
    x1 = coord[i,0]
    TypeError: 'NoneType' object is unsubscriptable

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    EDIT : je viens de comprendre mon erreur ; je n'avais pas compris que la fonction agissait déjà comme une boucle.


    Je voudrais à présent utiliser les touches de mon clavier et non créer des widgets "haut", "bas", "gauche", "droite". Tkinter me permet-il de faire quelque chose comme ça ou dois-je utiliser un autre module ?

    Sinon j'aurais bien aimé ajouter quelques "fioritures" à mon programme comme par exemple indiquer sur un coin du canevas le temps écoulé depuis le début de la simulation.

    J'ai crée un texte dans la boucle move() qui affiche à chaque fois un nouveau texte : le problème c'est qu'il n'efface pas l'ancien et à la fin il se superposent tous...

    J'ai bien essayé la fonction delete(item) mais je ne comprend pas comment elle marche

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Points : 257
    Points
    257
    Par défaut
    Bonjour,

    Pour l'interraction entre le clavier et les widgets (ou fonctions), voici le lien de la documentation de developpez :
    http://python.developpez.com/faq/?page=TkKeyEvent

    Pour le temps, j'aurai fait un thread qui ferrait une boucle "while" au lancement de la simulation et qui incrémenterai une variable et il suffirait juste d'afficher cette valeur dans un emplacement de texte.

    Pour le problème de superposition, je ne suis pas un pro en TKinter, je suis plutôt callé PyGTK ^^ donc je ne pourrai pas vous aider plus.

    Bon courage tout de même

    Cordialement...

    Mickael

Discussions similaires

  1. affichage dynamique d'une trajectoire
    Par Pcoquill dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 09/10/2010, 09h48
  2. Réponses: 2
    Dernier message: 29/11/2006, 15h42
  3. Affichage dynamique d'une valeur calculée
    Par harley dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/06/2006, 09h20
  4. [Tableaux] Ajouter l'affichage dynamique d'une image
    Par leloup84 dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 09h14
  5. Problème d'affichage dynamique d'une liste
    Par bor1s dans le forum ASP
    Réponses: 2
    Dernier message: 18/11/2005, 16h18

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