如何使用tkinter创建计时器?

时间:2010-03-08 09:16:35

标签: python user-interface tkinter

我需要使用Python的tkinter库编写程序。

我的主要问题是我不知道如何创建计时器时钟 hh:mm:ss

我需要它自我更新(这是我不知道该怎么做)。

7 个答案:

答案 0 :(得分:103)

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是单线程的,所以在调用它之前可能会有一段延迟。延迟通常以微秒为单位。

答案 1 :(得分:9)

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

我刚刚使用MVP模式创建了一个简单的计时器(但它可能是 对这个简单的项目来说太过分了)。它已退出,开始/暂停和停止按钮。时间以HH:MM:SS格式显示。使用每秒运行几次的线程以及计时器启动时间与当前时间之间的差异来实现计时。

Source code on github

答案 4 :(得分:1)

root.after(ms,func)是您需要使用的方法。只需在mainloop启动之前调用它一次,然后在每次调用时在绑定函数中重新计划它。这是一个示例:

from tkinter import *
import time


def update_clock():
    timer_label.config(text=time.strftime('%H:%M:%S',time.localtime()),
                  font='Times 25')  # change the text of the time_label according to the current time
    root.after(100, update_clock)  # reschedule update_clock function to update time_label every 100 ms

root = Tk()  # create the root window
timer_label = Label(root, justify='center')  # create the label for timer
timer_label.pack()  # show the timer_label using pack geometry manager
root.after(0, update_clock)  # schedule update_clock function first call
root.mainloop()  # start the root window mainloop

答案 5 :(得分:0)

我对这个问题有一个简单的答案。我创建了一个线程来更新时间。在线程中,我运行一个while循环,该循环获取时间并进行更新。检查以下代码,不要忘记将其标记为正确答案。

from tkinter import *
from tkinter import *
import _thread
import time


def update():
    while True:
      t=time.strftime('%I:%M:%S',time.localtime())
      time_label['text'] = t



win = Tk()
win.geometry('200x200')

time_label = Label(win, text='0:0:0', font=('',15))
time_label.pack()


_thread.start_new_thread(update,())

win.mainloop()

答案 6 :(得分:0)

from tkinter import *

from tkinter import messagebox

root = Tk()

root.geometry("400x400")

root.resizable(0, 0)

root.title("Timer")

seconds = 21

def timer():

    global seconds
    if seconds > 0:
        seconds = seconds - 1
        mins = seconds // 60
        m = str(mins)

        if mins < 10:
            m = '0' + str(mins)
        se = seconds - (mins * 60)
        s = str(se)

        if se < 10:
            s = '0' + str(se)
        time.set(m + ':' + s)
        timer_display.config(textvariable=time)
        # call this function again in 1,000 milliseconds
        root.after(1000, timer)

    elif seconds == 0:
        messagebox.showinfo('Message', 'Time is completed')
        root.quit()


frames = Frame(root, width=500, height=500)

frames.pack()

time = StringVar()

timer_display = Label(root, font=('Trebuchet MS', 30, 'bold'))

timer_display.place(x=145, y=100)

timer()  # start the timer

root.mainloop()