Skip to content

Instantly share code, notes, and snippets.

@paruma
Last active October 9, 2023 15:04
Show Gist options
  • Select an option

  • Save paruma/b1e75fedbb13879552f30ea945667827 to your computer and use it in GitHub Desktop.

Select an option

Save paruma/b1e75fedbb13879552f30ea945667827 to your computer and use it in GitHub Desktop.
say_timer.py
#!/usr/bin/env python3
import argparse
import time
import datetime
from collections import deque
import subprocess
class QueueWithPeek(deque):
def peek(self):
"""
キューの先頭の要素を取り出さずに参照します。
"""
if len(self) > 0:
return self[0]
else:
return None
def get_args():
parser = argparse.ArgumentParser()
parser.add_argument("minute", type=int)
parser.add_argument("message", type=str)
return parser.parse_args()
def timedelta_to_str(t: datetime.timedelta) -> str:
hours, remainder = divmod(t.seconds, 3600)
minutes, seconds = divmod(remainder, 60)
return "{:02}:{:02}:{:02}".format(hours, minutes, seconds)
def say(msg: str) -> None:
# say コマンドは各環境に合わせて書き換える
subprocess.Popen(["say", "-v", "sayaka", "-r", "2", msg])
class MyTimer:
def __init__(self, message: str, minute: int) -> None:
self.message = message
self.minute = minute
def execute(self):
say('タイマースタートします')
# 現在時刻を表示
now = datetime.datetime.now()
print("開始時刻: " + now.strftime("%H:%M:%S"))
finish_time = now + datetime.timedelta(minutes=self.minute)
print("終了時刻: " + finish_time.strftime("%H:%M:%S"))
notify_queue = QueueWithPeek()
for t in reversed(range(5, self.minute, 5)):
notify_queue.append(t)
notify_queue.append(1)
notify_queue.append(0)
while True:
now = datetime.datetime.now()
remain_time = finish_time - now
if remain_time.total_seconds() <= 0:
break
if remain_time.total_seconds() <= notify_queue.peek() * 60:
notify_minute = notify_queue.popleft()
say(f"残り {notify_minute} 分です")
print("残り時間: " + timedelta_to_str(remain_time), end="\r")
time.sleep(1)
print()
print("終了: " + self.message)
say("終了: " + self.message)
def main():
args = get_args()
message: str = args.message
minute: int = args.minute
MyTimer(message, minute).execute()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment