ユーザーが [Enter] を押して選択する必要がないメニューを作成するにはどうすればよいですか?
-
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 で使用する場合は、さらに強力な機能が必要になると思います。
所属していません StackOverflow