Python das Nachfassdatum wird nicht aktuallisiert bei der Ansicht bearbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
viSion1990
User
Beiträge: 1
Registriert: Donnerstag 9. Mai 2024, 08:58

Hallo zusammen, ich arbeite hierdran schon seit Tagen, ich komme aber nicht weiter. Wenn ich den Button zum bearbeiten klicke läd er mir alle bestehenden Kundendaten in das Formular, soweit so gut. wenn ich die Daten ändere und Speichere schreibt er mir das geänderte in die txt. das passt auch. Das problem habe ich aber mit dem Nachfassdatum wenn ich das ändere und speichere, wird es in der Tabelle dann korrekt angezeigt aber in der txt wird es nicht überschrieben.

Hier das Dateiformat von den daten in der TxT.
30.05.2024 , Max Mustermann, Max Mustermann1, Appenzell1, TU/Gu1, 10001, 2001, 3.4, ss

Danke schon vorab für die Bemühungen. Grüsse :ugeek:



import tkinter as tk
from tkinter import ttk, messagebox
from tkcalendar import DateEntry
from datetime import datetime

def remove_empty_lines(file_path):
# Liste zum Speichern der bereinigten Zeilen
cleaned_lines = []

# Daten aus der Datei lesen und leere Zeilen entfernen
with open(file_path, "r") as file:
for line in file:
if line.strip():
cleaned_lines.append(line)

# Bereinigte Daten zurück in die Datei schreiben
with open(file_path, "w") as file:
file.writelines(cleaned_lines)

# Pfad zur Kundenverwaltungsdatei
file_path = "kundenverwaltung.txt"

# Aufruf der Funktion, um leere Zeilen zu entfernen
remove_empty_lines(file_path)
class AddCustomerForm:
def __init__(self, root, on_submit):
self.root = root
self.on_submit = on_submit
self.root.title("Neuen Datensatz hinzufügen")

# Label und Kalender für Nachfassdatum
self.lbl_nachfassdatum = ttk.Label(root, text="Nachfassdatum:")
self.lbl_nachfassdatum.grid(row=0, column=0, padx=5, pady=5)
self.cal_nachfassdatum = DateEntry(root, width=12, background='darkblue', foreground='white', borderwidth=2, locale='de_DE')
self.cal_nachfassdatum.grid(row=0, column=1, padx=5, pady=5)

# Label und Entry für Kunde
self.lbl_kunde = ttk.Label(root, text="Kunde:")
self.lbl_kunde.grid(row=1, column=0, padx=5, pady=5)
self.ent_kunde = ttk.Entry(root)
self.ent_kunde.grid(row=1, column=1, padx=5, pady=5)

# Label und Entry für Kontakt
self.lbl_kontakt = ttk.Label(root, text="Kontakt:")
self.lbl_kontakt.grid(row=2, column=0, padx=5, pady=5)
self.ent_kontakt = ttk.Entry(root)
self.ent_kontakt.grid(row=2, column=1, padx=5, pady=5)

# Label und Dropdown-Liste für Kanton
self.lbl_kanton = ttk.Label(root, text="Kanton:")
self.lbl_kanton.grid(row=3, column=0, padx=5, pady=5)
self.combo_kanton = ttk.Combobox(root, values=["Liechtenstein","Appenzell","Aargau (AG)", "Bern (BE)", "Fribourg / Freiburg (FR)", "Genève / Genf (GE)", "Glarus (GL)", "Graubünden (GR)", "Jura (JU)", "Luzern (LU)", "Neuchâtel / Neuenburg (NE)", "St.Gallen (SG)", "Schaffhausen (SH)", "Schwyz (SZ)", "Solothurn (SO)", "Thurgau (TG)", "Ticino / Tessin (TI)", "Uri (UR)", "Valais / Wallis (VS)", "Vaud / Waadt (VD)", "Zug (ZG)", "Zürich (ZH)"])
self.combo_kanton.grid(row=3, column=1, padx=5, pady=5)

# Label und Dropdown-Liste für Kundenart
self.lbl_kundenart = ttk.Label(root, text="Kundenart:")
self.lbl_kundenart.grid(row=4, column=0, padx=5, pady=5)
self.combo_kundenart = ttk.Combobox(root, values=["Installateur", "Planer", "Architekt", "GU/TU"])
self.combo_kundenart.grid(row=4, column=1, padx=5, pady=5)

# Label und Entry für Umsatz
self.lbl_umsatz = ttk.Label(root, text="Umsatz:")
self.lbl_umsatz.grid(row=5, column=0, padx=5, pady=5)
self.ent_umsatz = ttk.Entry(root)
self.ent_umsatz.grid(row=5, column=1, padx=5, pady=5)

# Label und Entry für Mitarbeiter
self.lbl_mitarbeiter = ttk.Label(root, text="Mitarbeiter:")
self.lbl_mitarbeiter.grid(row=6, column=0, padx=5, pady=5)
self.ent_mitarbeiter = ttk.Entry(root)
self.ent_mitarbeiter.grid(row=6, column=1, padx=5, pady=5)

# Label und Entry für KPI
self.lbl_kpi = ttk.Label(root, text="KPI:")
self.lbl_kpi.grid(row=7, column=0, padx=5, pady=5)
self.ent_kpi = ttk.Entry(root)
self.ent_kpi.grid(row=7, column=1, padx=5, pady=5)
self.ent_kpi.config(state=tk.DISABLED) # KPI-Eingabefeld deaktivieren

# Label und Textfeld für Notizen im Formular
self.lbl_notizen = ttk.Label(root, text="Notizen:")
self.lbl_notizen.grid(row=8, column=0, padx=5, pady=5)
self.txt_notizen = tk.Text(root, height=10, width=60) # Anpassen der Größe auf 10 cm hoch und 10 cm lang
self.txt_notizen.grid(row=8, column=1, padx=5, pady=5)

# Button zum Speichern des Datensatzes
self.btn_submit = ttk.Button(root, text="Speichern", command=self.submit)
self.btn_submit.grid(row=9, column=0, columnspan=2, padx=5, pady=5)

def submit(self):
# Daten aus den Eingabefeldern abrufen
nachfassdatum = self.cal_nachfassdatum.get()
kunde = self.ent_kunde.get()
kontakt = self.ent_kontakt.get()
kanton = self.combo_kanton.get()
kundenart = self.combo_kundenart.get()
umsatz = self.ent_umsatz.get()
mitarbeiter = self.ent_mitarbeiter.get()
notizen = self.txt_notizen.get("1.0", tk.END)

# Überprüfen, ob alle Felder ausgefüllt sind
if nachfassdatum and kunde and kontakt and kanton and kundenart and umsatz and mitarbeiter and notizen:
# Berechne den KPI
kpi = AddCustomerForm.calculate_kpi(umsatz, mitarbeiter)
# Aufrufen der Callback-Funktion mit den eingegebenen Daten und dem berechneten KPI
self.on_submit(nachfassdatum, kunde, kontakt, kanton, kundenart, umsatz, mitarbeiter, kpi, notizen)
# Formular schließen
self.root.destroy()
else:
# Fehlermeldung anzeigen, wenn nicht alle Felder ausgefüllt sind
messagebox.showerror("Fehler", "Bitte füllen Sie alle Felder aus.")

@staticmethod
def calculate_kpi(umsatz, mitarbeiter):
# Skala für Umsatz: 1=CHF 0-50000, 5=400000
umsatz_scale = [(0, 50000), (100000, 150000), (200000, 250000), (300000, 350000), (400000, float('inf'))]
# Skala für Mitarbeiter: 1=0-5 Stück, 5=40 Stück
mitarbeiter_scale = [(0, 5), (10, 15), (20, 25), (30, 35), (40, float('inf'))]

# Standardwerte für Ratings
umsatz_rating = 1
mitarbeiter_rating = 1

# Bestimme die Bewertung für Umsatz
for i, (low, high) in enumerate(umsatz_scale):
if low <= float(umsatz) <= high:
umsatz_rating = i + 1
break

# Bestimme die Bewertung für Mitarbeiter
for i, (low, high) in enumerate(mitarbeiter_scale):
if low <= float(mitarbeiter) <= high:
mitarbeiter_rating = i + 1
break

# Berechne den KPI mit der Gewichtung: 60% Mitarbeiter, 40% Umsatz
kpi = (0.4 * umsatz_rating) + (0.6 * mitarbeiter_rating)
return round(kpi, 2)

def edit_customer(self):
# Funktion zum Bearbeiten ausgewählter Datensätze
selected_items = self.tree.selection()
if len(selected_items) != 1:
messagebox.showerror("Fehler", "Bitte wählen Sie genau einen Datensatz zum Bearbeiten aus.")
return

item = selected_items[0]
values = self.tree.item(item, "values")

# Öffnen des Formulars zum Bearbeiten mit den vorhandenen Werten
form = tk.Toplevel()
edit_customer_form = EditCustomerForm(form, self.update_customer, values)

from tkinter import ttk, messagebox
import tkinter as tk
from tkcalendar import DateEntry
from datetime import datetime

class EditCustomerForm:
def __init__(self, root, on_submit, values):
self.root = root
self.on_submit = on_submit
self.values = values
self.root.title("Kunde bearbeiten")

# Label und Kalender für Nachfassdatum
self.lbl_nachfassdatum = ttk.Label(root, text="Nachfassdatum:")
self.lbl_nachfassdatum.grid(row=0, column=0, padx=5, pady=5)
self.cal_nachfassdatum = DateEntry(root, width=12, background='darkblue', foreground='white', borderwidth=2, locale='de_DE')
self.cal_nachfassdatum.grid(row=0, column=1, padx=5, pady=5)
self.cal_nachfassdatum.set_date(values[0])

# Label und Entry für Kunde
self.lbl_kunde = ttk.Label(root, text="Kunde:")
self.lbl_kunde.grid(row=1, column=0, padx=5, pady=5)
self.ent_kunde = ttk.Entry(root)
self.ent_kunde.grid(row=1, column=1, padx=5, pady=5)
self.ent_kunde.insert(0, values[1])

# Label und Entry für Kontakt
self.lbl_kontakt = ttk.Label(root, text="Kontakt:")
self.lbl_kontakt.grid(row=2, column=0, padx=5, pady=5)
self.ent_kontakt = ttk.Entry(root)
self.ent_kontakt.grid(row=2, column=1, padx=5, pady=5)
self.ent_kontakt.insert(0, values[2])

# Label und Dropdown-Liste für Kanton
self.lbl_kanton = ttk.Label(root, text="Kanton:")
self.lbl_kanton.grid(row=3, column=0, padx=5, pady=5)
self.combo_kanton = ttk.Combobox(root, values=["Aargau (AG)", "Appenzell", "Bern (BE)", "Fribourg / Freiburg (FR)", "Genève / Genf (GE)", "Glarus (GL)", "Graubünden (GR)", "Jura (JU)", "Liechtenstein", "Luzern (LU)", "Neuchâtel / Neuenburg (NE)", "St.Gallen (SG)", "Schaffhausen (SH)", "Schwyz (SZ)", "Solothurn (SO)", "Thurgau (TG)", "Ticino / Tessin (TI)", "Uri (UR)", "Valais / Wallis (VS)", "Vaud / Waadt (VD)", "Zug (ZG)", "Zürich (ZH)"])
self.combo_kanton.grid(row=3, column=1, padx=5, pady=5)
self.combo_kanton.set(values[3])

# Label und Dropdown-Liste für Kundenart
self.lbl_kundenart = ttk.Label(root, text="Kundenart:")
self.lbl_kundenart.grid(row=4, column=0, padx=5, pady=5)
self.combo_kundenart = ttk.Combobox(root, values=["Installateur", "Planer", "Architekt", "GU/TU"])
self.combo_kundenart.grid(row=4, column=1, padx=5, pady=5)
self.combo_kundenart.set(values[4])

# Label und Entry für Umsatz
self.lbl_umsatz = ttk.Label(root, text="Umsatz:")
self.lbl_umsatz.grid(row=5, column=0, padx=5, pady=5)
self.ent_umsatz = ttk.Entry(root)
self.ent_umsatz.grid(row=5, column=1, padx=5, pady=5)
self.ent_umsatz.insert(0, values[5])

# Label und Entry für Mitarbeiter
self.lbl_mitarbeiter = ttk.Label(root, text="Mitarbeiter:")
self.lbl_mitarbeiter.grid(row=6, column=0, padx=5, pady=5)
self.ent_mitarbeiter = ttk.Entry(root)
self.ent_mitarbeiter.grid(row=6, column=1, padx=5, pady=5)
self.ent_mitarbeiter.insert(0, values[6])

# Label und Entry für KPI
self.lbl_kpi = ttk.Label(root, text="KPI:")
self.lbl_kpi.grid(row=7, column=0, padx=5, pady=5)
self.ent_kpi = ttk.Entry(root)
self.ent_kpi.grid(row=7, column=1, padx=5, pady=5)
self.ent_kpi.insert(0, values[7])
self.ent_kpi.config(state=tk.DISABLED) # KPI-Eingabefeld deaktivieren

# Label und Textfeld für Notizen im Formular
self.lbl_notizen = ttk.Label(root, text="Notizen:")
self.lbl_notizen.grid(row=8, column=0, padx=5, pady=5)
self.txt_notizen = tk.Text(root, height=10, width=60) # Anpassen der Größe auf 10 cm hoch und 10 cm lang
self.txt_notizen.grid(row=8, column=1, padx=5, pady=5)
self.txt_notizen.insert(tk.END, values[8])

# Button zum Speichern der Änderungen
self.btn_submit = ttk.Button(root, text="Speichern", command=self.submit)
self.btn_submit.grid(row=9, column=0, columnspan=2, padx=5, pady=5)

# Berechnen und Anzeigen des KPI beim Laden des Formulars
self.calculate_and_display_kpi()

def submit(self):
# Daten aus den Eingabefeldern abrufen
nachfassdatum = self.cal_nachfassdatum.get()
kunde = self.ent_kunde.get()
kontakt = self.ent_kontakt.get()
kanton = self.combo_kanton.get()
kundenart = self.combo_kundenart.get()
umsatz = self.ent_umsatz.get()
mitarbeiter = self.ent_mitarbeiter.get()
notizen = self.txt_notizen.get("1.0", tk.END)

# Überprüfen, ob alle Felder ausgefüllt sind
if nachfassdatum and kunde and kontakt and kanton and kundenart and umsatz and mitarbeiter and notizen:
try:
# Nachfassdatum in das richtige Format konvertieren
nachfassdatum = datetime.strptime(nachfassdatum, "%d.%m.%Y")
# Berechnung des KPI und Aufruf der Callback-Funktion
kpi = self.calculate_kpi(umsatz, mitarbeiter)

# Daten speichern und Fenster schließen
self.on_submit(nachfassdatum, kunde, kontakt, kanton, kundenart, umsatz, mitarbeiter, kpi, notizen)

# Update der Datei 'Kundenverwaltung.txt'
with open('Kundenverwaltung.txt', 'r') as file:
lines = file.readlines()

with open('Kundenverwaltung.txt', 'w') as file:
for line in lines:
if line.startswith(self.values[0]):
line = f"{nachfassdatum.strftime('%d.%m.%y')}, {kunde}, {kontakt}, {kanton}, {kundenart}, {umsatz}, {mitarbeiter}, {kpi}, {notizen}\n"
file.write(line)

self.root.destroy()
except ValueError:
# Fehlermeldung anzeigen, wenn das Nachfassdatum ungültig ist
messagebox.showerror("Fehler", "Bitte wählen Sie ein gültiges Nachfassdatum aus.")
else:
# Fehlermeldung anzeigen, wenn nicht alle Felder ausgefüllt sind
messagebox.showerror("Fehler", "Bitte füllen Sie alle Felder aus.")




def calculate_and_display_kpi(self):
# Berechnung des KPI und Anzeige im Formular
umsatz = self.ent_umsatz.get()
mitarbeiter = self.ent_mitarbeiter.get()
kpi = self.calculate_kpi(umsatz, mitarbeiter)
self.ent_kpi.config(state=tk.NORMAL)
self.ent_kpi.delete(0, tk.END)
self.ent_kpi.insert(0, kpi)
self.ent_kpi.config(state=tk.DISABLED)

def calculate_kpi(self, umsatz, mitarbeiter):
# Berechnung des KPI
# Skala für Umsatz: 1=CHF 0-50000, 5=400000
umsatz_scale = [(0, 50000), (100000, 150000), (200000, 250000), (300000, 350000), (400000, float('inf'))]
# Skala für Mitarbeiter: 1=0-5 Stück, 5=40 Stück
mitarbeiter_scale = [(0, 5), (10, 15), (20, 25), (30, 35), (40, float('inf'))]

# Standardwerte für Ratings
umsatz_rating = 1
mitarbeiter_rating = 1

# Bestimme die Bewertung für Umsatz
for i, (low, high) in enumerate(umsatz_scale):
if low <= float(umsatz) <= high:
umsatz_rating = i + 1
break

# Bestimme die Bewertung für Mitarbeiter
for i, (low, high) in enumerate(mitarbeiter_scale):
if low <= float(mitarbeiter) <= high:
mitarbeiter_rating = i + 1
break

# Berechne den KPI mit der Gewichtung: 60% Mitarbeiter, 40% Umsatz
kpi = (0.4 * umsatz_rating) + (0.6 * mitarbeiter_rating)
return round(kpi, 2)

def submit(self):
# Daten aus den Eingabefeldern abrufen
nachfassdatum = self.cal_nachfassdatum.get()
kunde = self.ent_kunde.get()
kontakt = self.ent_kontakt.get()
kanton = self.combo_kanton.get()
kundenart = self.combo_kundenart.get()
umsatz = self.ent_umsatz.get()
mitarbeiter = self.ent_mitarbeiter.get()
kpi = self.ent_kpi.get()
notizen = self.txt_notizen.get("1.0", tk.END)

# Überprüfen, ob alle Felder ausgefüllt sind
if nachfassdatum and kunde and kontakt and kanton and kundenart and umsatz and mitarbeiter and kpi and notizen:
# Aufrufen der Callback-Funktion mit den eingegebenen Daten
self.on_submit(nachfassdatum, kunde, kontakt, kanton, kundenart, umsatz, mitarbeiter, kpi, notizen)
# Formular schließen
self.root.destroy()
else:
# Fehlermeldung anzeigen, wenn nicht alle Felder ausgefüllt sind
messagebox.showerror("Fehler", "Bitte füllen Sie alle Felder aus.")

class CustomerApp:
def __init__(self, root):
self.root = root
self.root.title("Kundenverwaltung")

# Tabelle erstellen und anpassen
self.tree = ttk.Treeview(root, columns=("Nachfassdatum", "Kunde", "Kontakt", "Kanton", "Kundenart", "Umsatz", "Mitarbeiter", "KPI", "Notizen"), show="headings")
self.tree.heading("Nachfassdatum", text="Nachfassdatum", anchor=tk.W)
self.tree.heading("Kunde", text="Kunde", anchor=tk.W)
self.tree.heading("Kontakt", text="Kontakt", anchor=tk.W)
self.tree.heading("Kanton", text="Kanton", anchor=tk.W)
self.tree.heading("Kundenart", text="Kundenart", anchor=tk.W)
self.tree.heading("Umsatz", text="Umsatz", anchor=tk.W)
self.tree.heading("Mitarbeiter", text="Mitarbeiter", anchor=tk.W)
self.tree.heading("KPI", text="KPI", anchor=tk.W)
self.tree.heading("Notizen", text="Notizen", anchor=tk.W)

total_width = root.winfo_screenwidth() * 0.9 # 90% der Bildschirmbreite
column_widths = [total_width * 0.1] * 8 + [total_width * 0.2] # Breite der Spalten festlegen
column_widths[-1] = total_width * 0.4 # Letzte Spalte (Notizen) breiter machen


for i, column in enumerate(self.tree["columns"]):
self.tree.column(column, width=int(column_widths), minwidth=50)

self.tree.pack(fill="both", expand=True) # Anpassen der Tabelle

# Button zum Hinzufügen eines neuen Datensatzes
self.btn_add = ttk.Button(root, text="Hinzufügen", command=self.add_customer)
self.btn_add.pack(pady=5)

# Button zum Löschen von ausgewählten Datensätzen
self.btn_delete = ttk.Button(root, text="Löschen", command=self.delete_customer)
self.btn_delete.pack(pady=5)

# Button zum Bearbeiten ausgewählter Datensätze
self.btn_edit = ttk.Button(root, text="Bearbeiten", command=self.edit_customer)
self.btn_edit.pack(pady=5)

# Daten aus der Textdatei lesen und in die Tabelle einfügen
self.read_data()

def add_customer(self):
# Funktion zum Öffnen des Formulars zum Hinzufügen eines neuen Datensatzes
form = tk.Toplevel()
add_customer_form = AddCustomerForm(form, self.save_customer)

def save_customer(self, nachfassdatum, kunde, kontakt, kanton, kundenart, umsatz, mitarbeiter, kpi, notizen):
# Überprüfen, ob alle Felder ausgefüllt sind
if nachfassdatum and kunde and kontakt and kanton and kundenart and umsatz and mitarbeiter and kpi and notizen:
# Funktion zum Speichern des neuen Datensatzes
with open("kundenverwaltung.txt", "a") as f:
f.write(f"{nachfassdatum}, {kunde}, {kontakt}, {kanton}, {kundenart}, {umsatz}, {mitarbeiter}, {kpi}, {notizen}\n")
# Daten in die Tabelle einfügen
self.tree.insert("", "end", values=(nachfassdatum, kunde, kontakt, kanton, kundenart, umsatz, mitarbeiter, kpi, notizen))
else:
# Fehlermeldung anzeigen, wenn nicht alle Felder ausgefüllt sind
messagebox.showerror("Fehler", "Bitte füllen Sie alle Felder aus.")



def delete_customer(self):
# Funktion zum Löschen ausgewählter Datensätze
selected_items = self.tree.selection()
for item in selected_items:
# Kundenname des ausgewählten Eintrags abrufen
kunde = self.tree.item(item, "values")[1]

# Datensatz aus der Tabelle löschen
self.tree.delete(item)

# Daten aus der Datei entfernen
with open("kundenverwaltung.txt", "r") as f:
lines = f.readlines()
with open("kundenverwaltung.txt", "w") as f:
for line in lines:
# Wenn der Kundenname nicht in der Zeile enthalten ist, schreibe die Zeile zurück in die Datei
if kunde not in line:
f.write(line)


def edit_customer(self):
# Funktion zum Bearbeiten ausgewählter Datensätze
selected_items = self.tree.selection()
if len(selected_items) != 1:
messagebox.showerror("Fehler", "Bitte wählen Sie genau einen Datensatz zum Bearbeiten aus.")
return

item = selected_items[0]
values = tuple(self.tree.item(item, "values"))

# Öffnen des Formulars zum Bearbeiten mit den vorhandenen Werten
form = tk.Toplevel()
edit_customer_form = EditCustomerForm(form, self.update_customer, values)

def update_customer(self, nachfassdatum, kunde, kontakt, kanton, kundenart, umsatz, mitarbeiter, kpi, notizen):
# Funktion zum Aktualisieren der ausgewählten Datensätze
selected_items = self.tree.selection()
for item in selected_items:
# Datensatz in der Tabelle aktualisieren
self.tree.item(item, values=(nachfassdatum, kunde, kontakt, kanton, kundenart, umsatz, mitarbeiter, kpi, notizen))

# Daten in der Datei aktualisieren
old_nachfassdatum = self.tree.item(item, "values")[0]
with open("kundenverwaltung.txt", "r") as f:
lines = f.readlines()
with open("kundenverwaltung.txt", "w") as f:
for line in lines:
if not line.strip().startswith(old_nachfassdatum):
f.write(line)
else:
f.write(f"{nachfassdatum}, {kunde}, {kontakt}, {kanton}, {kundenart}, {umsatz}, {mitarbeiter}, {kpi}, {notizen}\n")

def read_data(self):
# Funktion zum Lesen der Daten aus der Datei und Einfügen in die Tabelle
with open("kundenverwaltung.txt", "r") as f:
for line in f:
data = line.strip().split(", ")
self.tree.insert("", "end", values=data)

# Hauptfunktion zum Starten der Anwendung
def main():
root = tk.Tk()
app = CustomerApp(root)
root.mainloop()

if __name__ == "__main__":
main()
Sirius3
User
Beiträge: 17816
Registriert: Sonntag 21. Oktober 2012, 17:20

@viSion1990: das Programm sieht auf den ersten Blick ordentlich aus, mit Klassen und ohne globalen Variablen. Aber ab einer bestimmten Länge rächen sich andere Designfehler.
Die Datenhaltung muß sauber vom GUI-Code getrennt sein, damit man ihn auch unabhängig testen kann.
"kundenverwaltung.txt" kommt 9 mal im Code vor. An fünf Stellen steht Code zum Lesen der Datei und ebenso wird fünf mal geschrieben.
Der Code zum Löschen von leeren Zeilen sollte ein deutliches Zeichen dafür sein, dass an Deinem Datenformat ein genereller Fehler steckt. Beim Speichern hängst Du an Deine Notizen immer eine neue Leerzeile an, die dann beim Lesen zu neuen Einträgen führt.
Ebenso darf das Trennzeichen `,` nicht in den Daten vorkommen, was Du aber ignorierst.
Das beste wäre, sich kein neues Datenformat zu erfinden, sondern auf bestehende aufzubauen, die diese Probleme nicht haben. Wenn Du nahe an Deinem „Format” bleiben möchtest, also CSV.
Um Datensätze zu ändern oder zu löschen, muß man den Datensatz eindeutig identifizieren können. Dazu benutzt man eine eindeutige Kennung, üblicherweise eine Zahl, die man einfach hochzählen kann. Du benutzt zum Ändern das Änderungsdatum, das nicht eindeutig sein muß, und zum Löschen den Kundennamen (der kann eindeutig sein, weiß aber nicht, ob das bei Dir immer sein MUSS).

Der erste Schritt wäre also, von der GUI unabhängige Funktionen zum Lesen, Schreiben und Bearbeiten von Datensätzen zu schreiben und ausführlich zu testen.
Und zum Berechnen dieser KPI, wobei mir bei der Funktion die Lücken bei Umsatz und Mitarbeitern aufgefallen ist. Was ist bei 180000 Franken Umsatz oder bei 26 Mitarbeitern? Warum fällt da das Rating wieder auf 1?

Diese Funktionen kannst Du dann in Deiner GUI nutzen. Da hast Du auch noch viel doppelter Code. Es sollte nur ein Formular zu geben, zum Neu Anlegen und zum Editieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13233
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@viSion1990: Also eine unsaubere Sache gibt's schon auf Modulebene: Das reine Importieren des Moduls sollte nicht zur Folge haben das in einer Datei Leerzeilen gesucht und entfernt werden. Wenn das am Anfang des Programms passieren soll, dann gehört das mit in die Hauptfunktion.

Irgendwas ist beim kopieren des Quelltextes auch schief gegangen, weil sich mitten drin die Importe wiederholen, die `submit()`-Methode irgendwie doppelt ist, und
``def edit_customer(self):`` gar nicht eingerückt ist und somit zu keiner Klasse gehört, sondern eine Funktion ist.

Hm, das gibt's auch noch mal an anderer Stelle als Methode. Der Code ist irgendwie kaputt. Vielleicht solltest Du den noch mal zeigen, oder eine bereits überarbeitete Fassung, welche die Hinweise von Sirius3 schon berücksichtigt.

Das würde man alles einfacher sehen wenn Du das nächste mal Quelltext in einem Code-Block formatierst. Im vollständigen Editor für Beiträge ist das die mit „</>“ beschriftete Schaltfläche.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Antworten