2010-03-08 2 views
54

Мне нужно закодировать программу с помощью библиотеки tkinter от Python.Как создать таймер с помощью tkinter?

Моя главная проблема заключается в том, что я не знаю, как создать таймер или часы как hh:mm:ss.

Мне нужно его обновить (это то, что я не знаю, как это сделать).

+2

Вот [пример кода о том, как использовать 'root.after()' для реализации таймера.] (Https://gist.github.com/zed/5440b9372a15d86b5c47) – jfs

ответ

83

У корневых окон Tkinter есть метод, называемый after, который может использоваться для планирования функции, вызываемой по истечении заданного периода времени. Если сама эта функция вызывает after, вы настроили автоматически повторяющееся событие.

Вот рабочий пример:

# 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() 

Имейте в виду, что after не гарантирует функции будет работать точно вовремя. Это только расписание задание, которое должно выполняться через определенное количество времени. Это приложение занято, может быть задержка до того, как он будет вызван, поскольку Tkinter является однопоточным. Задержка обычно измеряется в микросекундах.

+0

Не будет рекурсивные вызовы сами по себе вызывают ошибку «максимальные рекурсии для объекта python»? –

+0

@SatwikPasani: нет, потому что это не рекурсивный звонок. Он просто ставит работу в очередь. –

7

Пример использования Python3 с использованием frame.after(), а не приложения верхнего уровня. Также показывает обновление этикетки с 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() 
+0

Это хороший ответ, с одной важной вещью - отображаемое время - это действительно системное время, а не некоторое накопленное время ошибки (если вы ждете «около 1000 мс» 60 раз, вы получаете «около минуты», а не 60 секунд, и ошибка растет со временем). Тем не менее - ваши часы могут пропускать секунды на дисплее - вы можете накапливать второстепенные ошибки, а затем, например, пропустите 2 с вперед. Я бы предложил: 'self.after (1000 - int (1000 * (time.time() - int (time.time()))) или 1000, self.onUpdate)'. Вероятно, лучше сохранить 'time.time()' переменной до этого выражения. –

+1

Я стремлюсь быть достаточно классным, чтобы вставлять xkcd в мои комментарии :) – bitsmack

1

Я просто создал простой таймер, используя шаблон MVP (однако это может быть избыточно для этого простого проекта). Он выключился, запустил/приостановил и остановил кнопку. Время отображается в формате HH: MM: SS. Счет времени выполняется с использованием потока, который выполняется несколько раз в секунду, и разницы между временем начала таймера и текущим временем.

Source code on github

1
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() 
+1

Было бы полезно, если бы вы могли добавить описание. Просто копировать/вставлять код редко полезно ;-) – Carpetsmoker

+0

Этот код дает точное время locality.it также служит в качестве таймера. –

Смежные вопросы