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 :

Lancement d'un chronomètre avec un bouton [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Lancement d'un chronomètre avec un bouton
    Bonsoir,

    Je suis en train de faire un jeu de voiture pour mon projet d'ISN et je souhaite que lorsque j'appuie sur le bouton démarrer, un chronomètre se lance.

    J'explique mon problème : je lance mon programme, et lorsque j'appuie sur le bouton démarrer le chronomètre ne démarre pas de 0, en fait mon chrono se lance au démarrage du programme et je ne comprends pas pourquoi... Le bouton pause n'arrête pas non plus ce chrono

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    from tkinter import *
    from timeit import default_timer
     
     
    def start():
        chrono()
        deplacement()
     
     
    def chrono():
        now = default_timer() - start
        minutes, seconds = divmod(now, 60)
        hours, minutes = divmod(minutes, 60)
        str_time = '%d:%02d:%02d' % (hours, minutes, seconds)
        canvas.itemconfigure(text_clock, text=str_time)
        fenetre.after(1000,chrono)
     
     
    #DEPLACEMENT DES OBSTACLES
    def deplacement():
        global yobstacle,id_after
     
        yobstacle += 5
        canvas.coords(obstacle,640,yobstacle)
     
        if yobstacle == 880:
            yobstacle = 0
     
        # Appel récursif de la fonction deplacement
        id_after = canvas.after(100,deplacement)
     
     
    #DEPLACER LA VOITURE
    def touche_pressee(event):
        global x,y
     
        #DEPLACEMENT LORSQU'ON EST SUR LA VOIE DU MILIEU
        if 540<x<740 and event.keysym == 'Left':
            x -= 190
            y == 650
        if 540<x<740 and event.keysym == 'Right':
            x += 190
            y == 650
        #DEPLACEMENT LORSQU'ON EST SUR LA VOIE DE GAUCHE
        if 340<x<539 and event.keysym == 'Left':
            x += 0
            y == 650
        if 340<x<539 and event.keysym == 'Right':
            x += 190
            y == 650
        #DEPLACEMENT LORSQU'ON EST SUR LA VOIE DE DROITE
        if 741<x<940 and event.keysym == 'Left':
            x -= 190
            y == 650
        if 741<x<940 and event.keysym == 'Right':
            x += 0
            y == 650
     
        canvas.coords(voiture,x,y)
     
     
    #METTRE LE JEU EN PAUSE
    def stop():
        global id_after
        canvas.after_cancel(id_after)
     
     
    # =============================================================================
    # PROGRAMME PRINCIPAL
    # =============================================================================
     
    # Initialisation des variables de la voiture déplacement
    x,y = 670,650
     
    xobstacle, yobstacle = 640,0
     
    fenetre = Tk()
    fenetre.title("Champion's race")
     
     
    # Création du canvas
    canvas = Canvas(fenetre,height=720,width=1280)
    canvas.pack()
     
     
    # Chargement de l'image de fond
    photo_fond = PhotoImage(file='fond.gif')
    canvas.create_image(640,360,image=photo_fond)
     
     
    # Affichage de la voiture
    photo_voiture = PhotoImage(file='voiturejaune.gif')
    voiture = canvas.create_image(670,650,image=photo_voiture)
     
     
    # Affichage du logo du jeu
    photo_logo = PhotoImage(file='TEXTE.gif')
    canvas.create_image(1140,100,image=photo_logo)
     
     
    # Affichage des obstacles
    #OBSTACLE 1
    photo_obstacle = PhotoImage(file='obstacle.gif')
    obstacle = canvas.create_image(640,360,image=photo_obstacle)
     
     
    # Création du bouton démarrer
    bouton_démarrer = Button(fenetre,text='Démarrer',command=start)
    bouton_démarrer.pack(side=LEFT)
     
     
    # Création du bouton pause
    bouton_stop = Button(fenetre,text='Pause',command=stop)
    bouton_stop.pack()
     
     
    # Création du bouton quitter
    bouton_quitter = Button(fenetre,text='Quitter',command=fenetre.destroy)
    bouton_quitter.pack(side=RIGHT)
     
     
    # Affichage du score (temps)
    start = default_timer()
    text_clock = canvas.create_text(1125,180,width=200,fill="white",font=("Arial",40))
     
     
    # Gestion des touches enfoncées
    fenetre.bind('<Key>',touche_pressee)
     
     
    fenetre.mainloop()
    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Salut,

    Citation Envoyé par jaylow57 Voir le message
    J'explique mon problème : je lance mon programme, et lorsque j'appuie sur le bouton démarrer le chronomètre ne démarre pas de 0, en fait mon chrono se lance au démarrage du programme et je ne comprends pas pourquoi... Le bouton pause n'arrête pas non plus ce chrono
    Dans un premier temps, vous vous concentrez sur cette histoire de chrono en supprimant tout ce qui n'a rien à voir avec: çà fait moins de lignes de code à relire, à comprendre... et il sera plus facile pour ceux qui voudraient vous aider de reproduire/comprendre le problème.

    Puis vous inspectez vos lignes de code: le chrono affiche now calculé via default_timer() - start et vous cherchez comment est initialisé start.

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Désolé, c'est mon premier post sur un forum de développement, voici le code uniquement en rapport avec le chrono :
    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
     
    from tkinter import *
    from timeit import default_timer
     
     
    def start():
        chrono()
        deplacement()
     
     
    def chrono():
        now = default_timer() - start
        minutes, seconds = divmod(now, 60)
        hours, minutes = divmod(minutes, 60)
        str_time = '%d:%02d:%02d' % (hours, minutes, seconds)
        canvas.itemconfigure(text_clock, text=str_time)
        fenetre.after(1000,chrono)
     
     
    #METTRE LE JEU EN PAUSE
    def stop():
        global id_after
        canvas.after_cancel(id_after)
     
     
    # =============================================================================
    # PROGRAMME PRINCIPAL
    # =============================================================================
     
    fenetre = Tk()
    fenetre.title("Champion's race")
     
     
    # Création du canvas
    canvas = Canvas(fenetre,height=720,width=1280)
    canvas.pack()
     
     
    # Création du bouton démarrer
    bouton_démarrer = Button(fenetre,text='Démarrer',command=start)
    bouton_démarrer.pack(side=LEFT)
     
     
    # Création du bouton pause
    bouton_stop = Button(fenetre,text='Pause',command=stop)
    bouton_stop.pack()
     
     
    # Création du bouton quitter
    bouton_quitter = Button(fenetre,text='Quitter',command=fenetre.destroy)
    bouton_quitter.pack(side=RIGHT)
     
     
    # Affichage du score (temps)
    start = default_timer()
    text_clock = canvas.create_text(1125,180,width=200,fill="white",font=("Arial",40))
     
     
    fenetre.mainloop()
    Le problème est-il donc l'emplacement de la variable start dans le programme?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Citation Envoyé par jaylow57 Voir le message
    Le problème est-il donc l'emplacement de la variable start dans le programme?
    Si vous dites "en fait mon chrono se lance au démarrage du programme et je ne comprends pas pourquoi..." ou "lorsque j'appuie sur le bouton démarrer le chronomètre ne démarre pas de 0", d'une façon ou d'une autre, vous allez le retrouver dans le code que vous avez écrit.

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

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai bien compris, c'est le principe pour trouver et régler un problème mais la je bloque. La variable start est dans la boucle mainloop et donc le chrono est lancé au moment de lancer le prog mais quand j'utilise un if bouton_démarrer.click == True, ça ne résout pas le problème et lorsque je met la variable dans le def chrono() non plus...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Salut,

    Citation Envoyé par jaylow57 Voir le message
    ça ne résout pas le problème et lorsque je met la variable dans le def chrono() non plus...
    Si vous voulez initialiser votre variable lorsqu'on clique sur le Button, il faut le faire dans la fonction appelée par ce Button lorsqu'on y clique dessus: logique, non?
    Et je ne comprends pas la logique des bricolages que vous essayez (sans les montrer).

    De plus, ce n'est pas une bonne idée d'avoir une fonction "start" et une variable "start"... : Python prendra la dernière définition (pas ce que vous pensez).

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

  7. #7
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai modifié l'appellation de la définition (la variables s'appelle start et la définition demarrer), mais je vous ai déjà expliqué que même en mettant la variable start dans la def liée au bouton, cela ne règle toujours pas le problème... J'suis désolé, c'est peut être tout simple mais je suis débutant dans le domaine.

    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
    from tkinter import *
    from timeit import default_timer
     
     
    def demarrer():
        chrono()
        deplacement()
     
     
    def chrono():
        start = default_timer()
        text_clock = canvas.create_text(1125,180,width=200,fill="white",font=("Arial",40))
        now = default_timer() - start
        minutes, seconds = divmod(now, 60)
        hours, minutes = divmod(minutes, 60)
        str_time = '%d:%02d:%02d' % (hours, minutes, seconds)
        canvas.itemconfigure(text_clock, text=str_time)
        fenetre.after(1000,chrono)
     
    #METTRE LE JEU EN PAUSE
    def stop():
        global id_after
        canvas.after_cancel(id_after)
     
     
    # =============================================================================
    # PROGRAMME PRINCIPAL
    # =============================================================================
     
    fenetre = Tk()
     
     
    # Création du canvas
    canvas = Canvas(fenetre,height=720,width=1280)
    canvas.pack()
     
     
    # Création du bouton démarrer
    bouton_démarrer = Button(fenetre,text='Démarrer',command=demarrer)
    bouton_démarrer.pack(side=LEFT)
     
     
    # Création du bouton pause
    bouton_stop = Button(fenetre,text='Pause',command=stop)
    bouton_stop.pack()
     
     
    # Création du bouton quitter
    bouton_quitter = Button(fenetre,text='Quitter',command=fenetre.destroy)
    bouton_quitter.pack(side=RIGHT)
     
     
    fenetre.mainloop()

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 240
    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 240
    Points : 36 696
    Points
    36 696
    Par défaut
    Citation Envoyé par jaylow57 Voir le message
    mais je vous ai déjà expliqué que même en mettant la variable start dans la def liée au bouton, cela ne règle toujours pas le problème...
    ok, moi dans le code que vous avez posté, je lis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def chrono():
        start = default_timer()
        text_clock = canvas.create_text(1125,180,width=200,fill="white",font=("Arial",40))
        now = default_timer() - start
        minutes, seconds = divmod(now, 60)
        hours, minutes = divmod(minutes, 60)
        str_time = '%d:%02d:%02d' % (hours, minutes, seconds)
        canvas.itemconfigure(text_clock, text=str_time)
        fenetre.after(1000,chrono)
    Si à chaque appel à chrono vous réinitialisez "start", vous devriez voir s'afficher 0 et je ne comprend pas pourquoi vous recréez text_clock à chaque fois.
    De plus "chrono" n'est pas la fonction appelée lorsqu'on clique sur le Button, c'est demarrer qui est appelé (et c'est là qu'il faut initialiser start...).

    Citation Envoyé par jaylow57 Voir le message
    J'suis désolé, c'est peut être tout simple mais je suis débutant dans le domaine.
    Dans le code Python que vous avez posté initialement, vous maîtrisez(*) toutes les constructions utiles pour faire fonctionner cela...
    (*) si c'est vous qui avez écrit le code...

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

  9. #9
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Je vous remercie de votre aide, c'était donc simple, j'ai mis comme vous m'avez dit la variable start dans la définition liée au bouton, j'ai quand même mis start=0 pour créer la variable. Quant au text_clock je l'ai laissé dans le programme principal.

    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
    from tkinter import *
    from timeit import default_timer
    from random import choice
     
    def start():
        start = default_timer()
        chrono()
     
    def chrono():
        now = default_timer() - start
        minutes, seconds = divmod(now, 60)
        hours, minutes = divmod(minutes, 60)
        str_time = '%d:%02d:%02d' % (hours, minutes, seconds)
        canvas.itemconfigure(text_clock, text=str_time)
        fenetre.after(1000,chrono)
     
    #METTRE LE JEU EN PAUSE
    def stop():
        global id_after
     
        canvas.after_cancel(id_after)
     
    # =============================================================================
    # PROGRAMME PRINCIPAL
    # =============================================================================
     
    fenetre = Tk()
     
    # Création du canvas
    canvas = Canvas(fenetre,height=720,width=1280)
    canvas.pack()
     
    # Création du bouton démarrer
    bouton_démarrer = Button(fenetre,text='Démarrer!',activebackground = 'light blue',command=start)
    bouton_démarrer.pack(side=LEFT)
     
     
    # Création du bouton pause
    bouton_stop = Button(fenetre,text='Pause',command=stop)
    bouton_stop.pack()
     
    # Affichage du score (temps)
    text_clock = canvas.create_text(1125,180,width=200,fill="white",font=("Arial",40))
    start = 0
     
    fenetre.mainloop()

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

Discussions similaires

  1. Lancement d'une partie du script avec un bouton
    Par arnest dans le forum QlikView
    Réponses: 2
    Dernier message: 31/05/2016, 10h36
  2. [Débutant] Lancement d'une fonction avec un bouton poussoir
    Par michelmich dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 09/10/2015, 10h27
  3. Lancement d'une page web avec un bouton
    Par Elandril dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 14/03/2006, 22h08
  4. [VB.NET] Pb avec le bouton Annuler d'1 barre de progression
    Par dada1982 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/06/2004, 10h56
  5. Réponses: 10
    Dernier message: 10/06/2004, 17h20

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