python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python tkinter秒钟

python+tkinter实现一个简单的秒钟

作者:微小冷

这篇文章主要为大家详细介绍了Python如何利用tkinter实现一个简单的秒钟,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以自己动手尝试一下

需求和框架

本文试图实现一个简单的秒表,内容如下

在这里插入图片描述

这个软件非常简单,其UI元素只有一个文字标签外加三个按钮,这三个按钮的功能如下

则整个软件所需导入的模块以及整体框架如下

import tkinter as Tkinter
from datetime import datetime


class Clock():
    def __init__(self) -> None:
        root = Tkinter.Tk()
        root.title("Stopwatch")
        root.minsize(width=250, height=70)

        self.counter = 0
        self.running = False
        self.initWidgets(root)
        root.mainloop()

    def initWidgets(self, root): pass
    def count(self): pass
    def Start(self): pass
    def Stop(self): pass
    def Reset(self): pass

其中,counter为计数值,即点击Start之后经过的秒数;running为当前状态,如果正在计时,则为True,否则为False。

initWidgets是布局函数,Start, Stop, Reset分别是三个按钮的回调函数,count则用于计时。

下面的代码均为Clock中的方法,在使用时注意缩进。

布局和主流程

整个程序分为两个部分,上面的Label是第一部分,下面三个按钮共同组成第二部分,其布局代码如下

def initWidgets(self, root):
    self.label = Tkinter.Label(root,
            text='Ready!', font='Verdana 30 bold')
    self.label.pack()

    f = Tkinter.Frame(root)
    self.start = Tkinter.Button(f, text='Start', width=6,
                command=self.Start)
    self.stop = Tkinter.Button(f, text='Stop', width=6,
                state='disabled', command=self.Stop)
    self.reset = Tkinter.Button(f, text='Reset', width=6,
                state='disabled', command=self.Reset)

    f.pack(anchor='center', pady=5)
    self.start.pack(side='left')
    self.stop.pack(side='left')
    self.reset.pack(side='left')

三个按钮的三个回调函数如下,通过state来调整当前按钮的可用状态,若为disabled即表示不可用。当点击Start时,会调用计时函数count,这个函数在后面马上实现。

当点击Reset后,除了需要将label中的值初始化之外,还需要判断当前是否处于计时状态,如果已经停止计时,且已经Reset,则Reset按钮变灰。

    def Start(self):
        self.running = True
        self.count()
        self.start['state'] = 'disabled'
        self.stop['state'] = 'normal'
        self.reset['state'] = 'normal'

    def Stop(self):
        self.start['state'] = 'normal'
        self.stop['state'] = 'disabled'
        self.reset['state'] = 'normal'
        self.running = False

    def Reset(self):
        self.counter = 0
        if not self.running:
            self.reset['state'] = 'disabled'
        self.label['text'] = '00:00:00'

计时函数

一般来说,计时肯定要用到time.sleep,但在UI中,这种计时容易导致阻塞,进而窗口卡死,而要采用多线程,显然会增加程序的复杂程度。为此,可动用tkinter组件的after方法,以label.after(a,b)为例,表示经过a毫秒后,执行b。

下面即为采用after方法的计时函数。当程序不处于计时状态时,直接跳出。否则开始计时,当计数值为0时,标签显示Ready,否则显示的则是秒数。这里比较巧妙的方法是,等待1000毫秒,再重新调用自己,从而实现计时功能。

    def count(self):
        if not self.running:
            return
        if self.counter == 0:
            self.label['text'] = 'Ready!'
        else:
            tt = datetime.utcfromtimestamp(self.counter)
            self.label['text'] = tt.strftime('%H:%M:%S')

        self.label.after(1000, self.count)
        self.counter += 1

以上就是python+tkinter实现一个简单的秒钟的详细内容,更多关于python tkinter秒钟的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文