web-dev-qa-db-ja.com

raw_input in python Enterを押さずに

私は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も参照)。

16
Alex Martelli

Pythonは、すぐに使用できるマルチプラットフォームソリューションを提供しません。
Windowsを使用している場合は、 msvcrt を試してみてください。

import msvcrt
print 'Press s or n to continue:\n'
input_char = msvcrt.getch()
if input_char.upper() == 'S': 
   print 'YES'
10
systempuntoout

呪いもそれを行うことができます:

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'
4
user2660966

msvcrtモジュールの代わりに、 WConio を使用することもできます。

>>> import WConio
>>> ans = WConio.getkey()
>>> ans
'y'
3
John Howard

単一の文字を取得するために、 getch を使用しましたが、Windowsで機能するかどうかはわかりません。

2
Derek Kurth

補足として、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
1
Nytra

私はこれが古いことを知っていますが、解決策は私にとって十分ではありませんでした。 クロスプラットフォームをサポートおよび外部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()
0
Meir Gabay