Come posso creare un menu che non richieda all'utente di premere [invio] per effettuare una selezione?
-
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...
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.