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

Exercices Python Discussion :

2 affichages successifs d'un widget, le premier ne s'exécute pas


Sujet :

Exercices Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 88
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Par défaut 2 affichages successifs d'un widget, le premier ne s'exécute pas
    21/12/2021
    2 déplacements successifs d'un widget dans une fonction <move>
    seul le second déplacement est exécuté,
    si l'on supprime le second, le premier est exécuté
    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
    from tkinter import *
    import time 
     
    def move() :
        global x,y, r,flag       
        x = 100
        y = 100        
        print('B/ affichage balle 100,100')
        can.coords(balle,(x-r),(y-r),(x+r), (y+r))     #ne donne lieu à aucun affichage
        time.sleep(2)                                           # attente 2 secondes
     
        x = 150
        y = 150        
        print('C/ affichage balle 150,150')
        can.coords(balle,(x-r),(y-r),(x+r), (y+r))        #seul celui-ci est pris en compte
     
        if flag > 0 :
            fen.after(delai, move)
     
    def start() :
        global flag, start
        if flag == 0 :  #arrêt
            flag = 1     #marche
            move()    
     
    def stop() :
        global flag, start
        flag = 0
     
    #************main*******************   
    fen = Tk()
    fen.title = '8.17 deplacement d\'une balle'
     
    #********paramètres*************
    l_can, h_can = 200, 200       # dimensions canevas
    x, y = 50,50
    delai = 1000                   #ms entre 2 déplacements
    r = 14                        # rayon de balle 
    flag = 0
     
    can = Canvas(fen, height = h_can, width = l_can, bg = 'green')
    can.grid(row = 0,columnspan = 2)
     
    print(x-r,y-r, x+r, y-r)
    balle = can.create_oval(x-r,y-r, x+r, y+r, fill  = 'yellow')
     
    bt = Button(fen, text = 'start', bg = 'yellow', command = start)
    bt.grid(row =1, column = 0)
    bt1 = Button(fen, text = 'Stop',  bg = 'red', command = stop)
    bt1.grid(row =1, column = 1)

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Bonjour sinon.

    Pourriez mettre votre code entre ## à l'aide de l'icône dans la fenêtre d'édition ?

  3. #3
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 88
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Par défaut je vois bien [CODE][/CODE] en début et fin
    lorsque je me mets en mode modification de message , je vois bien en début et fin

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 747
    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 747
    Par défaut
    Citation Envoyé par Cerisier Voir le message
    2 déplacements successifs d'un widget dans une fonction <move>
    seul le second déplacement est exécuté,
    Vous ne déplacez pas un widget mais des items d'un Canvas.
    Pour le reste, il est interdit de planter un time.sleep dans un callback (qui est appelé par tkinter et supposé retourner le plus rapidement possible). Car les modifications demandées ne seront effectuées que lorsque tkinter aura repris le contrôle (fin du callback/fonction) => dans la pratique vous n'allez voir que le dernier dépalcement.

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

  5. #5
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 88
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Par défaut déplacements successifs
    Mes remerciements pour votre réponse
    Bien qu'ancien informaticien (Cobol, VBA de Access), et assez âgé, j'ai voulu m'initier à Python au moyen du livre de Swinnen. Celà m'intéresse beaucoup mais j'ai tout de même du mal

    Dans mon exemple la fonction <move>(ce que vous appelez le callback) est appelée par le bouton Start puis par le fen.after
    J'avais mis un time.sleep pour donner le temps à la balle de se positionner en deuxième position (100, 100)
    Je l'ai supprimé mais le problème demeure.
    Je ne comprends pas votre phrase "Car les modifications demandées ne seront effectuées que lorsque tkinter aura repris le contrôle (fin du callback/fonction)"
    J'observe que l'instruction "print('B/ affichage balle 100,100')" dans la fonction <move> est bien exécutée, alors pourquoi la suivante ne l'est pas ?

    Peut être pouvez vous me conseiller d'autres supports de formation
    Je vous remercie

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 747
    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 747
    Par défaut
    Citation Envoyé par Cerisier Voir le message
    Je ne comprends pas votre phrase "Car les modifications demandées ne seront effectuées que lorsque tkinter aura repris le contrôle (fin du callback/fonction)"
    J'observe que l'instruction "print('B/ affichage balle 100,100')" dans la fonction <move> est bien exécutée, alors pourquoi la suivante ne l'est pas ?
    Elle est exécutée mais si on dit bouge la balle en 100, 100 puis bouge la balle en 150, 150 avec ou sans time.sleep entre les deux, tkinter enregistre la requête dans une file d'évènements (à traiter) qu'il traitera après la fin du callback.
    Dans le meilleur des cas, les deux déplacements seront tellement rapides que vous ne les verrez pas, dans le pire, tkinter ne fera que le dernier (puisque le premier ne sert à rien).

    Citation Envoyé par Cerisier Voir le message
    j'ai voulu m'initier à Python au moyen du livre de Swinnen. Celà m'intéresse beaucoup mais j'ai tout de même du mal
    J'ai bien vu que vous avez recopié et bricolé l'exemple donné dans le chapitre des animations sur tkinter. La programmation évènementielle n'y est pas si mal expliquée mais si vous n'avez jamais vu de genre de programmation, ça décoiffe.

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

  7. #7
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 88
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Par défaut déplacements successifs
    Que me conseillez vous donc pour avoir 2 affichages successifs ?
    merci

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 747
    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 747
    Par défaut
    Citation Envoyé par Cerisier Voir le message
    Que me conseillez vous donc pour avoir 2 affichages successifs ?
    merci
    Vous devriez commencer par contrôler les déplacements via un clic de Button (l'automatiser via .after en 2ème étape).
    Ce qui veut dire un callback/fonction on_click appelé à chaque fois.

    Après, si l'item est en A il va falloir le faire aller en B et réciproquement.
    note: on pourrait aussi avoir 2 items en A et B et masquer celui qu'on ne veut pas voir... mais on a toujours à gérer la bascule.

    Et la gestion de la bascule se fera via une variable globale ou l'état de l'item à vous de choisir.
    note: dans le Swinnen vous avez un exercice avec des feux rouges à faire basculer... C'est un peu la même chose.

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

Discussions similaires

  1. Affichage successif d'éléments
    Par mlihawi dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 14/03/2021, 10h40
  2. Affichage page html sur widget
    Par lerbofiwol dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 09/06/2017, 10h01
  3. Affichage successif d'images puis disparition [Résolu]
    Par ndubau dans le forum Powerpoint
    Réponses: 0
    Dernier message: 06/10/2014, 09h52
  4. Affichages successifs d' aperçus Etat
    Par gbzmt dans le forum IHM
    Réponses: 4
    Dernier message: 28/03/2008, 13h51
  5. Prb affichage de "¬" dans un widget text
    Par Eileen dans le forum Tkinter
    Réponses: 2
    Dernier message: 03/06/2007, 07h14

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