Seite 1 von 1

Werte aus GUI in einer CSV Datei speichern

Verfasst: Dienstag 29. November 2022, 17:12
von Red7989
Hallo,

ich möchte die Eingetragenen Werte aus der Entry in eine CSV Datei speichern. Allerdings wird bei meinem jetzigen Skript die Kopfzeile immer neu Hinzugefügt, statt nur die Werte
Statt so auszusehen:
Stückzahl, Uhrzeit
1000, 12:14:30
2000, 12:15:20

Sieht es in der CSV so aus
Stückzahl, Uhrzeit
1000, 12:15:40
Stückzahl, Uhrzeit
2000, 12:16:20

Hier mein Code:

Code: Alles auswählen


from tkinter import *
import time
import tkinter
import tkinter.messagebox

#----------------------------------------------------------------------------------------------------------------------------

#Fenster
tkFenster = Tk()
#Fenster-Titel einfügen
tkFenster.title('Liste')
#Fenster-groeße bestimmen
tkFenster.geometry('400x300')
tkFenster.configure(bg="White")



#----------------------------------------------------------------------------------------------------------------------------

def loeschen():
    try:
        wert_index = listbox_stuekzahlen.curselection()[0] 
        listbox_stuekzahlen.delete(wert_index)
    except:
        tkinter.messagebox.showwarning(title="Warning!", message="Wert anklicken")


def hinzufuegen():
    

    import csv
    import datetime
    with open("Data_stueckzahlen.csv", "a", newline="") as csvfile:
        writer = csv.writer(csvfile)
        #Kopfzeile
        writer.writerow(["Stückzahl", "Uhrzeit"])
        #Eingabe-Wert nehmen
        ist_stueckzahl = entry_listbox.get()
        #Zeit hinzufügen
        now = datetime.datetime.now()
        now_str = now.time().strftime("%H:%M:%S")  
        writer.writerow([ist_stueckzahl, now_str])
        
        
    
    timestamp = datetime.datetime.now()

    eingabe_stuekzahl = entry_listbox.get() 
   
   
    
    if eingabe_stuekzahl != "":
        listbox_stuekzahlen.insert(tkinter.END, f'{timestamp:%H:%M:%S} - {eingabe_stuekzahl} Stk.')
        #listbox_stuekzahlen.insert(tkinter.END,stuekzahl_hinzufuegen,date_time_str)
        entry_listbox.delete(0,tkinter.END)
        
    
    else:
        tkinter.messagebox.showwarning(title="Warning!", message="Zahl eingeben!")
    

#---------------------------------------------------------------------------------------------------------------------------


#Listbox erstellen
listbox_stuekzahlen = tkinter.Listbox(tkFenster, bg="White", height=400, width=4)
listbox_stuekzahlen.place(x=10, y=20, width=150, height=250)

#Eingabemöglichkeit schaffen
entry_listbox = Entry(master=tkFenster, bg="white", width=30)
entry_listbox.place(x=180, y=64, width=60, height=27)


#Button erstellen
button_add_list = Button(master=tkFenster, bg='#FBD975', text='Stückzahl Hinzufügen', command=hinzufuegen)
button_add_list.place(x=180, y=100, width=200, height=27)

#Button erstellen der ein Wert löscht
button_add_list = Button(master=tkFenster, bg='#FBD975', text='Löschen', command=loeschen) 
button_add_list.place(x=180, y=150, width=200, height=27)



###Label
#Label mit Aufschrift Produktionsbeginn
label_produktionsbeginn = Label(master=tkFenster, bg="White", text="Produktionsbeginn [HH:MM]:")
label_produktionsbeginn.place(x=180, y=200, width=175, height=27)

#Eingabemöglichkeit (Entry) für die Produktionsbeginn
entry_produktionsbeginn = Entry(master=tkFenster, bg="White")
entry_produktionsbeginn.place(x=175, y=230, width=60, height=27)




tkFenster.mainloop()  

Vielen dank für die Hilfe

Re: Werte aus GUI in einer CSV Datei speichern

Verfasst: Dienstag 29. November 2022, 18:05
von noisefloor
Hallo,

willkommen im Forum.

Die Zeile taucht jedes Mal auf, weil du sie jedes Mal selber in die Datei schreibst... das macht die Zeile `writer.writerow(["Stückzahl", "Uhrzeit"])` in deinem Code.

Wenn du das nicht willst, dann musst du halt eine Prüfung einbauen, ob die Datei schon existiert und wenn ja das Schreiben der Zeile überspringen.

Gruß, noisefloor

Re: Werte aus GUI in einer CSV Datei speichern

Verfasst: Dienstag 29. November 2022, 18:13
von __blackjack__
@Red7989: Na dann füg halt nicht jedes mal die Kopfzeile hinzu wenn Du das nicht willst. *Dein* Code macht das ja, weil das da so steht das der das machen soll.

Anmerkungen zum Quelltext:

Bei Textdateien sollte man beim öffnen immer explizit die Kodierung angeben. In dem Programm wird ja sogar ein "ü" gespeichert. Da will man nicht, dass die Kodierung zufällig die passende ist, und das auch auf jedem System gleich kodiert wird.

Sternchen-Importe sind Böse™. Bei `tkinter` holt man sich da um die 160 Namen ins Modul. Und nicht nur die, die in `tkinter` definiert werden, sondern auch die, die `tkinter` selbst wiederum von wo anders importiert. Es besteht die Gefahr von Namenskollisionen, und man sieht auch nicht mehr so leicht wo eigentlich welcher Name her kommt.

Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Funktionen bekommen alles was sie ausser Konstanten benötigen, als Argument(e) übergeben.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassennamen (PascalCase).

Das bedeutet, dass man bei GUI-Programmierung nicht um objektorientierte Programmierung (OOP) herum kommt. Oder zumindest `functools.partial()` für triviale Fälle.

Kommentare sollten dem Leser einen Mehrwert über den Code bieten. Faustregel: Ein Kommentar beschreibt nicht was der Code macht, denn das steht dort bereits als Code, sondern warum er das so macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in der Regel was in der Dokumentation von Python oder den verwendeten Bibliotheken steht.

Verwende kein `place()`. Das funktioniert so nur auf dem Rechner auf dem die GUI entworfen wurde. Auf anderen Systemen mit anderen Bildschirmgrössen und -auflösungen, und anderen Einstellungen kann das komisch aussehen, bis unbenutzbar werden wenn sich Anzeigeelemente beispielsweise überlappen, weil die absoluten Pixelangaben und reltive Grössen wie Schriftgrössen und ähnliches sich nicht miteinander vertragen.

Sofern das Fenster keine Elemente enthält die sich bei der Änderung der Fenstergrösse durch den Benutzer an die neue Grösse anpassen, gibt man auch keine Fenstergrössen absolut vor. Im Grunde das gleiche Problem: man kann nicht garantieren, dass da wirklich alles reinpassen wird.

Re: Werte aus GUI in einer CSV Datei speichern

Verfasst: Mittwoch 30. November 2022, 06:57
von sparrow
@Red7989: Ergänzend: Impore gehören an den Anfang einer Datei. Nicht irgendwo mitten hinein - und nicht in Funktionen.

Re: Werte aus GUI in einer CSV Datei speichern

Verfasst: Mittwoch 30. November 2022, 18:57
von Red7989
danke für deine Antwort. Bin noch Anfänger, wie würdest du so eine Prüfung schreiben ??

Re: Werte aus GUI in einer CSV Datei speichern

Verfasst: Mittwoch 30. November 2022, 18:59
von Red7989
@sparrow u. @blackjack danke für eure Kommentare. Helfen mir aber nicht weiter.

Re: Werte aus GUI in einer CSV Datei speichern

Verfasst: Mittwoch 30. November 2022, 20:20
von Sirius3
@Red7989: das sind keine Kommentare, sondern Hinweise, wie ein korrektes Programm aussehen sollte.
In der jetzigen Form lassen sich halt Fehler sehr schwierig finden. Deshalb solltest Du Dich hinsetzen und alles was __blackjack__ und sparrow geschrieben haben, durcharbeiten und umsetzen. Das hilft Dir dann sehr viel weiter, ein besserer Programmierer zu werden.
Um zu prüfen, ob eine Datei existiert, gibt es was in pathlib.Path.

Re: Werte aus GUI in einer CSV Datei speichern

Verfasst: Donnerstag 1. Dezember 2022, 09:14
von noisefloor
Hallo,

konkret bringt dich eine Google Suche nach "python patlib check if file exists" weiter. Bei mir ist der 1. Suchtreffer ein Stack Overflow Thread, wo es ziemlich detailliert erklärt ist. Wie gesagt ist eine Lösung via pathlib Stand der Dinge, nicht über das ältere os.system.

Gruß, noisefloor

Re: Werte aus GUI in einer CSV Datei speichern

Verfasst: Donnerstag 1. Dezember 2022, 22:09
von Red7989
Hinweise können auch Kommentare sein ;)