2012-08-02 21 views
5

Kullanıcının 20 saniye boyunca herhangi bir tuşa basmasını nasıl bekleyebilirim? Yani İletiyi gösteriyorum ve 20 sn sayar, 20 sn geçilirse VEYA herhangi bir tuşa basılırsa kod çalışmaya devam eder. Bunu python ile nasıl yapabilirim?Kullanıcının herhangi bir tuşa basması 20 saniye boyunca nasıl beklenir?

+2

alınmıştır Bir süre döngüsünde, başlangıç ​​saatine göre geçerli zamanı kontrol eder. – Lanaru

+1

@Lanaru: Neden bir süre döngü? Kötü bir beklemede olan kötü bir durum gibi görünüyor. Bir zaman aşımı ile select() 'gibi bir şey aynı şeyi yapabilir. – gsk

+0

herhangi key_ ben Pygame kullanarak çapraz platform cevabı gördün herhangi string_ – moooeeeep

cevap

7

Windows üzerinde iseniz:

def wait_for_user(secs): 
    import msvcrt 
    import time 
    start = time.time() 
    while True: 
     if msvcrt.kbhit(): 
      msvcrt.getch() 
      break 
     if time.time() - start > secs: 
      break 
+0

Biraz küçük, ama birileri sırasında bir karakter vurursa Uyku, sebepsiz bekliyorsun. Uykudan ziyade zamanı karşılaştırmak en iyisidir. – Logan

+0

Haklısınız. Zaman karşılaştırmak için güncellendi. –

0

(Uyarı: denenmemiş kodu)

şey gibi:

import sys 
import select 

rlist, _, _ = select.select([sys.stdin], [], [], timeout=20) 
if len(rlist) == 0: 
    print "user didnt input anything within 20 secs" 
else: 
    print "user input something within 20 secs. Now you just have to read it" 

düzenlemek bkz: http://docs.python.org/library/select.html

+1

Seçme modülünü bilmiyordum, bu bilmek güzel. Pencerelerde test ettim ve işe yaramadı. Belgelerden: Not: Windows'taki dosya nesneleri kabul edilemez, ancak soketler vardır. Windows'ta, temel olan select() işlevi, WinSock kitaplığı tarafından sağlanır ve WinSock kaynaklı olmayan dosya tanıtıcılarını işlemez. –

+0

@BrendenBrown: Wow, hiçbir fikrim yoktu. Güncelleme için teşekkür ederim (bu, Windows geliştirmedeki kafa karışıklığımı kızdırıyor ...) – gsk

2

olası bir Çözümkullanmaktır Değerleri kontrol etmek için, ama hoşuma gitmiyor, zamanımı harcıyor gibi hissediyorum. Sorunu işlemek için Linux sistemlerinde sinyal kullanabilirsiniz Öte yandan
. belli bir süre sonra, bir özel duruma neden olacak try başarısız olur ve kod except devam:

import signal 

class AlarmException(Exception): 
    pass 

def alarmHandler(signum, frame): 
    raise AlarmException 

def nonBlockingRawInput(prompt='', timeout=20): 
    signal.signal(signal.SIGALRM, alarmHandler) 
    signal.alarm(timeout) 
    try: 
     text = raw_input(prompt) 
     signal.alarm(0) 
     return text 
    except AlarmException: 
     print '\nPrompt timeout. Continuing...' 
    signal.signal(signal.SIGALRM, signal.SIG_IGN) 
    return '' 

kodu olduğunu uygulamak ardından, engellenmeyen girişi Look up here

+0

Bunu beğendim, ancak Windows'ta da çalışmıyor. Python varsayılan olarak çizgi tamponlu modunda olduğu için – mgilson

+0

Ayrıca özel durumda o, sen sonunda '\ n 'girmek için' raw_input' bekler başka hatadır sahiptir. – Rsh

İlgili konular