2010-03-26 14 views
9

Sto scrivendo una semplice utilità di allarme in Python.Come svuotare il flusso di input in python?

#!/usr/bin/python 

import time 
import subprocess 
import sys 

alarm1 = int(raw_input("How many minutes (alarm1)? ")) 

while (1): 
    time.sleep(60*alarm1) 
    print "Alarm1" 
    sys.stdout.flush() 
    doit = raw_input("Continue (Y/N)?[Y]: ") 
    print "Input",doit 
    if doit == 'N' or doit=='n': 
     print "Exiting....." 
     break 

voglio svuotare o eliminare tutte le combinazioni di tasti che sono stati inseriti, mentre la sceneggiatura è stata dormendo e accettano solo le battute dopo la raw_input() viene eseguito.

MODIFICA: lo sto eseguendo su Windows XP.

+2

non hai bisogno di quel punto e virgola dopo 'sys.stdout.flush();' –

+0

Il mio male, hai ragione, non ho bisogno del punto e virgola. Risolto il codice. – Amjith

+1

"svuota o elimina tutti i tratti dei tasti"? Intendi "Leggi e ignora" Non puoi facilmente "svuotare" l'input. Perché non fare la cosa semplice e ovvia: leggerli e ignorarli? –

risposta

5

Sarebbe utile sapere quale sistema operativo che si sta utilizzando, in quanto si tratta di una questione molto specifico sistema operativo. Ad esempio, la risposta di Kylar non funziona su Windows perché sys.stdin non ha un attributo fileno.

ero curioso e gettato insieme una soluzione che utilizza maledizioni, ma questo non funzionerà su Windows sia:

#!/usr/bin/python                

import time 
import sys 
import curses 

def alarmloop(stdscr): 
    stdscr.addstr("How many seconds (alarm1)? ") 
    curses.echo() 
    alarm1 = int(stdscr.getstr()) 
    while (1): 
     time.sleep(alarm1) 
     curses.flushinp() 
     stdscr.clear() 
     stdscr.addstr("Alarm1\n") 
     stdscr.addstr("Continue (Y/N)?[Y]:") 
     doit = stdscr.getch() 
     stdscr.addstr("\n") 
     stdscr.addstr("Input "+chr(doit)+"\n") 
     stdscr.refresh() 
     if doit == ord('N') or doit == ord('n'): 
      stdscr.addstr("Exiting.....\n") 
      break 

curses.wrapper(alarmloop) 

EDIT: ah, Windows. Quindi puoi usare il modulo msvcrt. Si noti che il codice qui sotto non è perfetto, e non funziona in IDLE a tutti:

#!/usr/bin/python 

import time 
import subprocess 
import sys 
import msvcrt 

alarm1 = int(raw_input("How many seconds (alarm1)? ")) 

while (1): 
    time.sleep(alarm1) 
    print "Alarm1" 
    sys.stdout.flush() 

    # Try to flush the buffer 
    while msvcrt.kbhit(): 
     msvcrt.getch() 

    print "Continue (Y/N)?[Y]" 
    doit = msvcrt.getch() 
    print "Input",doit 
    if doit == 'N' or doit=='n': 
     print "Exiting....." 
     break 
+0

Sto eseguendo questo in Windows XP. – Amjith

+1

Quindi potresti provare il modulo msvcrt; vedi la modifica sopra. –

+0

Che ha funzionato. Grazie! – Amjith

1
#!/usr/bin/python 

import time 
import subprocess 
import sys 
import os, select 

alarm1 = int(raw_input("How many minutes (alarm1)? ")) 

while (1): 
    time.sleep(3*alarm1) 
    print "Alarm1" 
    sys.stdout.flush() 
    while len(select.select([sys.stdin.fileno()], [], [], 0.0)[0])>0: 
     os.read(sys.stdin.fileno(), 4096) 
    doit = raw_input("Continue (Y/N)?[Y]: ") 
    print "Input",doit 
    if doit == 'N' or doit=='n': 
     print "Exiting....." 
     break 
+0

Ho ridotto il tempo di sospensione a 3 secondi, per il test :) – Kylar

+0

Questo codice non ha funzionato su Windows XP. Puoi spiegare i vari parametri che stai inviando a select.select()? – Amjith

+2

Ah, non avevo capito che fossi su Windows. Questo non funzionerà affatto (ho visto/usr/bin/python e ho dato per scontato. Il mio male.) I documenti per la selezione sono qui: http://docs.python.org/library/select.html ma su Windows si legherà solo a una presa. – Kylar

5

Su Unix, è possibile utilizzare termios.tcflush():

import time 
import subprocess 
import sys 
from termios import tcflush, TCIOFLUSH 

alarm1 = int(raw_input("How many minutes (alarm1)? ")) 

while (1): 
    time.sleep(60*alarm1) 
    print "Alarm1" 
    sys.stdout.flush(); 
    tcflush(sys.stdin, TCIOFLUSH) 
    doit = raw_input("Continue (Y/N)?[Y]: ") 
    print "Input",doit 
    if doit == 'N' or doit=='n': 
     print "Exiting....." 
     break 
3

Da Rosetta Code

def flush_input(): 
    try: 
     import msvcrt 
     while msvcrt.kbhit(): 
      msvcrt.getch() 
    except ImportError: 
     import sys, termios #for linux/unix 
     termios.tcflush(sys.stdin, termios.TCIOFLUSH) 

La parte prova è per la piattaforma Windows. Non ho personalmente testato questa parte. Ma la sezione except funziona sul terminale Linux. il modulo termios ha alcune funzioni di interfaccia terminale. il tcflush può svuotare l'input o l'output di dati bufferizzati. Questa parte funziona sicuramente nei miei test.

+0

Perché l'OP dovrebbe fidarsi della sua risposta? Una ** buona risposta ** avrà sempre una spiegazione di cosa è stato fatto e perché è stato fatto in questo modo, non solo per l'OP ma per i futuri visitatori di SO. –

+1

@bub, grazie per il suggerimento. Non pensavo ci fosse bisogno di molta espianto su questo. modificherò la mia risposta – kollery

+0

Questo è simile a ciò che @Callahad ha avuto. Basta avvolgere in una bella "def" – kollery

Problemi correlati