Hallo,
Ich bin noch neu bei Python und suche eine Möglichkeit um auf einen input zu warten und wenn keiner nach 30 s kommt, soll das Programm wieder neu starten.
Ich würde mich auf eine baldige Antwort freuen.
MFG waldi
auf input 30s lang warten und dann Programm von vorne starten
Dann musst du dir etwas zb mit dem ncurses Modul bauen. wenn du Windows nutzt muss du wohl das hier dazu installieren https://www.lfd.uci.edu/~gohlke/pythonlibs/#curses
Ich hab da noch einige Probleme mit curses das ist was ich soweit geschrieben haben aber das will noch nicht ganz so funktionieren wie ich mir das vorstelle.
Und bräuchte nochmal hilfe.
LG waldi
Und bräuchte nochmal hilfe.
LG waldi
Code: Alles auswählen
k = 0
i=0
stdscr = curses.initscr()
stdscr.clear()
stdscr.refresh()
while (i<2):
k = stdscr.getch()
if (k == ord('\n')):
break
else:
time.sleep(1)
i=i+1
print('Schleife Ende')
Bitte code-tags benutzen. Und die Antwort auf deine Frage ist hier in der Dokumentation beschrieben:
https://docs.python.org/3/howto/curses.html#user-input
Du musst curses sagen, dass du nicht auf Eingaben warten willst, damit du deine Schleife zum Zeit-verstreichen-lassen laufen lassen kannst.
https://docs.python.org/3/howto/curses.html#user-input
Du musst curses sagen, dass du nicht auf Eingaben warten willst, damit du deine Schleife zum Zeit-verstreichen-lassen laufen lassen kannst.
- __blackjack__
- User
- Beiträge: 13533
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Dann würde ich sagen Timer geht wohl nicht.
Code: Alles auswählen
- (void)countSheep {
unsigned int sheep = 0;
while ( ! [self isAsleep]) { ++sheep; }
}
- __blackjack__
- User
- Beiträge: 13533
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@darktrym: Der OP hat keine GUI sondern will das in der Konsole machen. Spaghetticode würde GOTOs beinhalten. Wenn auf „input warten“ auch tatsächlich ein `input()`-Aufruf gemeint sein darf, ginge es vielleicht tatsächlich mit einem `threading.Timer`, aber nicht alleine sondern man bräuchte noch Signale dazu. Es sieht aber halt so aus als wenn Du Deine Antwort nicht zuende durchdacht hattest, denn nur beim Timer fehlt halt noch der Teil wie man denn eine blockierende Eingabe abbrechen soll.
Mit `select` könnte man vielleicht auch eine Lösung basteln.
Aber wenn auf einzelne Tasten direkt reagiert werden soll, dann ist `curses` wahrscheinlich die einfachste Lösung bevor man anfängt selbst low-level Konsolencode zu schreiben.
Mit `select` könnte man vielleicht auch eine Lösung basteln.
Aber wenn auf einzelne Tasten direkt reagiert werden soll, dann ist `curses` wahrscheinlich die einfachste Lösung bevor man anfängt selbst low-level Konsolencode zu schreiben.
Code: Alles auswählen
- (void)countSheep {
unsigned int sheep = 0;
while ( ! [self isAsleep]) { ++sheep; }
}
Ich hab eine Lösung gefunden
hab damit zwar anfangs noch ein paar Probleme gehabt aber es Funktioniert
hab damit zwar anfangs noch ein paar Probleme gehabt aber es Funktioniert
Code: Alles auswählen
import time
from threading import Thread
from pynput.keyboard import Key, Controller
keyboard = Controller()
eingabe = None
def zeit():
time.sleep(3)
if eingabe != None:
return
keyboard.press(Key.enter)
keyboard.release(Key.enter)
print("Zu langsam")
Thread(target = zeit).start()
eingabe = input("eingabe: ")
print(eingabe)
Puh. Loesung ist jetzt relativ. Wenn ich in Sekunde 29 anfange zu tippen und zur Haelfte durch bin, und dann ballerst du mir ein return rein, ist ja auch eher Mist. Und wenn ich angefangen habe etwas einzutippen wie "12345", aber dein return kommt bei "123", dann unterscheidest du das nicht von einer nicht-eingabe.
- __blackjack__
- User
- Beiträge: 13533
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Und dann hätten wir da noch globale Variablen und das auch noch in Verbindung mit Threads. Iiiiihhh.
Code: Alles auswählen
- (void)countSheep {
unsigned int sheep = 0;
while ( ! [self isAsleep]) { ++sheep; }
}
Code: Alles auswählen
import time
from curses import wrapper, error
def input_with_timeout(screen, text, timeout=30):
then = time.monotonic() + timeout
res = []
while time.monotonic() < then:
try:
key = screen.getkey()
if key == '\n':
return ''.join(res)
except error:
pass
else:
res.append(key)
then = time.monotonic() + timeout
def main(stdscr):
# Clear screen
stdscr.clear()
stdscr.nodelay(True)
while True:
eingabe = input_with_timeout(stdscr, "Bitte eingabe:", 3)
if eingabe is not None:
print("Echte eingabe:", eingabe, end="\r\n")
else:
print("Timeout aufgetreten\r\n")
if __name__ == '__main__':
wrapper(main)