web-dev-qa-db-fra.com

Comment créer une minuterie avec tkinter?

Je dois coder un programme avec la bibliothèque tkinter de Python.

Mon problème majeur est que je ne sais pas comment créer un timer ou un horloge comme hh:mm:ss.

J'en ai besoin pour me mettre à jour (c'est ce que je ne sais pas faire).

70
Diego Castro

Les fenêtres racine de Tkinter ont une méthode appelée after qui peut être utilisée pour planifier l’appel d’une fonction après une période donnée. Si cette fonction appelle elle-même after, vous avez configuré un événement automatiquement récurrent.

Voici un exemple de travail:

# for python 3.x use 'tkinter' rather than 'Tkinter'
import Tkinter as tk
import time

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(text="")
        self.label.pack()
        self.update_clock()
        self.root.mainloop()

    def update_clock(self):
        now = time.strftime("%H:%M:%S")
        self.label.configure(text=now)
        self.root.after(1000, self.update_clock)

app=App()

Gardez à l'esprit que after ne garantit pas que la fonction s'exécutera exactement à l'heure. Il ne fait que planifie le travail à exécuter après un laps de temps donné. Si l'application est occupée, il peut s'écouler un délai avant de l'appeler, car Tkinter est à thread unique. Le délai est généralement mesuré en microsecondes.

105
Bryan Oakley

Exemple d'horloge Python3 utilisant frame.after () plutôt que l'application de niveau supérieur. Montre également la mise à jour de l'étiquette avec un StringVar ()

#!/usr/bin/env python3

# Display UTC.
# started with https://docs.python.org/3.4/library/tkinter.html#module-tkinter

import tkinter as tk
import time

def current_iso8601():
    """Get current date and time in ISO8601"""
    # https://en.wikipedia.org/wiki/ISO_8601
    # https://xkcd.com/1179/
    return time.strftime("%Y%m%dT%H%M%SZ", time.gmtime())

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        self.now = tk.StringVar()
        self.time = tk.Label(self, font=('Helvetica', 24))
        self.time.pack(side="top")
        self.time["textvariable"] = self.now

        self.QUIT = tk.Button(self, text="QUIT", fg="red",
                                            command=root.destroy)
        self.QUIT.pack(side="bottom")

        # initial time display
        self.onUpdate()

    def onUpdate(self):
        # update displayed time
        self.now.set(current_iso8601())
        # schedule timer to call myself after 1 second
        self.after(1000, self.onUpdate)

root = tk.Tk()
app = Application(master=root)
root.mainloop()
10
David Poole
from tkinter import *
import time
tk=Tk()
def clock():
    t=time.strftime('%I:%M:%S',time.localtime())
    if t!='':
        label1.config(text=t,font='times 25')
    tk.after(100,clock)
label1=Label(tk,justify='center')
label1.pack()
clock()
tk.mainloop()
4
Ravikiran D

Je viens de créer une minuterie simple utilisant le modèle MVP (cependant, il peut être excessif pour ce projet simple). Il a quitté, démarrer/pause et un bouton d'arrêt. L'heure est affichée au format HH: MM: SS. Le comptage du temps est implémenté à l'aide d'un thread qui s'exécute plusieurs fois par seconde et de la différence entre l'heure de début du minuteur et l'heure actuelle.

Code source sur github

1
Herman Yanush