私はraw_input
in Pythonを使用して、シェルでユーザーと対話します。
c = raw_input('Press s or n to continue:')
if c.upper() == 'S':
print 'YES'
意図したとおりに機能しますが、ユーザーは「s」を押した後、シェルでEnterキーを押す必要があります。シェルでEnterキーを押すことなく、ユーザー入力から必要なことを達成する方法はありますか? * nixesマシンを使用しています。
Windowsでは、msvcrt
モジュールが必要です。具体的には、問題を記述する方法から、関数 msvcrt.getch のようです。
キーを押して、結果の文字を返します。コンソールには何もエコーされません。この呼び出しは、キー押下がまだ利用できない場合はブロックしますが、Enterが押されるのを待ちません。
(など-先ほど指摘したドキュメントを参照)。 Unixの場合、たとえば このレシピ 同様のgetch
関数を作成する簡単な方法(そのレシピのコメントスレッドのいくつかの代替&cも参照)。
Pythonは、すぐに使用できるマルチプラットフォームソリューションを提供しません。
Windowsを使用している場合は、 msvcrt を試してみてください。
import msvcrt
print 'Press s or n to continue:\n'
input_char = msvcrt.getch()
if input_char.upper() == 'S':
print 'YES'
呪いもそれを行うことができます:
import curses, time #-------------------------------------- def input_char(message): try: win = curses.initscr() win.addstr(0, 0, message) while True: ch = win.getch() if ch in range(32, 127): break time.sleep(0.05) except: raise finally: curses.endwin() return chr(ch) #-------------------------------------- c = input_char('Press s or n to continue:') if c.upper() == 'S': print 'YES'
msvcrt
モジュールの代わりに、 WConio を使用することもできます。
>>> import WConio
>>> ans = WConio.getkey()
>>> ans
'y'
単一の文字を取得するために、 getch を使用しましたが、Windowsで機能するかどうかはわかりません。
補足として、msvcrt.kbhit()は、キーボード上のキーが現在押されているかどうかを決定するブール値を返します。
したがって、ゲームや何かを作成していて、キープレスに何かをさせたいがゲームを完全に停止させたくない場合は、ifステートメント内でkbhit()を使用して、ユーザーが実際に何かをしたい場合にのみキーを取得できるようにします。
Python 3:の例
# this would be in some kind of check_input function
if msvcrt.kbhit():
key = msvcrt.getch().decode("utf-8").lower() # getch() returns bytes data that we need to decode in order to read properly. i also forced lowercase which is optional but recommended
if key == "w": # here 'w' is used as an example
# do stuff
Elif key == "a":
# do other stuff
Elif key == "j":
# you get the point
私はこれが古いことを知っていますが、解決策は私にとって十分ではありませんでした。 クロスプラットフォームをサポートおよび外部Pythonパッケージ。をインストールせずに)の解決策が必要です。
他の誰かがこの投稿に出くわした場合の、これに対する私の解決策
リファレンス: https://github.com/unfor19/mg-tools/blob/master/mgtools/get_key_pressed.py
from tkinter import Tk, Frame
def __set_key(e, root):
"""
e - event with attribute 'char', the released key
"""
global key_pressed
if e.char:
key_pressed = e.char
root.destroy()
def get_key(msg="Press any key ...", time_to_sleep=3):
"""
msg - set to empty string if you don't want to print anything
time_to_sleep - default 3 seconds
"""
global key_pressed
if msg:
print(msg)
key_pressed = None
root = Tk()
root.overrideredirect(True)
frame = Frame(root, width=0, height=0)
frame.bind("<KeyRelease>", lambda f: __set_key(f, root))
frame.pack()
root.focus_set()
frame.focus_set()
frame.focus_force() # doesn't work in a while loop without it
root.after(time_to_sleep * 1000, func=root.destroy)
root.mainloop()
root = None # just in case
return key_pressed
def __main():
c = None
while not c:
c = get_key("Choose your weapon ... ", 2)
print(c)
if __name__ == "__main__":
__main()