Last active
October 9, 2023 15:04
-
-
Save paruma/b1e75fedbb13879552f30ea945667827 to your computer and use it in GitHub Desktop.
say_timer.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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