最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python+tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的秒鐘

 更新時(shí)間:2024年02月21日 11:34:05   作者:微小冷  
這篇文章主要為大家詳細(xì)介紹了Python如何利用tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的秒鐘,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以自己動(dòng)手嘗試一下

需求和框架

本文試圖實(shí)現(xiàn)一個(gè)簡(jiǎn)單的秒表,內(nèi)容如下

在這里插入圖片描述

這個(gè)軟件非常簡(jiǎn)單,其UI元素只有一個(gè)文字標(biāo)簽外加三個(gè)按鈕,這三個(gè)按鈕的功能如下

  • 點(diǎn)擊Start按鈕,開(kāi)始進(jìn)行計(jì)時(shí),同時(shí)Start變灰,無(wú)法點(diǎn)擊
  • 點(diǎn)擊Stop按鈕,停止計(jì)時(shí),同時(shí)Stop變灰,無(wú)法點(diǎn)擊
  • 點(diǎn)擊Reset按鈕,則計(jì)時(shí)歸0,若當(dāng)前處于停止?fàn)顟B(tài),則Reset變灰

則整個(gè)軟件所需導(dǎo)入的模塊以及整體框架如下

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為計(jì)數(shù)值,即點(diǎn)擊Start之后經(jīng)過(guò)的秒數(shù);running為當(dāng)前狀態(tài),如果正在計(jì)時(shí),則為True,否則為False。

initWidgets是布局函數(shù),Start, Stop, Reset分別是三個(gè)按鈕的回調(diào)函數(shù),count則用于計(jì)時(shí)。

下面的代碼均為Clock中的方法,在使用時(shí)注意縮進(jìn)。

布局和主流程

整個(gè)程序分為兩個(gè)部分,上面的Label是第一部分,下面三個(gè)按鈕共同組成第二部分,其布局代碼如下

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

三個(gè)按鈕的三個(gè)回調(diào)函數(shù)如下,通過(guò)state來(lái)調(diào)整當(dāng)前按鈕的可用狀態(tài),若為disabled即表示不可用。當(dāng)點(diǎn)擊Start時(shí),會(huì)調(diào)用計(jì)時(shí)函數(shù)count,這個(gè)函數(shù)在后面馬上實(shí)現(xiàn)。

當(dāng)點(diǎn)擊Reset后,除了需要將label中的值初始化之外,還需要判斷當(dāng)前是否處于計(jì)時(shí)狀態(tài),如果已經(jīng)停止計(jì)時(shí),且已經(jīng)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'

計(jì)時(shí)函數(shù)

一般來(lái)說(shuō),計(jì)時(shí)肯定要用到time.sleep,但在UI中,這種計(jì)時(shí)容易導(dǎo)致阻塞,進(jìn)而窗口卡死,而要采用多線程,顯然會(huì)增加程序的復(fù)雜程度。為此,可動(dòng)用tkinter組件的after方法,以label.after(a,b)為例,表示經(jīng)過(guò)a毫秒后,執(zhí)行b。

下面即為采用after方法的計(jì)時(shí)函數(shù)。當(dāng)程序不處于計(jì)時(shí)狀態(tài)時(shí),直接跳出。否則開(kāi)始計(jì)時(shí),當(dāng)計(jì)數(shù)值為0時(shí),標(biāo)簽顯示Ready,否則顯示的則是秒數(shù)。這里比較巧妙的方法是,等待1000毫秒,再重新調(diào)用自己,從而實(shí)現(xiàn)計(jì)時(shí)功能。

    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實(shí)現(xiàn)一個(gè)簡(jiǎn)單的秒鐘的詳細(xì)內(nèi)容,更多關(guān)于python tkinter秒鐘的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

湘乡市| 资中县| 北海市| 杂多县| 苏尼特右旗| 新竹县| 平罗县| 淄博市| 梁山县| 莫力| 武汉市| 康平县| 裕民县| 德化县| 两当县| 巫山县| 佳木斯市| 容城县| 分宜县| 郸城县| 措勤县| 海安县| 亳州市| 札达县| 洛扎县| 登封市| 隆回县| 临武县| 阳西县| 凤山县| 汝阳县| 牡丹江市| 淅川县| 安阳市| 景德镇市| 绥江县| 山阳县| 雅江县| 东山县| 南皮县| 平果县|