LoginSignup
1
2

タイマーとキー入力を待つだけのスクリプト(Python Windows限定)

Posted at

Pythonスクリプトで、タイマー待ち

ただ、一定時間待つ場合、

test.py
import time

waittime = 300
while waittime > 0 :
    print(f"{waittime=}",end="\r")
    time.sleep(1)
    waittime-=1
print()

で、OK。

そんなに待てない。(keyboardモジュールを使ってみる)

5分も待てない。

なにかキーを押すと、タイマーを繰り上げたい。
なるほど、キー入力ならkeyboardモジュールを使おう。

test2.py
import time
import keyboard #pip install keyboard

waittime = 300
endtime = time.time() + waittime
zt = endtime - time.time()

while zt > 0:
    zt = endtime - time.time()
    print(f"waittime={int(zt)}",end="\r")
    if keyboard.is_pressed('q'):
        print("qキーが押されました")
        break

どや。

ウィンドウが非アクティブでもキーを拾ってしまう。

え?

対策として、アクティブウィンドウのハンドルを取得して、タイトルを拾ったりしてもなかなか安定せず。

getch()で、コンソールから1文字もらう。

コンソールからの入力を拾えれば、アクティブじゃないと入力できないのでgood。
しかし、getch()のみでは、文字が入力されるまで止まってしまうので、kbhit()を併用する。

getch() と kbhit() が、Windows のVCランタイムを使用しているので、Windows限定です。

test3.py
import time
import msvcrt as m

waittime = 300 #秒単位
endtime = time.time() + waittime

print(f"sleep {waittime}sec")

zt = endtime - time.time()

b=b"0"

while zt > 0:
    zt = endtime - time.time()
    khit = m.kbhit() #キーが押されたら1
    if khit == 1 :
        b=m.getch()
        c=int.from_bytes(b, 'big')
        if ord("C") == c or ord("c") == c  :
            print(f"\nKey '{chr(c)}' pressed continue")
            time.sleep(1)
            break
    
    print(f"waittime Last {int(zt):3} sec. Hit 'c'key to continue {khit=} {b=}",end="\r")
    time.sleep(1)

スリープを適当に入れないと、高負荷になります。

初投稿でした。

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2