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

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

MENU

【python】【Tkinter】本格的なタイマーを作ってみた

 

1.  概要

前々回の記事「自作タイマー」と、前回の記事「プログレスバー」を組み合わせて本格的なタイマーを作ってみました。

stjun.hatenablog.com

stjun.hatenablog.com

 

2020/01/26追記:プログラミング初心者に向けたpythonの勉強法と手順を記事にしました。

stjun.hatenablog.com

 

 

2.  動作画面

コードを実行すると次の画面がでてきます。

f:id:stjun:20190602191523p:plain


例えば3分に設定をしてSTARTボタンを押すと、タイマーのカウントが始まり、最下部のバーも一秒ずつ増えていきます。またSTARTボタンがSTOPボタンに変わります。

f:id:stjun:20190602190956p:plain

STOPボタンを押すとタイマーが一時停止します。 プログレスバーも停止します。

f:id:stjun:20190802103139p:plain

再度STARTボタンを押すとタイマーが再開します。

またRESETボタンを押すとタイマーが0分0秒になり再度設定が可能になります。

f:id:stjun:20190802103304p:plain

3.コード

過去記事のコードを組み合わせただけなので説明は省略します。

 

import tkinter as tk
import tkinter.font as font
import tkinter.ttk as ttk

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

progressbar=ttk.Progressbar(root,orient="horizontal",length=230,mode="determinate")
progressbar.grid(row=2,column=0,columnspan=7)

start=True
check=True
stop=False

def start():
    global start,check,text_min,text_sec,start,check,stop,value_time
    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()))
        maximum_time=int(buff_min.get())*60+int(buff_sec.get())
        #print(maximum_time)
        value_time=0
        div_time=1
        progressbar.configure(maximum=maximum_time,value=value_time)
        timer()
    
        

def timer():
    global start,buff_min,buff_sec,text_min,text_sec,check,value_time,div_time
    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:
                time_sec-=1
                buff_sec.set(str(time_sec))
                value_time+=1
                progressbar.configure(value=value_time)
                root.after(1000,timer)
                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()

 

■自分が使ってるお得情報の紹介

私はAmazon kindle unlimitedというサービスを1年以上利用しています。

これは月額980円で 和書12万冊以上の電子書籍を読めるサービスです。

ビジネス本、雑誌、漫画、技術本など様々な本を読むことができます。10冊まで端末にダウンロードできるのでネット環境がなくても(オフラインでも)見れます。

なおkindle unlimitedは最初の30日間無料のため、気軽に登録してみて、あまり読みたい本が無ければすぐに解約しても問題ありません。

それか30日内に気になる本を全て読破すれば実質タダです。

ぜひ気になった方はチェックしてみて下さい。

なおkindleにない本等を買う時はamazonギフト券(amazonで使えるポイント)を買い、ポイントで数冊まとめて買った方がお得です。

ギフト券(ポイント)は買ったら10年も有効で、ポイントが付きます。さらに本をまとめ買い(2冊以上同時に)買うと、ポイントがもらえます。

https://www.amazon.co.jp/b?ie=UTF8&node=5431437051

学生さんであればkindle unlimitedよりも年2450円(月210円程度)で映画見放題、音楽聞き放題、本読み放題の「prime student」がおすすめです。

以下に私がkindle unlimitedで読んだ本を載せておきます。

さおだけ屋はなぜ潰れないのか? 身近な疑問からはじめる会計学 (光文社新書)

さおだけ屋はなぜ潰れないのか? 身近な疑問からはじめる会計学 (光文社新書)

  • 作者:山田 真哉
  • 出版社/メーカー: 光文社
  • 発売日: 2005/02/16
  • メディア: 新書
 
多動力 (NewsPicks Book) (幻冬舎文庫)

多動力 (NewsPicks Book) (幻冬舎文庫)

 

 

■雑誌系

MONOQLO (モノクロ) 2020年 02月号 [雑誌]

MONOQLO (モノクロ) 2020年 02月号 [雑誌]

 
家電批評 2020年 1月号 [雑誌]

家電批評 2020年 1月号 [雑誌]

  • 作者: 
  • 出版社/メーカー: 晋遊舎
  • 発売日: 2019/12/03
  • メディア: Kindle
 
ロードバイク完全メンテナンス (エイムック 3544 BiCYCLE CLUB別冊)

ロードバイク完全メンテナンス (エイムック 3544 BiCYCLE CLUB別冊)

  • 作者: 
  • 出版社/メーカー: エイ出版社
  • 発売日: 2016/11/29
  • メディア: ムック
 
繰り返し作りたくなる!  ラク弁当レシピ (エイムック 3680)

繰り返し作りたくなる! ラク弁当レシピ (エイムック 3680)

 
Tarzan(ターザン) 2020年1月23日号 No.779 [内臓脂肪 皮下脂肪すっきり落とす!] [雑誌]

Tarzan(ターザン) 2020年1月23日号 No.779 [内臓脂肪 皮下脂肪すっきり落とす!] [雑誌]

  • 作者: 
  • 出版社/メーカー: マガジンハウス
  • 発売日: 2020/01/04
  • メディア: Kindle
 
DIME(ダイム) 2020年 03 月号 [雑誌]

DIME(ダイム) 2020年 03 月号 [雑誌]

  • 作者: 
  • 出版社/メーカー: 小学館
  • 発売日: 2019/12/16
  • メディア: 雑誌
 

 

4.今後の課題

他のウインドを開くとウインドの後ろに隠れて見えなくなるため、タイマーとして使うには常に最前面に表示される必要がありますが調べてもやり方がわかりません。

詳しい方がいたら教えて下さい。