E 'possibile utilizzare getch () per ottenere gli ingressi di lunghezza variabile?

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

  •  26-10-2019
  •  | 
  •  

Domanda

ho ripreso l'avventura della creazione di un relativamente piccolo RPG della riga di comando di flettere i miei muscoli ritrovata Python, ma ho già eseguito in un enigma. Sto usando questa implementazione di getch ():

def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    tty.setraw(sys.stdin.fileno())
    key = sys.stdin.read(3)
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

Ho impostato key da leggere in 3 caratteri per i tasti di cattura freccia. Up, ad esempio, vengono letti come ESC[A; con questo metodo, posso usare key[2] per determinare se un tasto freccia è stato premuto e quale. Tutto molto bello, tranne che mi piacerebbe anche di catturare tutti i tipi di altri tasti; q per registro missioni, wasd per il movimento (premendo le frecce in vari ordini sarà il metodo di attacco), e molti altri. Il problema è immediatamente chiaro; se getch() restituisce solo un singolo carattere, freccia funzionalità è persa del tutto.

Sto contemplando ripensare il sistema di freccia del tutto, se non esiste una soluzione semplice, ma sono quasi certo ci deve essere. Certo, io so poco di ciò che sta accadendo all'interno tty, ma ho letto da qualche parte che se si leggono solo in 1 carattere, i caratteri in eccesso da un comunicato freccia vengono mantenuti nel buffer. Come potrei fare per l'accesso a detto tampone? In alternativa, c'è qualche modo intelligente per dire stdin aspettarsi di ingresso di lunghezza variabile?

Vi ringrazio in anticipo per qualsiasi assistenza.

È stato utile?

Soluzione

non letto tre caratteri. Leggere uno.

Se il un carattere che hai appena letto è ESC, leggere un altro personaggio o due per vedere se era un tasto freccia o qualsiasi altra cosa. Se fosse un q, fare la cosa per questo e poi ricominciare da capo.

Altri suggerimenti

Se si considera lo sviluppo di un gioco completo, PyGame potrebbe essere utile anche (eventualmente ncurses).

Il frammento getch() può essere aggiornato per leggere, freccia, ma come fare la differenza tra il primo carattere di un tasto freccia e il tasto ESC? Se la stampa ESC utente, la soluzione descritta sarà probabilmente attendere il tasto successivo stampa.

Non ho trovato alcuna soluzione per la gestione di questo ultimo caso.

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