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 :

Probleme sur mon programme


Sujet :

Tkinter Python

Vue hybride

Antoine Dess Probleme sur mon programme 25/04/2018, 16h42
wiztricks Salut, Votre soucis est... 25/04/2018, 17h53
Antoine Dess Merci wiztricks de votre... 26/04/2018, 15h37
wiztricks Salut, Ça marchait... 26/04/2018, 18h40
Antoine Dess Bonjour, Merci de votre... 26/04/2018, 22h14
Antoine Dess Bonjour, Une dernière... 01/05/2018, 16h45
wiztricks C'est toujours une histoire... 01/05/2018, 17h04
Antoine Dess Bonjour, J'ai un problème... 02/05/2018, 11h31
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut Probleme sur mon programme
    Bonjour a tous,

    Je suis un débutant dans le monde de la programmation et je dois rendre un programme que j'ai crée de A à Z.
    Il s’agit d'une version très simplifiée du jeu tracks and field et j'ai trois problèmes:
    -Premièrement, je ne comprends pas pourquoi mon j1 et mon pnj3 clignotent lorsqu'ils bougent;
    -Ensuit, je ne comprends pas non plus pourquoi lorsque je demande à mon personnage bleu de bouger ses jambes tous les personnages bougent la leur
    -Enfin pourquoi la jambe bouge de manière désordonnée depuis qua j'ai ajouté les 3 pnjs alors qu’avant elle suivait un mouvement "normal" c'est a dire qu'elle faisait des allers retours et non ce grand écart

    Merci d'avance
    Antoine
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

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

    Votre soucis est que vous empilez des figures avec des délais (time.sleep) entre chaque mise à jour (via .update).
    Votre programme fait en gros ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import tkinter as tk
    import time
    canvas = tk.Canvas()
    canvas.pack()
    while True:
        canvas.create_rectangle(0, 0, 600, 600, fill='grey')
        canvas.update()
        time.sleep(0.1)
     
        canvas.create_rectangle(100, 100, 200, 200, fill='blue')
        canvas.update()
        time.sleep(0.1)
    Imaginez qu'on exécute ces instructions une deuxième fois. Le rectangle gris va s'afficher au dessus des différents rectangles créés à l'étape 1. Ca attend un peu avant de créer le petit rectangle bleu.... Et vous voyez le rectangle bleu qui clignote.

    Le premier soucis est donc la cascade de canvas.update()/time.sleep(0.1) qui donnent l'impression que... Il serait préférable qu'il n'y en ait qu'un à chaque itération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import tkinter as tk
    import time
    canvas = tk.Canvas()
    canvas.pack()
    while True:
        canvas.create_rectangle(0, 0, 600, 600, fill='grey')
        canvas.create_rectangle(100, 100, 200, 200, fill='blue')
     
        canvas.update()
        time.sleep(0.1)
    i.e. on fait les changements, on les affiche (via .update) et on attend un peu avant le tour suivant.

    Le deuxième soucis est qu'à chaque itération vous créez de nouveaux objets sans détruire les anciens (il serait bien meilleur d'apprendre à les modifier!!!)... A ce rythme, au bout d'un certain temps vous aller excéder la capacité de la mémoire, le disque va se mettre à tourner et çà va ramer grave...

    Dernier soucis mais non le moindre c'est que si votre programme marchotte, c'est parce que vous utilisez sans les comprendre des fonctionnalités plutôt avancées de tkinter. Il faut apprendre les bases avant!!

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

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    Merci wiztricks de votre réponse,

    Pour la première parti c'est bon ils ne clignotent plus,
    Pour la deuxième pouvez vous m'aider à modifier et à détruire les anciennes commande ou m'expliquer ce qu'il me manque pour que je le fasse moi même ?
    Pour la troisième partie je vous ai mit en pièce jointe le programme de commande du joueur bleu avant l'ajout des rouges et il marche comme je le voulais c'est piur cela que je ne comprends pas le problème qui est apparu entre le programme quand les cubes rouges ne s'affichaient pas et quand ils s'affichent.

    Ps: j'ai aussi remis le programme "complet" en pièce jointe avec les diverses modification qu j'ai effectué
    Fichiers attachés Fichiers attachés

  4. #4
    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 Antoine Dess Voir le message
    il marche comme je le voulais c'est pour cela que je ne comprends pas le problème qui est apparu entre le programme quand les cubes rouges ne s'affichaient pas et quand ils s'affichent.
    Ça marchait avant... et comme, vous avez oublié de recopier l'instruction magique sur laquelle repose votre château de cartes.... Patatras, tout est cassé.

    Le code ci dessous utilise des fonctionnalités à connaître pour réaliser vos animations (sans vous appuyer sur des "class").
    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
    import tkinter as tk
    import time
     
    def create_figure(canvas, x, y):
        size = 40
        ccr = canvas.create_rectangle
        ccr(x, y, x+size, y+size, fill='red', tag=('figure', 'body'))
        y0 = y + size + 5
        x0 = x
        ccr(x0, y0, x0+15, y0+10, fill='red', tag=('figure', 'legs1'))
        ccr(x0+5, y0, x0+20, y0+10, fill='red', tag=('figure', 'legs2'))
        x0 = x+25
        ccr(x0, y0, x0+15, y0+10, fill='red', tag=('figure', 'legs1'))
        ccr(x0-5, y0, x0+10, y0+10, fill='red', tag=('figure', 'legs2'))
     
    done = False
    def set_done():
        global done
        done = True
     
    root = tk.Tk()
    canvas = tk.Canvas(root)
    canvas.pack()
     
    for x, y in ((10, 10), (45, 80), (55, 0)):
        create_figure(canvas, x, y)
     
    tk.Button(root, text='quit', command=set_done).pack()
     
    count = 0
    legs_state = False
    while not done:
        if count % 2:
            i1, i2 = (1, 2) if legs_state else (2, 1)
            canvas.itemconfigure('legs%d' % i1, state='hidden')
            canvas.itemconfigure('legs%d' % i2, state='normal')
            legs_state = not legs_state
     
        canvas.move('figure', 2, 2)
        count = (count + 1) % 4
        root.update()
        time.sleep(0.2)
    çà bouge les jambes une itération sur 2 parce (que je trouve) qu'elles s'affolent sinon.

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

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    Bonjour,

    Merci de votre aide c'est bon j'ai réussi a régler mes 3 problèmes.
    Juste une dernière question savez-vous comment faire pour que lorsque l'événement tomber se réalise les jambes de mon personnage se déplacent?
    Je veux dire ou dois-je placer ma commande (dans le while ou dans la définition de l’événement) et quelle commande je dois placer (if, for....)

    Merci d'avance

  6. #6
    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 Antoine Dess Voir le message
    Je veux dire ou dois-je placer ma commande (dans le while ou dans la définition de l’événement) et quelle commande je dois placer (if, for....)
    Ce que j'en ai compris estque "tomber" est la fin de partie. Donc il faut que çà provoque la sortie du while... pour se mettre dans un état où çà attend "rejouer" ou "quitter".

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

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    Bonjour,

    Une dernière question je ne sais pas si c'est possible a mon niveau mais est il possible que quand mon personnage bleu avance et déplace l'image cela ne déplace pas les personnages rouges

  8. #8
    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
    Citation Envoyé par Antoine Dess Voir le message
    est il possible que quand mon personnage bleu avance et déplace l'image cela ne déplace pas les personnages rouges
    C'est toujours une histoire de catégories: ici, il faut faire la différence entre les éléments qui avancent et ceux qui ne bougent pas.
    Dans votre cas, faire des catégories commence par regrouper des choses dans, par exemple, une liste pour... appliquer un traitement ad hoc à tous ses éléments - qui devient collection de... -.
    Et donc on se retrouve dans le même bazar, comment représenter le fond et les différents personnages.
    Si vous partez sur "on efface tout et on redessine tout", un personnage pourrait être une couleur et une position à partir de laquelle, on sait le redessiner après avoir modifié (ou pas) la position.
    Une représentation "basique" pourrait être une liste de listes: chaque liste représentant un personnage (couleur, position). A partir de là on essayer de traduire "bouger les bleus" en modifiant la position des "bleus" puis en redessinant tout ce qu'il y a dans la liste de listes (et traiter le fond "à par" - il n'y en a qu'un et il faut le placer en dessous, donc le (re-)créer en premier)
    Ca donnerait (par exemple) un code comme çà:
    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
    import tkinter as tk
    import time
     
    figures = []
    def create_personnage(canvas, x, y, color='red', legs=0):
        personnage = [ x, y, color, legs ]    
        size = 40
        ccr = canvas.create_rectangle
        ccr(x, y, x+size, y+size, fill=color)
        y0 = y + size + 5
        x0 = x
        if legs % 2:
            ccr(x0, y0, x0+15, y0+10, fill=color)
        else:
            ccr(x0+5, y0, x0+20, y0+10, fill=color)
        x0 = x+25
        if legs % 2:
            ccr(x0, y0, x0+15, y0+10, fill=color)
        else:
            ccr(x0-5, y0, x0+10, y0+10, fill=color)
        return personnage
     
    done = False
    def set_done():
        global done
        done = True
     
    def figures_move(canvas, colors):
        for ix, personnage in enumerate(figures):
            x, y, color, legs = personnage
            if color in colors:
                x += 2
                y += 2
                legs = (legs + 1) % 4
                p = create_personnage(canvas, x, y, color, legs)
                figures[ix] = p # on mémorise la nouvelle position, état.
            else: # on fait du surplace.
                create_personnage(canvas, x, y, color, legs)
     
    root = tk.Tk()
    canvas = tk.Canvas(root)
    canvas.pack()
     
    for x, y in ((10, 10), (45, 80)):
        figures.append(create_personnage(canvas, x, y))
    figures.append(create_personnage(canvas, 55, 0, color='blue'))
     
    colors = ['blue', 'red']
    def do_toggle():
        if 'blue' in colors:
            colors.remove('blue')
        else:
            colors.append('blue')
    tk.Button(root, text='toggle', command=do_toggle).pack()
    tk.Button(root, text='quit', command=set_done).pack()
     
    while not done:
        canvas.delete('all')
        figures_move(canvas, colors)
        root.update()
        time.sleep(0.2)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    Bonjour,

    J'ai un problème avec le programme que vous me passez car je travaille avec from tkinter import, et vous me passez des import tkinter as tk. Je me suis renseigné et cela est pareil à ceci près qu'il faut changer les noms des objets que nous créons or cela m’empêche de comprendre ce que je peux modifier car a cause de ses problèmes de noms je ne peux pas récupérer des bouts de votre programme pour voir ce que cela pourrai changer.

    Autre problème le personnage bleu fait avancer l'image avec lui pour qu'il soit toujours "centré" or sur l'exemple que vous m'avez passé le personnage bleu avance de la même façon que les rouges tant qu'on ne l’arrête pas .

  10. #10
    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
    Citation Envoyé par Antoine Dess Voir le message
    cela m’empêche de comprendre ce que je peux modifier car a cause de ses problèmes de noms je ne peux pas récupérer des bouts de votre programme pour voir ce que cela pourrai changer.
    Vous devez comprendre avant de ré-utiliser pas juste vous contenter de recopier.
    D'autant qu'il n'est pas si compliqué de faire "from tkinter import *" et virer tous les "tk.".

    Citation Envoyé par Antoine Dess Voir le message
    Autre problème le personnage bleu fait avancer l'image avec lui pour qu'il soit toujours "centré" or sur l'exemple que vous m'avez passé le personnage bleu avance de la même façon que les rouges tant qu'on ne l’arrête pas .
    Idem: çà vous montre comment faire des catégories de personnages avec des listes et çà illustre comment on peut stopper/redémarrer une catégorie. A vous de comprendre comment c'est construit pour l'adapter à votre code.

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

Discussions similaires

  1. probleme sur mon programme
    Par chloecc1991 dans le forum Débuter
    Réponses: 3
    Dernier message: 21/10/2011, 14h43
  2. [TP] Problème avec mon programme de conversion
    Par Panzer95 dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 28/05/2006, 18h36
  3. avie et probleme sur mon site
    Par coucou449 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/12/2005, 09h34
  4. [FLASH MX] Probleme sur mon site....!!
    Par thewill dans le forum Flash
    Réponses: 2
    Dernier message: 07/04/2005, 12h11

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