@Superoof123: Da sind noch mehr Fehler drin, was darauf hindeutet, dass Du das nicht *entwickelt* hast, sondern grossteils einfach runtergeschrieben ohne zwischendurch mal ausprobiert zu haben ob das überhaupt funktioniert.
Sternchen-Importe sind Böse™. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen. Und in Deinem Fall funktioniert das auch gar nicht, denn *im* `winsound`-Modul gibt es natürlich nicht das Modul selbst noch mal unter dem Namen, denn `Beep()` versuchst Du ja über den Modulnamen anzusprechen.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Besonders unübersichtlich ist es auf Modulebene das Hauptprogramm und Funktionsdefinitionen zu vermischen.
Funtkionen (und Methoden) bekommen alles was sie ausser Konstanten benötigen, als Argument(e) übergeben. `checkstats()` braucht also `databank` als Argument, und in Folge `GUI()` dann auch.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Auch bei den kleingeschriebenen Namen fehlen bei Dir manchmalUnterstrichezwischendenWorten. Das ist schlecht zu lesen.
Funktionen (und Methoden) werden üblicherweise nach der Tatigkeit benannt, die sie durchführen. Damit der Leser weiss was sie tun und um sie besser von eher passiven Werten unterscheiden zu können.
Entscheide Dich für eine Sprache bei den Namen. Am besten Englisch, weil auch die Schlüsselworte der Programmiersprache und die Namen aus Modulen und Bibliotheken in Englisch sind. Am schlimmsten ist so Denglisch wie `databank`. Entweder `database` oder `datenbank`. Oder einfach `file` oder `lines`, denn dafür steht dieses Objekt.
Dateimodi mit "+" sind bei Textdateien so gut wie immer falsch. Einfach nur "r". Mehr als lesen wird hier ja auch gar nicht gemacht.
Beim öffnen von Textdateien sollte man immer die Kodierung mit angeben in der die Datei ist. Hier reicht ASCII, denn es scheinen ja nur Zahlen drin zu sein.
Dateien die man öffnet, sollte man auch wieder schliessen. Am besten verwendet man dazu die ``with``-Anweisung.
`databankstr` ist auch falsch als Name, falls das `str` für Zeichenkette stehen sollte. Grunddatentypen haben in Namen nichts zu suchen, denn die ändert man im Laufe der Entwicklung gerne mal zu was spezifischerem oder selbst programmierten, und dann hat man überall falsche Namen oder muss alle betroffenen Namen suchen und ändern. Und da später immer wieder der Inhalt der Zeilen in ganze Zahlen umgewandelt werden, sollte man das sinnvollerweise *einmal* gleich beim einlesen erledigen.
Statt umständlich eine Schleife zu schreiben, welche die Zeilen einzeln an eine anfangs leere Liste anhängt, kann man auch einfach `list()` aufrufen. Das sammelt alles aus dem übergebenen iterierbaren Objekt in einer neuen Liste und gibt die zurück.
Zwischenstand:
Code: Alles auswählen
with open("fnafdatenbank.txt", "r", encoding="ascii") as lines:
stats = list(map(int, lines))
Da später aber über Namen/Zeichenketten auf die Werte zugegriffen werden soll, ist eine Liste die falsche Datenstruktur. Abbildungen von Schlüsseln auf Werte werden in einem Wörterbuch (`dict`) gespeichert.
Um eine Leerzeile ”auszugeben” braucht man `print()` kein Argument zu übergeben.
`capitalize()` ist für *ein* Zeichen nicht so wirklich sinnvoll. Da reicht `upper()` völlig aus. Und man muss die Methode auch *aufrufen*. Im Moment gibt `GUI()` die *Methode* zurück, statt dem Ergebnis des Aufrufs.
`type` ist der Name einer eingebauten Funktion, den sollte man nicht für etwas anderes verwenden.
Es wird versucht eine Funktion `rebootbeep()` aufzurufen die es nicht gibt. Ich nehme mal an `rebootpeep()` sollte eigentlich *so* heissen.
Man kopiert keinen Code immer wieder und passt ihn leicht an. Dafür gibt es Funktionen und/oder Schleifen.
``else: pass`` macht keinen Sinn.
Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
import winsound
from time import sleep
SYSTEM_NAMES = ["audio devices", "camera system", "ventilation"]
def reboot_beep():
winsound.Beep(1300, 250)
def check_status(system_name_to_status, system_name):
return "okay" if system_name_to_status[system_name] == 1 else "error"
def show_menu(system_name_to_status):
print("System restart")
print("menu>>>")
print()
for name in system_name_to_status.keys():
print(name, check_status(system_name_to_status, name))
print()
print("reboot all: type R")
print("exit: type E")
return input(">>").upper()
def main():
with open("fnafdatenbank.txt", "r", encoding="ascii") as lines:
system_name_to_status = dict(zip(SYSTEM_NAMES, map(int, lines)))
while True:
answer = show_menu(system_name_to_status)
if answer == "R":
for i in range(10):
print(
"rebooting{:<3}[{:<10}]".format("." * (i % 3 + 1), "I" * i),
end="\r",
flush=True,
)
reboot_beep()
sleep(1)
print("system sucessfully rebooted>>>")
elif answer == "E":
return
if __name__ == "__main__":
main()