Operation KiWi

一生使える言語はPythonだと信じてる

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

終わり

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