input() abbrechen?
Ich habe einen Rechentrainer Programmiert, und will jetzt, das er, wenn der Benutzer zu lang für die Antwort braucht, das dann das input abbricht. Das mit dem Warten klappt schon, aber ich brauche noch den Input-abbruch-Befehl.
Könnte mir bitte jemand dabei helfen?
Hier ist der Code. Die Stelle, die Ich mit *** Markiert habe, dort fehlt der Input-abbruch-Befehl.
3 Antworten
Also kurz:
Zeile2 ist richtig:
import math as m
Du könntest das Programm so aufbauen, dass es bei einer zu späten Antwort in Zeile 8 auf Anfang() springt. Das funktioniert so einfach aber nicht, weil Du unten parallel eine zweite Programmlogik startest. Versucht man die mit in Anfang() zu packen, kommt man unter anderem aufgrund deines massiven Einsatzes von globalen Variablen in derbe Turbulenzen.
Stell die Frage vielleicht jetzt nochmal rein. Eventuell findet sich jemand, der ausreichend Zeit und Lust hat dir das Programm auf deiner Basis umzuschreiben.
Meiner Meinung nach solltest Du nochmal von vorne anfangen, den Einsatz globaler Variablen vermeiden und einen klaren Aufbau da reinbringen.
das modul Mathe habe ich übrigens nochmal selber geschrieben, das heißt die 2. Zeile ist schon richtig. Und noch eine frage: Wie springe ich zu einer anderen Stelle im Programm?
So, ich hab mir jetzt doch kurz Zeit genommen. Dabei habe ich weitgehend versucht den Programmcode nicht zu stark zu verändern. Den Threading Timer habe ich rausgenommen und eine andere Lösung benutzt:
Änderungen in:
Zeile 92 - 102
Zeile 4, 5 und 27
Kann ich hier so nicht nachvollziehen (Ausgeführt in VS Code):
/usr/bin/env /usr/local/bin/python3 /Users/tonne/.vscode/extensions/ms-python.python-2021.5.842923320/pythonFiles/lib/python/debugpy/launcher 52375 -- "/Users/tonne/import random as r.py"
Wie viele Klassen hast Du absolviert? 4
Erechne diese Aufgabe in 10 Sekunden:
50
+99 =
149
Richtig!!
Wiederholen oder beenden? (Wiederholen = 1 und beenden = 0) 1
Ok
Erechne diese Aufgabe in 10 Sekunden:
62
+81 =
Zu langsam! Das Richtige Ergebnis ist: 143
Wiederholen oder beenden? (Wiederholen = 1 und beenden = 0) 0
Ok. Du hast 1 Punkte
Welche Version hats du? Ich habe 3.9.4
Das "io.UnsupportedOperation: fileno" deutet daraufhin, dass Du das Script in Idle ausführst. Das könnte zu diesem Problem führen. Führe das ganze entweder aus der Powershell, Bash (Linux) direkt aus, oder installiere dir eine vernünftige IDE.
Ich benutze für kleinere Sachen VS Code:
https://code.visualstudio.com/ mit Python Extensions.
Ansonsten PyCharm:
https://www.jetbrains.com/pycharm/
In der Community Version ist auch die letztere umsonst.
3.9.0 und 3.9.5 - da liegt dein Problem nicht. Siehe mein anderer Kommentar.
Leider musst Du oben nach Links scrollen, irgendwie hat der Gutefrage-Edeitor das als Quelltext eingestuft.
Irgentwie verstehe ich nicht ganz, was du mir da schreibst. Und was ist IDE? Und warm darf man das Script nicht in Idle audsführen?
Eine IDE ist eine https://de.wikipedia.org/wiki/Integrierte_Entwicklungsumgebung
Darunter sind eben auch VS Code und Pycharm zusammengefasst, eventuell sogar IDLE (die hier aber nicht funktioniert). Mit der Fehlermeldung bekommst Du es häufiger mal zu tun, wenn Du eben IDLE benutzt, was sowieso kaum jemand macht. Ein Beispiel mit Erklärung findest Du hier: https://www.py4u.net/discuss/14938,
Das Script funktioniert bei mir. Ob von der Kommandozeile mit
python3 scriptname.py
oder in
VS-Code ausgeführt.
Ob ich Python 3.9.0 oder 3.9.5 einsetze ist dabei völlig egal.
Hier übrigens auch in einer Bash auf MacOS. Dazu habe ich dann in der obersten Zeile eine Shebang Zeile eingefügt. Also:
#!/usr/bin/env python3
Jedenfalls:
popel:~ tonne$ ./opel.py
Wie viele Klassen hast Du absolviert? 4
Erechne diese Aufgabe in 10 Sekunden:
86
+90 =
176
Richtig!!
Wiederholen oder beenden? (Wiederholen = 1 und beenden = 0) 1
Ok
Erechne diese Aufgabe in 10 Sekunden:
62
-34 =
Zu langsam! Das Richtige Ergebnis ist: 28
Wiederholen oder beenden? (Wiederholen = 1 und beenden = 0) 0
Ok. Du hast 1 Punkte
Habe den Code jetzt auf Windows 10 getestet, so funktioniert der da wirklich nicht. Das liegt aber nicht an IDLE, sondern wohl daran, das Windows anders damit umgeht als eben Unix oder Unix ähnliche Systeme. Da muss doch noch eine andere Lösung her.
Und ich arbeite mit Windows 10. Was macht eigentlich select.select auf anderen Geräten?
Auf UNIX-like Systemen wartet
select.select([sys.stdin],[],[], 10)[0]:
10 Sekunden lang auf eine Eingabe.
Der optionale timout ist auf 10 gesetzt. Das heißt, so wie ich das verwendet habe, wenn innerhalb eines Zeitraums von 10 Sekunden eine Eingabe stattfindet, wird der Code innerhalb von 'if' ausgeführt, ansonsten eben 'else'.
Bevor Du die Frage jetzt erneut hier reingestellt hast, ist dir nicht aufgefallen das sie mit deinen Angaben schwer zu beantworten sein könnte?
Stelle bitte mal den Code, den Du bisher geschrieben hast zur Verfügung. Eventuell kann man darauf aufbauend dann helfen. Mit den bisherigen Infos und ohne deinen Code ist das sinnlos und sowieso nicht Zielführend.
Der Code ist leider etwas zu lang, um ihn zu ergänzen. wenn ich einfüge, und dann auf senden drücke, dann steht dort, das ich 3000 Zeichen zu viel eingegeben habe.
Der Code besitzt 147 Zeilen, also kein wunder.
Code kann man z.B. hier pasten https://pastebin.com/ und dann hier verlinken. Eventuell kann dir dann besser geholfen werden.
Danke. von dieser Webseite habe ich noch nichts gewusst.
Python 3.9.4 (tags/v3.9.4:1f2e308, Apr 6 2021, 13:40:21) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>>
Habe diesen Quelltext in eine extra Datei geschrieben, damit falls es nicht so läuft wie es laufen sollte, das der alte Quelltext dann nicht verloren geht.