Come posso creare un menu che non richieda all'utente di premere [invio] per effettuare una selezione?

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

  •  08-06-2019
  •  | 
  •  

Domanda

Ho un menu in Python.Quella parte è stata facile.sto usando raw_input() per ottenere la selezione dall'utente.

Il problema è che raw_input (e input) richiedono che l'utente prema accedere dopo aver effettuato una selezione.Esiste un modo per far sì che il programma agisca immediatamente dopo aver premuto un tasto?Ecco cosa ho ottenuto finora:

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"

Sarebbe fantastico avere qualcosa del genere

print menu
while lastKey = "":
    lastKey = check_for_recent_keystrokes()
if "1" in lastKey: #do stuff...
È stato utile?

Soluzione

Su Windows:

import msvcrt
answer=msvcrt.getch()

Altri suggerimenti

Su Linux:

  • impostare la modalità grezza
  • selezionare e leggere la sequenza di tasti
  • ripristinare le normali impostazioni
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"

Wow, ci è voluta un'eternità.Ok, ecco cosa ho ottenuto

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

Fallisce duramente usando IDLE, la cosa Python... che viene fornita con Python.Ma una volta provato in DOS (ehm, CMD.exe), come un vero programma, ha funzionato bene.

Nessuno lo prova in IDLE, a meno che tu non abbia Task Manager a portata di mano.

Ho già dimenticato come convivevo con menu che non rispondevano in modo super istantaneo.

Il motivo per cui msvcrt fallisce in IDLE è perché IDLE non accede alla libreria che esegue msvcrt.Mentre quando esegui il programma in modo nativo in cmd.exe funziona bene.Per lo stesso motivo per cui il tuo programma esplode sui terminali Mac e Linux.

Ma immagino che se lo utilizzerai specificamente per Windows, più potenza per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top