機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

python Tkinterでタイマーを作ってみた

1.  起動画面

コードを実行すると以下の画面が出てきます。

f:id:stjun:20190530232603p:plain

初期値は30分に設定しています。

ここで好きな時間を設定します,今回は40分30秒にします。

f:id:stjun:20190530232711p:plain

STARTを押すとタイマーが始まります。またSTARTボタンがSTOPに変わります。

f:id:stjun:20190530233016p:plain

ここでSTOPボタンを押すとタイマーを一時停止させることができます。

またSTOPボタンが再びSTARTボタンに変わり、STARTボタンを押すとタイマーが再開します。

f:id:stjun:20190530233128p:plain

 RESETを押すと,タイマーが最初の0分0秒に戻ります。

 f:id:stjun:20190530232711p:plain

 

2. コード

がむしゃらに作ったので色々とコードが汚いですがご愛敬ということで...笑

start,check,stopというTrueかFalseを取る3つの変数の組み合わせで処理を変えています。

例えば(start,check,stop)=(True,True,False)はタイマー開始の処理を、(start,check,stop)=(True,False,True)の時は一時停止の処理のような感じです。

import tkinter as tk
import tkinter.font as font

root=tk.Tk()
root.title("Timer")
text_sec=tk.StringVar()
text_sec.set("0")
my_font=font.Font(size=20)

text_min=tk.StringVar()
text_min.set("30")

buff_min=tk.StringVar()
buff_min.set("0")

buff_sec=tk.StringVar()
buff_sec.set("0")

text_start_stop=tk.StringVar()
text_start_stop.set("START")

start=True
check=True
stop=False

def start():
    global start,check,text_min,text_sec,start,check,stop
    start=False
    if check==True and stop==True:
        start=True
        text_start_stop.set("STOP")
        timer()
    
    elif check==False and stop==True:
        count_min=int(buff_min.get())
        count_sec=int(buff_sec.get())
        buff_min.set("0")
        buff_sec.set("0")
        buff_min.set(count_min)
        buff_sec.set(count_sec)
        check=True
        text_start_stop.set("START")
        
    else:
        start=True
        stop=True
        text_start_stop.set("STOP")
        buff_min.set(int(text_min.get()))
        buff_sec.set(int(text_sec.get()))
        timer()
    
        

def timer():
    global start,buff_min,buff_sec,text_min,text_sec,check
    if start==True:
        if int(buff_min.get())==0 and int(buff_sec.get())==0:
            pass
        else:
            check=False
            time_min=int(buff_min.get())
            time_sec=int(buff_sec.get())
            if time_min>=0:
                frame.after(1000,timer)
                time_sec-=1
                buff_sec.set(str(time_sec))
                if time_sec==-1:
                    time_min-=1
                    buff_min.set(str(time_min))
                    buff_sec.set("59")
            if int(buff_min.get())==0 and int(buff_sec.get())==0:
                start=False
                time_min=0
                time_sec=0
                buff_sec.set(str(time_sec))
                buff_min.set(str(time_min))
                

            
def stop():
    global start,check,stop
    start=True
    check=True
    stop=False
    time_min=0
    time_sec=0
    buff_sec.set(str(time_sec))
    buff_min.set(str(time_min))

labbel=tk.Label(root,text="設定")
labbel.grid(row=0,column=0,columnspan=1)
    
entry=tk.Entry(root,width=2,font=my_font,textvariable=text_min)
entry.grid(row=0,column=1)

label_min=tk.Label(root,text=u"分")
label_min.grid(row=0,column=2)

entry1=tk.Entry(root,width=2,font=my_font,textvariable=text_sec)
entry1.grid(row=0,column=3)

label_sec=tk.Label(root,text=u"秒")
label_sec.grid(row=0,column=4)

button=tk.Button(root,textvariable=text_start_stop,command=start)
button.grid(row=0,column=5)

button=tk.Button(root,text=u"RESET",command=stop)
button.grid(row=0,column=6)

labbel=tk.Label(root,text="タイマー")
labbel.grid(row=1,column=0,columnspan=1)

labbel=tk.Label(root,font=my_font,textvariable=buff_min)
labbel.grid(row=1,column=1,columnspan=1)

labbel=tk.Label(root,text="分")
labbel.grid(row=1,column=2,columnspan=1)

labbel=tk.Label(root,font=my_font,textvariable=buff_sec)
labbel.grid(row=1,column=3,columnspan=1)

labbel=tk.Label(root,text="秒")
labbel.grid(row=1,column=4,columnspan=1)

root.mainloop()