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

Tkinter Python Discussion :

tracé en animations


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Décembre 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2011
    Messages : 47
    Par défaut tracé en animations
    je cherche à tracer deux droites en animation: d'abord l'une puis l'autre. Mais seule la deuxième ligne est tracée. Si je supprime le tracé de la deuxième, il trace bien la première. Impossible de tracer d'abord la première, puis la seconde et d'obtenir deux droites parallèles.
    Merci de votre aide.

    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
    from tkinter import *
    ''' tracer deux lignes horizontales parallèles en animation'''
    def anim1():
        global xo,yo,x1,y1,x2,y2,dx,dy,flag
        x1=x1+dx                                    
        if x1>x2:flag=0
        y1=y1+dy
        if y1>y2:flag=0
        can1.create_line(xo,yo,x1,y1)
        if flag>0:
            fen1.after(10,anim1)                            
     
    fen1=Tk()                                         # creation du widget principal
    fen1.title("essai d'animation")
    can1=Canvas(fen1,bg='ivory',height=600,width=800) # widget enfant
    can1.pack(side=LEFT)
     
    # première ligne
    xo,yo=10,10                                      # coordonnées de l'origine
    x1,y1=10,10                                      # coordonnées intermédiaires
    x2,y2=400,100                                    # coordonnées du point à atteindre
    dx,dy,flag=5,0,1                                 # pas du déplacement et commutateur
    anim1()
     
    # deuxième ligne
    xo,yo=10,50
    x1,y1=10,50
    x2,y2=400,100
    dx,dy,flag=5,0,1    
    anim1()
     
    fen1.mainloop()

  2. #2
    Membre Expert 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
    Par défaut
    Bonjour,

    after() n'est pas bloquant pour l'interpréteur donc lorsque vous passez le premier anim1() et que vous sortez de la fonction Python continu à lire le code et vos valeurs (xo etc) sont remplacée par celles de la seconde ligne.
    Un simple input entre les deux bloque l'interpréteur (il attend votre entrée) et vous montre que .after() est 'indépendant', comprendre par là que c'est l'interpréteur tcl/tk qui gère les événements.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # première ligne
    xo,yo=10,10 # coordonnées de l'origine
    x1,y1=10,10 # coordonnées intermédiaires
    x2,y2=400,100 # coordonnées du point à atteindre
    dx,dy,flag=5,0,1 # pas du déplacement et commutateur
    anim1()
    #################### ici
    v = input()
    # deuxième ligne
    xo,yo=10,50
    x1,y1=10,50
    x2,y2=400,100
    dx,dy,flag=5,0,1
    anim1()
    vous devez attendre la fin d'une ligne pour commencer l'autre.

    @+

    Ps: Pensez à la balise code (# en haut au dessus du texte)

  3. #3
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Décembre 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2011
    Messages : 47
    Par défaut
    Non, je suis désolé, mais ça ne fonctionne pas. J'obtiens la même chose...

  4. #4
    Membre Expert 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
    Par défaut
    Bonjour,

    Citation Envoyé par develuc Voir le message
    Non, je suis désolé, mais ça ne fonctionne pas. J'obtiens la même chose...
    Sans doute du fait que je ne vous apporte pas une 'solution' mais une 'explication'. Pour la 'solution' j'attendais la votre.
    Pour l'explication voici quelques print pour essayer de vous rendre cela plus visuel.
    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
    from tkinter import *
     
    ''' tracer deux lignes horizontales parallèles en animation'''
    def anim1():
        global xo, yo, x1, y1, x2, y2, dx, dy, flag
        print(xo, yo, x1, y1) ########################## <
        x1 += dx
        if x1 > x2:
            flag = 0
        y1 += dy
        if y1 > y2:
            flag=0
        can1.create_line(xo, yo, x1, y1)
        if flag > 0:
            fen1.after(10, anim1)
     
    fen1=Tk() # creation du widget principal
    fen1.title("essai d'animation")
    can1=Canvas(fen1, bg='ivory', height=600, width=800) # widget enfant
    can1.pack(side=LEFT)
     
     
    # première ligne
    xo, yo = 10, 10 # coordonnées de l'origine
    x1, y1= 10, 10 # coordonnées intermédiaires
    x2, y2= 400, 100 # coordonnées du point à atteindre
    dx, dy, flag = 5, 0, 1 # pas du déplacement et commutateur
    anim1()
    print('new line') ########################################### <
    # deuxième ligne
    xo, yo = 10, 50
    x1, y1 = 10, 50
    x2, y2 = 400, 100
    dx, dy, flag = 5, 0, 1
    anim1()
    fen1.mainloop()
    Sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    10 10 10 10
    new line
    10 50 10 50
    10 50 15 50
    10 50 20 50
    10 50 25 50
    10 50 30 50
    ...
    A vous de comprendre avec ce qui est dit plus haut.

    Pour la solution, et il en existe pas mal, je pense que je passerais par une liste de liste (vos xo...) ou je traiterais chaque élément avant de le supprimer.

    @+

  5. #5
    Membre Expert 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
    Par défaut
    Re,

    Je parle de liste de liste pour un traitement séquentiel (Qui le sera de toute manière: Par séquentiel ici comprendre traiter ligne après ligne).
    Pour du 'simultané' je passerai par une instance de classe par ligne, ou même plus, une poller_routine avec une visit_method pour le tracé.

    @+

  6. #6
    Membre Expert 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
    Par défaut
    Bon, ok: C'est pas cool comme réponse mais je préfère un 'je ne comprend pas' à 'cela ne fonctionne pas'.

    Une réponse 'simple' à votre question sur base de liste:
    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
    from tkinter import *
     
    ''' tracer deux lignes horizontales parallèles en animation'''
    def anim1(l):
        l[2] += l[6]
        l[3] += l[7]
        can1.create_line(l[0], l[1], l[2], l[3])
        if l[2] < l[4] and l[3] < l[5]:
            fen1.after(10, lambda: anim1(l))
     
    fen1=Tk() # creation du widget principal
    fen1.title("essai d'animation")
    can1=Canvas(fen1, bg='ivory', height=600, width=800) # widget enfant
    can1.pack(side=LEFT)
    anim1([10, 10, 10, 10, 400, 100, 5, 0])
    anim1([10, 50, 10, 50, 400, 100, 5, 0])
    fen1.mainloop()
    @+ et bon 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
    from tkinter import *
     
    ''' tracer deux lignes horizontales parallèles en animation'''
    def anim1(l):
        l[2] += l[6]
        l[3] += l[7]
        can1.create_line(l[0], l[1], l[2], l[3])
        if l[2] < l[4] and l[3] < l[5]:
            fen1.after(10, lambda: anim1(l))
     
    fen1 = Tk()
    fen1.title("essai d'animation")
    can1 = Canvas(fen1, bg='ivory', height=600, width=800)
    can1.pack(side=LEFT)
    for l in ([10, 10, 10, 10, 400, 100, 5, 0], [10, 50, 10, 50, 400, 100, 5, 0]):
        anim1(l)
    fen1.mainloop()

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

Discussions similaires

  1. comment integer une animation swf dans une page
    Par naili dans le forum Intégration
    Réponses: 7
    Dernier message: 18/09/2002, 18h54
  2. Comment ne pas rejouer une animation après un clic ?
    Par mmmmhhh dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 04/09/2002, 16h11
  3. [Composants][Animation] Lire une vidéo compressée
    Par femtosa dans le forum Composants VCL
    Réponses: 6
    Dernier message: 03/09/2002, 08h03
  4. Rx Controls Gif animés
    Par toufou dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/08/2002, 14h09
  5. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59

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