python+tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的秒鐘
需求和框架
本文試圖實(shí)現(xiàn)一個(gè)簡(jiǎn)單的秒表,內(nèi)容如下
這個(gè)軟件非常簡(jiǎn)單,其UI元素只有一個(gè)文字標(biāo)簽外加三個(gè)按鈕,這三個(gè)按鈕的功能如下
- 點(diǎn)擊Start按鈕,開始進(jìn)行計(jì)時(shí),同時(shí)Start變灰,無法點(diǎn)擊
- 點(diǎn)擊Stop按鈕,停止計(jì)時(shí),同時(shí)Stop變灰,無法點(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)過的秒數(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ù)如下,通過state來調(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ù)
一般來說,計(jì)時(shí)肯定要用到time.sleep,但在UI中,這種計(jì)時(shí)容易導(dǎo)致阻塞,進(jìn)而窗口卡死,而要采用多線程,顯然會(huì)增加程序的復(fù)雜程度。為此,可動(dòng)用tkinter組件的after方法,以label.after(a,b)為例,表示經(jīng)過a毫秒后,執(zhí)行b。
下面即為采用after方法的計(jì)時(shí)函數(shù)。當(dāng)程序不處于計(jì)時(shí)狀態(tài)時(shí),直接跳出。否則開始計(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)文章
Python Tornado框架輕松寫一個(gè)Web應(yīng)用的全過程
Tornado全稱Tornado Web Server,是一個(gè)用Python語言寫成的Web服務(wù)器兼Web應(yīng)用框架,Tornado走的是少而精的方向,注重的是性能優(yōu)越,它最出名的是異步非阻塞的服務(wù)器方式,這篇文章主要給大家介紹了關(guān)于Python Tornado框架輕松寫一個(gè)Web應(yīng)用的相關(guān)資料,需要的朋友可以參考下2021-08-08python3?chromedrivers簽到的簡(jiǎn)單實(shí)現(xiàn)
本文主要介紹了python3?chromedrivers簽到的簡(jiǎn)單實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Python實(shí)現(xiàn)農(nóng)歷轉(zhuǎn)換教程詳解
農(nóng)歷,是我國(guó)現(xiàn)行的傳統(tǒng)歷法。它是根據(jù)月相的變化周期,每一次月相朔望變化為一個(gè)月,參考太陽(yáng)回歸年為一年的長(zhǎng)度,并加入二十四節(jié)氣與設(shè)置閏月以使平均歷年與回歸年相適應(yīng)。本文將用Python實(shí)現(xiàn)農(nóng)歷轉(zhuǎn)換,需要的可以參考一下2022-03-03