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?
cevap
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
Biraz küçük, ama birileri sırasında bir karakter vurursa Uyku, sebepsiz bekliyorsun. Uykudan ziyade zamanı karşılaştırmak en iyisidir. – Logan
Haklısınız. Zaman karşılaştırmak için güncellendi. –
(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
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. –
@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
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
alınmıştır Bir süre döngüsünde, başlangıç saatine göre geçerli zamanı kontrol eder. – Lanaru
@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
herhangi key_ ben Pygame kullanarak çapraz platform cevabı gördün herhangi string_ – moooeeeep