Vă mulțumim pentru susținere

Cum fac un meniu care nu cere utilizatorului să apese [enter] pentru a face o selecție?

Am un meniu în Python. Partea a fost ușoară. Folosesc raw_input () pentru a obține selecția de la utilizator.

Problema este că raw_input (și intrarea) solicită utilizatorului să apese Enter după ce face o selecție. Există vreo modalitate de a face ca programul să acționeze imediat după o apăsare de tastă? Iata ce am ajuns pana acum:

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"

Ar fi grozav să ai ceva de genul

print menu
while lastKey = "":
    lastKey = check_for_recent_keystrokes()
if "1" in lastKey: #do stuff...
0
adăugat editat

4 răspunsuri

Wow, asta a luat pentru totdeauna. Ok, iată ce am terminat

#!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

Ea nu reușește greu folosind IDLE, chestia python ... care vine cu Python. Dar odată ce am încercat-o în DOS (er, CMD.exe), ca un program real, atunci a fugit bine.

Nimeni nu o încercați în IDLE, cu excepția cazului în care aveți Manager de activități la îndemână.

Am uitat deja cum am trăit cu meniuri care nu sunt super-instantanee receptive.

0
adăugat

Pe Linux:

  • setați modul brut
  • selectați și citiți tasta </​​li>
  • restaurați setările normale
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"

0
adăugat

Pe Windows:

import msvcrt
answer=msvcrt.getch()
0
adăugat

Motivul pentru care msvcrt nu reușește în IDLE este că IDLE nu accesează biblioteca care execută msvcrt. Întrucât când executați programul nativ în cmd.exe funcționează frumos. Din același motiv ca programul dvs. aruncă în aer pe terminalele Mac și Linux.

Dar cred că dacă o să folosești acest lucru special pentru ferestre, mai multă putere pentru tine.

0
adăugat