Werte aus GUI in einer CSV Datei speichern

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
Red7989
User
Beiträge: 4
Registriert: Mittwoch 16. November 2022, 20:06

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
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
sparrow
User
Beiträge: 4186
Registriert: Freitag 17. April 2009, 10:28

@Red7989: Ergänzend: Impore gehören an den Anfang einer Datei. Nicht irgendwo mitten hinein - und nicht in Funktionen.
Red7989
User
Beiträge: 4
Registriert: Mittwoch 16. November 2022, 20:06

danke für deine Antwort. Bin noch Anfänger, wie würdest du so eine Prüfung schreiben ??
Red7989
User
Beiträge: 4
Registriert: Mittwoch 16. November 2022, 20:06

@sparrow u. @blackjack danke für eure Kommentare. Helfen mir aber nicht weiter.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Red7989
User
Beiträge: 4
Registriert: Mittwoch 16. November 2022, 20:06

Hinweise können auch Kommentare sein ;)
Antworten