##はじめに
PySimpleGUIでTKのafter(一定時間ごとに繰り返し実行する。JavascriptではsetInterval)みたいなことはできないかと思ったところ、timeoutを使えばできるようでした。
そこで、TKの時刻表示のサンプルを書き換えてみました。
##環境
Win10Pro
Anaconda
Python3.7
PySimpleGUIのインストールやもろもろは、以下を参照してください。
PySimpleGUIでQRコード作成GUIを作る
##TKによるデジタル時計
お気楽 Python/Tkinter 入門
アナログ時計の項目の中のデジタル時計を参考にしています。
after() メソッド
今回はユーザからの入力がなくても時計を動かさないといけなので、単純なイベント駆動型アプリケーションでは「時計」を実現することはできません。
このため、プログラム自身でなんらかのきっかけを作ってやる必要があります。このような場合、役に立つメソッドが after() です。
from tkinter import *
# サンプルではTkinterとなっていますが、Python3では小文字のtkinterになります。
import time
root = Tk()
root.option_add('*font', ('FixedSys', 14))
buff = StringVar()
buff.set('')
Label(textvariable = buff).pack()
# 時刻の表示
def show_time():
buff.set(time.strftime('%I:%M:%S'))
root.after(1000, show_time)
#1000msの後にshow_time関数を呼び出しています。
show_time()
root.mainloop()
##PySimpleGUIによるデジタル時計
cookbookのAsynchronous Window With Periodic Updateを参考に書いています。
cookbook Asynchronous Window With Periodic Update
import PySimpleGUI as sg
import time
def show_time():
jikan = time.strftime('%I:%M:%S')
return jikan
sg.theme('Dark')
layout= [[sg.Text(size=(8, 1), font=('Helvetica', 20),justification='center', key='-jikan-')]]
window = sg.Window('Watch',layout)
while True:
event, values = window.read(timeout=100,timeout_key='-timeout-')
#timeoutを指定することで、timeoutイベントが起こります。timeoutの単位はたぶんms
# print(event,values)
#↑コメントアウトを外すと、どんなイベントが起こっているか確かめることができます。
if event in (None,):
break
elif event in '-timeout-':
jikan = show_time()
window['-jikan-'].update(jikan)
window.close()
##まとめ
一定時間ごとに繰り返し実行する(tkのafter)ことが、timeoutを設定することで、実現できました。