2010-03-26 30 views
9

Tôi đang viết một tiện ích cảnh báo đơn giản bằng Python.Làm thế nào để tuôn ra dòng đầu vào trong 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 

Tôi muốn xóa hoặc loại bỏ tất cả các nét chính được nhập trong khi tập lệnh đang ngủ và chỉ chấp nhận các nét chính sau khi raw_input() được thực hiện.

EDIT: Tôi đang chạy tính năng này trên windows xp.

+2

bạn không cần dấu chấm phẩy đó sau 'sys.stdout.flush();' –

+0

Tệ của tôi, bạn nói đúng, tôi không cần dấu chấm phẩy. Sửa mã. – Amjith

+1

"tuôn ra hoặc loại bỏ tất cả các nét chính"? Bạn có nghĩa là "Đọc và bỏ qua" Bạn không thể dễ dàng "tuôn ra" đầu vào. Tại sao không làm điều đơn giản, hiển nhiên: đọc chúng và bỏ qua chúng? –

Trả lời

5

Nó sẽ giúp để biết những gì hệ điều hành bạn đang sử dụng, vì đây là một câu hỏi rất hệ điều hành cụ thể. Ví dụ, câu trả lời của Kylar không hoạt động trên Windows vì sys.stdin không có thuộc tính fileno.

Tôi đã tò mò và ném cùng một giải pháp sử dụng lời nguyền, nhưng điều này sẽ không làm việc trên Windows hoặc:

#!/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. Sau đó, bạn có thể sử dụng mô-đun msvcrt. Lưu ý rằng mã dưới đây không phải là hoàn hảo, và nó không hoạt động trong IDLE tại tất cả:

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

Tôi đang chạy tính năng này trong Windows xp. – Amjith

+1

Sau đó, bạn có thể muốn thử mô-đun msvcrt; xem chỉnh sửa ở trên. –

+0

Điều đó đã hiệu quả. Cảm ơn bạn! – 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

Tôi giảm thời gian ngủ xuống còn 3 giây để thử nghiệm :) – Kylar

+0

Mã này không hoạt động trên Windows XP. Bạn có thể giải thích các thông số khác nhau mà bạn đang gửi đến select.select() không? – Amjith

+2

Ahh, tôi không nhận ra bạn đang ở trên cửa sổ. Điều này sẽ không làm việc ở tất cả (tôi thấy/usr/bin/python và giả định. Của tôi xấu.) Các tài liệu cho chọn là ở đây: http://docs.python.org/library/select.html nhưng trên cửa sổ nó sẽ chỉ liên kết với một ổ cắm. – Kylar

5

On unices, bạn có thể sử dụng 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

Từ 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) 

Phần thử là dành cho nền tảng Windows. Tôi đã không đích thân kiểm tra phần này. Nhưng phần ngoại lệ hoạt động trên thiết bị đầu cuối Linux. module termios có một số chức năng giao diện đầu cuối. tcflush có thể tuôn ra dữ liệu đệm đầu vào hoặc đầu ra. Phần này chắc chắn hoạt động trong các bài kiểm tra của tôi.

+0

Tại sao OP nên tin tưởng câu trả lời của bạn? Một ** câu trả lời hay ** sẽ luôn luôn có một giải thích về những gì đã được thực hiện và tại sao nó được thực hiện theo cách như vậy, không chỉ cho OP mà đối với khách truy cập trong tương lai đối với SO. –

+1

@bub, cảm ơn vì gợi ý. Tôi không nghĩ có nhiều sự giải thích cần thiết cho cái này. sẽ sửa câu trả lời của tôi – kollery

+0

Điều này tương tự như những gì @Callahad có. Chỉ cần kết thúc tốt đẹp trong một 'def' đẹp – kollery

Các vấn đề liên quan