Come faccio a fare un menu che non richiede all'utente di premere [Invio] per effettuare una selezione?

voti
23

Ho un menù in Python. Quella parte è stato facile. Sto usando raw_input()per ottenere la selezione da parte dell'utente.

Il problema è che raw_input(e ingresso) richiede all'utente di premere Enterdopo fanno una selezione. C'è un modo per rendere immediatamente l'atto del programma su un tasto? Ecco quello che ho 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 bello avere qualcosa di simile

print menu
while lastKey = :
    lastKey = check_for_recent_keystrokes()
if 1 in lastKey: #do stuff...
È pubblicato 05/08/2008 alle 03:39
fonte dall'utente
In altre lingue...                            


4 risposte

voti
9

Su Windows:

import msvcrt
answer=msvcrt.getch()
Risposto il 05/08/2008 a 04:11
fonte dall'utente

voti
9

Su Linux:

  • impostare la modalità raw
  • selezionare e leggere la sequenza di tasti
  • ripristinare le impostazioni normali
import sys
importazione di selezione
termios importazione
importazione tty

def getkey ():
    old_settings = termios.tcgetattr (sys.stdin)
    tty.setraw (sys.stdin.fileno ())
    select.select ([sys.stdin], [], [], 0)
    risposta = sys.stdin.read (1)
    termios.tcsetattr (sys.stdin, termios.TCSADRAIN, old_settings)
    risposta di ritorno

print "" "Menu
1) Say Foo
2) Dire Bar """

answer = getkey ()

se "1" in risposta: print "pippo"
Elif "2" in risposta: print "bar"

Risposto il 05/08/2008 a 03:54
fonte dall'utente

voti
4

Wow, che ha preso per sempre. Ok, ecco quello che ho finito con

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

Non riesce difficile usando IDLE, il pitone ... cosa ... che viene fornito con Python. Ma una volta che ho provato in DOS (er, CMD.exe), come un vero e proprio programma, quindi ha funzionato bene.

Nessuno provarlo in IDLE, a meno che non si dispone di Task Manager a portata di mano.

Ho già dimenticato come ho vissuto con i menu che arn't super-immediato reattivo.

Risposto il 05/08/2008 a 04:51
fonte dall'utente

voti
0

Il motivo MSVCRT non riesce in IDLE è perché IDLE non stia accedendo la libreria che gestisce MSVCRT. Mentre quando si esegue il programma in modo nativo in cmd.exe funziona bene. Per la stessa ragione che il programma fa saltare in aria sui terminali Mac e Linux.

Ma credo che se avete intenzione di utilizzare questo specificamente per le finestre, più potere a ya.

Risposto il 05/08/2008 a 05:28
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more