玩转 Tkinter:使用 Tkinter 的计时函数实现一个简单的计时器程序

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012814856/article/details/91489988

一、引言

最近在学习 Python Tkinter 技术,并且正在尝试着使用 Tkinter 编写一些小工具软件来方便项目中一些功能的测试。偶尔有一天,我有了这么一个需求:

我想要在界面上显示某个功能运行的时间,我该怎么做呢?

于是乎,我就萌生了写这么一个计时器程序的想法:

它能够简单的显示当前的时间,然后点击 start 按钮,即可开始计时,然后点击 stop 按钮,即可结束计时,并且将中间经过的时差显示出来

完成效果如下:
1

这个程序主要是使用了 Tkinter 的控件自带的 after 函数进行计时(计时 1 秒),计时到时更新时间,然后接着调用 after 函数继续计时 1 秒。这样就达到了循环计时 1 秒的功能。有兴趣的同学可以直接参考我的代码。

二、代码

话不多说,直接贴代码:

from tkinter import Tk, Frame, StringVar
from tkinter import BOTH, LEFT, X
from tkinter.ttk import Label, Button
from datetime import datetime


class GUI(Frame):
    def __init__(self):
        super().__init__()

        self.nowTime = StringVar()
        self.nowTime.set(self.getNowTimeString())

        self.startTime = StringVar()
        self.startTime.set('b: 0000-00-00 00:00:00')

        self.endTime = StringVar()
        self.endTime.set('e: 0000-00-00 00:00:00')

        self.timeDelta = StringVar()
        self.timeDelta.set('Please start counting...')

        self.initUI()

    def initUI(self):
        self.master.title('Timer')
        self.pack(fill=BOTH, expand=True)

        frame1 = Frame(self)
        frame1.pack(fill=X)

        self.lbl1 = Label(frame1, textvariable=self.nowTime)
        self.lbl1.pack(side=LEFT, padx=5, pady=5)
        self.lbl1.after(1000, self.updateTime)

        frame2 = Frame(self)
        frame2.pack(fill=X)

        self.lbl2 = Label(frame2, textvariable=self.startTime)
        self.lbl2.pack(side=LEFT, padx=5, pady=5)

        frame3 = Frame(self)
        frame3.pack(fill=X)

        self.lbl3 = Label(frame3, textvariable=self.endTime)
        self.lbl3.pack(side=LEFT, padx=5, pady=5)

        frame4 = Frame(self)
        frame4.pack(fill=X)

        self.lbl4 = Label(frame4, textvariable=self.timeDelta)
        self.lbl4.pack(side=LEFT, padx=5, pady=5)

        frame5 = Frame(self)
        frame5.pack(fill=X)

        button1 = Button(frame5, text="Start", command=self.onStart)
        button1.pack(side=LEFT, padx=5, pady=5)

        button2 = Button(frame5, text="Stop", command=self.onStop)
        button2.pack(side=LEFT, padx=5, pady=5)

    def updateTime(self):
        self.nowTime.set(self.getNowTimeString())
        self.lbl1.after(1000, self.updateTime)

    def onStart(self):
        self.endTime.set('e: 0000-00-00 00:00:00')
        self.timeDelta.set('Please start counting...')
        self.startTime.set('b: ' + self.getNowTimeString(mode='start'))

    def onStop(self):
        self.endTime.set('e: ' + self.getNowTimeString(mode='stop'))
        timedelta = self.end - self.begin
        self.timeDelta.set('Difference between %s seconds' %
                           timedelta.seconds)

    def getNowTimeString(self, mode=None):
        now = datetime.now()
        if mode == 'start':
            self.begin = now
        elif mode == 'stop':
            self.end = now
        text = '%s-%s-%s %s:%s:%s' % \
               (now.year,
                '{:0>2d}'.format(now.month),
                '{:0>2d}'.format(now.day),
                '{:0>2d}'.format(now.hour),
                '{:0>2d}'.format(now.minute),
                '{:0>2d}'.format(now.second))
        return text


if __name__ == '__main__':
    root = Tk()
    root.geometry("250x170+300+300")
    app = GUI()
    root.mainloop()

代码中 root 是 Tkinter 的窗口句柄类,其承载了整个程序的界面框架,包括消息总循环等等。GUI 类继承自 Frame 类,用于设计界面显示。其中 initUI 函数使用了 pack 布局的方式,将 Label 和 Button 摆放在界面上。

__init__ 函数中,初始化了各个 Label 显示的文本变量(Label 的 textvariable 的属性,改变它即可改变 Label 的文本显示)。

其中最重要的就是 updateTime 函数,其在计时器到时即调用,调用完最后再次设置一个计时,以此达到循环计时的目的。

getNowTimeString 函数可能看上去比较复杂,实际上也只是控制时间字符串的格式而已。

短短 98 行代码,就实现了这么一个简单的计时器程序,是不是更加喜欢 Tkinter 了呢 ^_^

希望本篇博客能够给你带来一些帮助~~~

To be Stronger:)

展开阅读全文

没有更多推荐了,返回首页