Python3でキーを押下したら即座に出力に反映するやり方

f:id:sakage24:20170701162648g:plain

なんかgifにすると@のファントムが残りますね…FPS上げてみたんですが、治らないw

  • Windows向け
  • Linux向け

どちらのOSかによって使用するモジュールが異なります。また、これらは排他的ですので、両立させることは恐らく無理です。

input()からの卒業

例えば、RPGを作っている時、キーボードのWASDキーでプレイヤーを上下左右に移動させたい場合があるかもしれません。こんな時どうしますか?外部からのキーボード入力を受け付けようとしたら真っ先に浮かぶのはinput()関数ですよね。ですが、一つ問題があってinput()関数は文字入力後、ENTERキーを押下しないと出力が行われません。

キー入力→ENTER→標準出力という流れですが、ゲームとかだとキー入力→即座に出力で受け取りたいですよね。

そんな時に使えるモジュールをPythonは持っているんですね。それと、windows, Linuxのどちらから起動しても使えるようにしましょう。

Windows向け

msvcrtモジュールはwindows固有のサブルーチンです。Pythonはそれに対するアクセス機構を持っています。これを利用しましょう。

Linux向け

tty, termiosというモジュールを利用します。よく分かってませんw

ソースコード


import sys
class Getch():
@staticmethod
def getch_windows():
import msvcrt
return msvcrt.getwch()
@staticmethod
def getch_linux():
import tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
if __name__ == '__main__':
import os
if os.name == "nt":
print(Getch.getch_windows())
else:
print(Getch.getch_linux())

参考サイト様

azwoo.hatenablog.com

終わり

散々ぐぐりましたが、ようやくたどり着いたので…

コメントを残す

メールアドレスが公開されることはありません。