python+tkinter實現(xiàn)一個簡單的秒鐘
需求和框架
本文試圖實現(xiàn)一個簡單的秒表,內容如下

這個軟件非常簡單,其UI元素只有一個文字標簽外加三個按鈕,這三個按鈕的功能如下
- 點擊Start按鈕,開始進行計時,同時Start變灰,無法點擊
- 點擊Stop按鈕,停止計時,同時Stop變灰,無法點擊
- 點擊Reset按鈕,則計時歸0,若當前處于停止狀態(tài),則Reset變灰
則整個軟件所需導入的模塊以及整體框架如下
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為計數(shù)值,即點擊Start之后經(jīng)過的秒數(shù);running為當前狀態(tài),如果正在計時,則為True,否則為False。
initWidgets是布局函數(shù),Start, Stop, Reset分別是三個按鈕的回調函數(shù),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')
三個按鈕的三個回調函數(shù)如下,通過state來調整當前按鈕的可用狀態(tài),若為disabled即表示不可用。當點擊Start時,會調用計時函數(shù)count,這個函數(shù)在后面馬上實現(xiàn)。
當點擊Reset后,除了需要將label中的值初始化之外,還需要判斷當前是否處于計時狀態(tài),如果已經(jīng)停止計時,且已經(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'
計時函數(shù)
一般來說,計時肯定要用到time.sleep,但在UI中,這種計時容易導致阻塞,進而窗口卡死,而要采用多線程,顯然會增加程序的復雜程度。為此,可動用tkinter組件的after方法,以label.after(a,b)為例,表示經(jīng)過a毫秒后,執(zhí)行b。
下面即為采用after方法的計時函數(shù)。當程序不處于計時狀態(tài)時,直接跳出。否則開始計時,當計數(shù)值為0時,標簽顯示Ready,否則顯示的則是秒數(shù)。這里比較巧妙的方法是,等待1000毫秒,再重新調用自己,從而實現(xiàn)計時功能。
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實現(xiàn)一個簡單的秒鐘的詳細內容,更多關于python tkinter秒鐘的資料請關注腳本之家其它相關文章!
相關文章
Python Tornado框架輕松寫一個Web應用的全過程
Tornado全稱Tornado Web Server,是一個用Python語言寫成的Web服務器兼Web應用框架,Tornado走的是少而精的方向,注重的是性能優(yōu)越,它最出名的是異步非阻塞的服務器方式,這篇文章主要給大家介紹了關于Python Tornado框架輕松寫一個Web應用的相關資料,需要的朋友可以參考下2021-08-08
python3?chromedrivers簽到的簡單實現(xiàn)
本文主要介紹了python3?chromedrivers簽到的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03

