Menue für die Tonne?
Verfasst: Donnerstag 10. Oktober 2024, 21:04
Hallo ich hatte aus gegebenem Anlaß (jemand hat im Java-Forum eine Menue-Steuerung ohne Swing vorgestellt und die war buggy und ich habe sie solange repariert, bis sie ging) mich an ein altes Programm aus dem letzten Jahrtausend erinnert, die auch sowas gemacht hat, Menue ohne alles dafür in dBaseIV
Der Vorteil meiner Lösung damals war, das Menue war über eine Datenbank konfigurierbar.
Ok Jahrzehnte später habe ich aus dem dBase Excel bzw CSV gemacht und bin mit Turbo-Pascal herangegangen. Dabei muß ich aber wohl einen kleinen Fehler eingebaut haben bei der Portierung oder es ging auch gar nicht so in Pascal wie in dBase. Also habe ich 2 Tage gesucht und nicht gefunden - das Programm läuft ja nur ist eine unerklärliche Ausnahmebehandlung drin, die das Auge für den Algorithmus mächtig stört.
Ich habe chatGPT gefragt, der hat es ehrlich gesagt nur verschlimmbessert, immerhin gewann ich so die Idee: weg von der Datei/CSV und lieber am Anfang einlesen in eine Liste.
Den hier gezeigten Code habe ich zu 60% selbst entworfen (vor allem den CSV-Reader etc). chatGPT hat dann die Ablauflogik ergänzt - teils freiwillig. teils nach Diskussion in deutscher Sprache und teils nach Vorlage interessanterweise lieber der dBase Quelle. An mein portiertes Pascal wollte er nicht ran bzw es kam nur Schrott dabei heraus. Nun würde ich gerne euer vernichtendes Urteil dazu hören
Ich habe die chatGPT Kommentare extra mal drin gelassen - ehrlich gesagt stören und verwirren die eher und ich weiß selbst daß die Struktur nicht gut ist. Meine dementsprechende Bitte um Modernisierung und Optimierung hat chatGPT zwar umgesetzt (Klassen, Enumeration, Annotationen und Logging), dabei aber leider eine falsche alte Version umgestellt, die dann wieder buggy war. Ich habe es 3x versucht, auch nur mit
Logging (das einzige was mich interessierte). Leider kann der sich nie die aktuelle fehlerfreie Version merken selbst wenn ich sie eingebe und greift immer wieder auf altes zurück und das hat mich am Ende so genervt, daß ich gesagt habe - okay Schluß damit, das ist ein Fall fürs Forum.
HIer übrigens meine gefakte EIngabedatei (die echte behandelt Fußball-Ligaverwaltung), und ja ich habe absichtlich Fehler eingebaut, damit alle Zweige auch duchlaufen werden.
Wie würde ich hier weiter vorgehen? Auf jeden Fall mal die störenden Kommentare rausschmeißen, dann ggf ein paar Variablen umbenennen und tatsächlich eine Klasse Menue-Kontroller erstellen (ohne die CSV-Lese Geschichte). Ich denke mal eine saubere Modularität sieht auch anders aus - nicht nur in Python, also an dem Spaghetti muß ich auch noch was machen, vielleicht reicht es ja da alles mal komplett auf einem Screen zu sehen.
Ich habe das aber etwas hinten an geschoben und mir lieber Gerüste (nur CSV Lesen/Auswerten und zwei Zugriffsfunktionen für das Array) in jeweils Pascal und Java erstellt und wollte nun mal sehen, wo ich die Logik besser hinbekomme. Natürlich weiß ich daß es nicht so schön wie in Python sein wird - aber okay werdet ihr sagen, in Python ist es ja auch alles andere als schön. Ich tppe mal am Ende auf die Gefallensreihenfolge
Python-Pascal-Java - kann mich aber irren.

Ok Jahrzehnte später habe ich aus dem dBase Excel bzw CSV gemacht und bin mit Turbo-Pascal herangegangen. Dabei muß ich aber wohl einen kleinen Fehler eingebaut haben bei der Portierung oder es ging auch gar nicht so in Pascal wie in dBase. Also habe ich 2 Tage gesucht und nicht gefunden - das Programm läuft ja nur ist eine unerklärliche Ausnahmebehandlung drin, die das Auge für den Algorithmus mächtig stört.
Ich habe chatGPT gefragt, der hat es ehrlich gesagt nur verschlimmbessert, immerhin gewann ich so die Idee: weg von der Datei/CSV und lieber am Anfang einlesen in eine Liste.
Den hier gezeigten Code habe ich zu 60% selbst entworfen (vor allem den CSV-Reader etc). chatGPT hat dann die Ablauflogik ergänzt - teils freiwillig. teils nach Diskussion in deutscher Sprache und teils nach Vorlage interessanterweise lieber der dBase Quelle. An mein portiertes Pascal wollte er nicht ran bzw es kam nur Schrott dabei heraus. Nun würde ich gerne euer vernichtendes Urteil dazu hören
Code: Alles auswählen
import csv
def read_csv(filename):
data = []
with open(filename, newline='') as csvfile:
reader = csv.DictReader(csvfile, delimiter=';')
for row in reader:
row['M1'] = int(row['M1'])
row['M2'] = int(row['M2'])
row['M3'] = int(row['M3'])
row['N1'] = int(row['N1'])
row['N2'] = int(row['N2'])
row['L1'] = int(row['L1'])
data.append(row)
return data
def search_csv_2(data, m1, m2):
result = []
for row in data:
if row['M1'] == m1 and row['M2'] == m2 and row['PROG'] != 'D':
result.append((row['PROG'], row['BEZEICHNER'], row['CODE'], row['M3'], row['N1'], row['N2'], row['L1']))
return result
def show_menu(data, m1, m2, bezeichnung="Hauptmenü"):
menu_items = search_csv_2(data, m1, m2)
# Wenn keine Menüeinträge vorhanden sind, sofort Fehlermeldung anzeigen
if not menu_items:
print("Ungültige Auswahl.")
return menu_items
# Andernfalls Menü anzeigen
print(f"\n{bezeichnung}:")
for prog, bezeichner, code, m3, n1, n2, l1 in menu_items:
print(f"{m3}: {bezeichner}")
print("0: Zurück")
return menu_items
def find_menu_item(data, m1, m2, m3):
for row in data:
if row['M1'] == m1 and row['M2'] == m2 and row['M3'] == m3:
return row
return None
def run_menu(data):
m1, m2 = 0, 0 # Start im Hauptmenü
menu_stack = [] # Stack für die Menüs
bezeichnung = "Hauptmenü" # Start mit "Hauptmenü"
menu_active = True
menu_displayed = False # Neu: Um zu steuern, ob das Menü erneut angezeigt wird
while menu_active:
if not menu_displayed: # Nur wenn das Menü nicht bereits angezeigt wurde
menu_items = show_menu(data, m1, m2, bezeichnung)
menu_displayed = True # Menü wurde jetzt angezeigt
choice = int(input("Auswahl: "))
if choice == 0:
if not menu_stack:
print("Programmende.")
menu_active = False
else:
# Zurück ins übergeordnete Menü
m1, m2, bezeichnung = menu_stack.pop()
menu_displayed = False # Menü muss wieder angezeigt werden
else:
selected_item = find_menu_item(data, m1, m2, choice)
if selected_item:
prog = selected_item['PROG']
if prog.lower() == 'p':
print(f"Starte Programm: {selected_item['CODE']}")
elif prog.lower() == 'm':
# Prüfe, ob das Untermenü gültige Einträge hat
n1, n2 = selected_item['N1'], selected_item['N2']
submenu_items = search_csv_2(data, n1, n2)
if submenu_items: # Nur wenn es gültige Einträge gibt
# Merke das aktuelle Menü
menu_stack.append((m1, m2, bezeichnung))
# Gehe ins Untermenü
m1, m2 = n1, n2
bezeichnung = selected_item['BEZEICHNER'] # Bezeichnung merken
menu_displayed = False # Menü muss für das neue Untermenü angezeigt werden
else:
# Zeige Fehlermeldung, aber ändere M1 und M2 nicht
print("Ungültige Auswahl.")
else:
print("Ungültige Auswahl.")
# Menü bleibt sichtbar, also bleibt menu_displayed = True unverändert
def main():
csv_data = read_csv('freiburg.csv')
run_menu(csv_data)
if __name__ == "__main__":
main()
Logging (das einzige was mich interessierte). Leider kann der sich nie die aktuelle fehlerfreie Version merken selbst wenn ich sie eingebe und greift immer wieder auf altes zurück und das hat mich am Ende so genervt, daß ich gesagt habe - okay Schluß damit, das ist ein Fall fürs Forum.
HIer übrigens meine gefakte EIngabedatei (die echte behandelt Fußball-Ligaverwaltung), und ja ich habe absichtlich Fehler eingebaut, damit alle Zweige auch duchlaufen werden.
Code: Alles auswählen
M1;M2;M3;PROG;BEZEICHNER;CODE;N1;N2;L1
0;0;1;P;Anwendung 1;Anw-1;99;99;0
0;0;2;P;Anwendung 2;Anw-2;99;99;0
0;0;4;M;Untermenue 1;99;0;4;1
0;0;5;M;Untermenue 2;99;0;5;0
0;0;9;D;(frei);0;0;9;0
0;6;1;M;Untermenue 1-1;99;4;1;1
0;6;2;M;Untermenue 1-2;99;4;2;0
0;6;3;P;Anwendung 1-3;Anw-1-3;99;99;0
0;5;1;M;Untermenue 2-1;99;5;1;1
0;5;2;M;Untermenue 2-2;99;5;2;0
0;5;3;P;Anwendung 2-3;Anw-2-3;99;99;0
4;1;1;P;Anwendung 1-1-1;Anw-1-1-1;99;99;0
4;1;2;P;Anwendung 1-1-2;Anw-1-1-2;99;99;0
5;1;1;P;Anwendung 2-1-1;Anw-2-1-1;99;99;0
5;1;2;P;Anwendung 2-1-2;Anw-2-1-2;99;99;0
4;2;1;P;Anwendung 1-2-1;Anw-1-2-1;99;99;0
4;2;2;P;Anwendung 1-2-2;Anw-1-2-2;99;99;0
5;3;1;P;Anwendung 2-2-1;Anw-2-2-1;99;99;0
5;3;2;P;Anwendung 2-2-2;Anw-2-2-2;99;99;0
Ich habe das aber etwas hinten an geschoben und mir lieber Gerüste (nur CSV Lesen/Auswerten und zwei Zugriffsfunktionen für das Array) in jeweils Pascal und Java erstellt und wollte nun mal sehen, wo ich die Logik besser hinbekomme. Natürlich weiß ich daß es nicht so schön wie in Python sein wird - aber okay werdet ihr sagen, in Python ist es ja auch alles andere als schön. Ich tppe mal am Ende auf die Gefallensreihenfolge
Python-Pascal-Java - kann mich aber irren.