ユーザーが [Enter] を押して選択する必要がないメニューを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1829

  •  08-06-2019
  •  | 
  •  

質問

Pythonでメニューを作りました。その部分は簡単でした。使っています raw_input() ユーザーからの選択を取得します。

問題はそれです raw_input (および入力) ユーザーが押す必要があります 入力 彼らが選択をした後。キーストローク時にプログラムを即座に動作させる方法はありますか?これまでに私が得たものは次のとおりです。

import sys
print """Menu
1) Say Foo
2) Say Bar"""
answer = raw_input("Make a selection> ")

if "1" in answer: print "foo"
elif "2" in answer: print "bar"

次のようなものがあれば素晴らしいでしょう

print menu
while lastKey = "":
    lastKey = check_for_recent_keystrokes()
if "1" in lastKey: #do stuff...
役に立ちましたか?

解決

Windows の場合:

import msvcrt
answer=msvcrt.getch()

他のヒント

Linux の場合:

  • RAWモードを設定する
  • キーストロークを選択して読み取る
  • 通常の設定を復元する
import sys
import select
import termios
import tty

def getkey():
    old_settings = termios.tcgetattr(sys.stdin)
    tty.setraw(sys.stdin.fileno())
    select.select([sys.stdin], [], [], 0)
    answer = sys.stdin.read(1)
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
    return answer

print """Menu
1) Say Foo
2) Say Bar"""

answer=getkey()

if "1" in answer: print "foo"
elif "2" in answer: print "bar"

うわー、それは永遠にかかりました。OK、これが私が最終的に得たものです

#!C:\python25\python.exe
import msvcrt
print """Menu
1) Say Foo 
2) Say Bar"""
while 1:
    char = msvcrt.getch()
    if char == chr(27): #escape
        break
    if char == "1":
        print "foo"
        break
    if char == "2":
        print "Bar"
        break

Python に付属している IDLE を使用すると、かなり失敗します。しかし、DOS (CMD.exe) で実際のプログラムとして試してみると、問題なく動作しました。

タスクマネージャーを手元に持っていない限り、IDLE でそれを試す人はいません。

瞬時に反応しないメニューをどうやって使っていたのか、もう忘れてしまいました。

msvcrt が IDLE で失敗する理由は、IDLE が msvcrt を実行するライブラリにアクセスしていないためです。一方、プログラムを cmd.exe でネイティブに実行すると、正常に動作します。Mac や Linux 端末でプログラムが爆発するのと同じ理由です。

ただし、これを特に Windows で使用する場合は、さらに強力な機能が必要になると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top