Berechnungen in per Funktion erstellten Entryboxen
Verfasst: Donnerstag 26. August 2021, 12:19
Moin Moin,
ich hab recht frisch angefangen mir programmieren beizubringen und Python zu lernen und bin auf ein Problem gestoßen das ich nicht so richtig durchdringe.
Es wäre toll wenn sich jemand von euch erbarmen würde mir zu erklären wo mein Fehler liegt bzw. wie ich das lösen könnte.
Es geht darum das ich eine kleine Eingabemaske bauen wollte in die erlaubt Kalkulationen zu erstellen und in einer df zu übergeben.
Um das flexibel zu gestalten wollte ich über einen Button Reihen Entry boxen hinzufügen können.
Aus dem Wert aus der Von und der Bis box sollen die Stunden berechnet werden und in die Stunden Box der jeweiligen Reihe geschrieben werden.
Das funktioniert soweit auch gut solange ich eine Reihe nach der anderen hinzufüge und ausfülle und erst nach dem ausfüllen den Button wieder betätige.
Sobald ich mehr als eine Reihe hinzufüge wird der errechnete Stunden Wert immer in die Stunden box in der letzten Reihe geschrieben.
Das soll so nicht sein, aber ich hab keine Idee mehr wie ich das verhindern kann.
Kann mir jemand sagen wo mein Fehler liegt, wie ich das vermeide ?
Der Code dazu:
from tkinter import *
from tkinter import ttk
from datetime import datetime
import pandas as pd
root = Tk()
root.title("Boxen Hinzufügen")
root.geometry("900x300")
meine_eingaben = []
meine_liste = []
rowcount = 2
# Labels erstellen
def create_header():
Kunde_label = Label(root, text="Kunde:")
Kunde_label.grid(row=1, column=0, sticky=W, )
anzahl_label = Label(root, text="Anzahl")
anzahl_label.grid(row=2, column=0, sticky=W, )
artikel_label = Label(root, text="Artikel")
artikel_label.grid(row=2, column=1, sticky=W, padx=10)
von_label = Label(root, text="Von")
von_label.grid(row=2, column=2, sticky=W, padx=10)
bis_label = Label(root, text="Bis")
bis_label.grid(row=2, column=3, sticky=W, padx=10)
stunden_label = Label(root, text="h")
stunden_label.grid(row=2, column=4, sticky=W, padx=10)
min_label = Label(root, text="Min. h")
min_label.grid(row=2, column=5, sticky=W, padx=10)
stunden_preis_label = Label(root, text="preis/h")
stunden_preis_label.grid(row=2, column=6, sticky=W, padx=10)
zeilen_summe_label = Label(root, text="Summe")
zeilen_summe_label.grid(row=2, column=7, sticky=W, padx=10)
#Funktion zum Speichern der Werte in einen DataFrame
def save():
x=0
for eintrag in meine_eingaben:
meine_liste.insert(x, eintrag.get())
x+=1
n = 8
output = [meine_liste[i:i + n] for i in range(0, len(meine_liste), n)]
df = pd.DataFrame(output, columns=['Anzahl', 'Artikel', 'von', 'Bis', 'h', 'min.h', 'preis/h', 'Summe'])
print(df.to_string(index=False))
#Funktion zum erstellen der Boxen
def create():
#Funktion zu berechnung der Arbeitsstunden
def stunden_berchnung(event):
stunden_box.delete(0, END)
bis = datetime.strptime(bis_box.get(), "%H:%M")
von = datetime.strptime(von_box.get(), "%H:%M")
if bis >= von:
stunden = bis - von
zerlegt1 = str(stunden).split(":")
hh = zerlegt1[0]
mm = zerlegt1[1]
ergebnis = float(hh) + float(mm) / 60
stunden_box.insert(0, str(ergebnis))
else:
stunden = bis - von
zerlegt1 = str(stunden).split(",")
zerlegt2 = str(zerlegt1[1]).split(":")
hh = zerlegt2[0]
mm = zerlegt2[1]
ergebnis = float(hh) + float(mm) / 60
stunden_box.insert(0, str(ergebnis))
global rowcount
anzahl_box = Entry(root, width=5)
anzahl_box.grid(row=rowcount+1, column=0, sticky=W, )
meine_eingaben.append(anzahl_box)
global artikel_drop
# Dropbox
artikel_drop = ttk.Combobox(root, value=["auswahl_1", "auswahl_2", "auswahl_3"])
artikel_drop.grid(row=rowcount+1, column=1)
meine_eingaben.append(artikel_drop)
von_box = Entry(root, width=5)
von_box.grid(row=rowcount+1, column=2, sticky=W, padx=10, pady=10)
meine_eingaben.append(von_box)
bis_box = Entry(root, width=5)
bis_box.grid(row=rowcount+1, column=3, sticky=W, padx=10, pady=10)
meine_eingaben.append(bis_box)
global stunden_box
stunden_box = Entry(root, width=5)
stunden_box.grid(row=rowcount+1, column=4, sticky=W, padx=10, pady=10)
stunden_box.bind("<FocusIn>",stunden_berchnung)
meine_eingaben.append(stunden_box)
global min_box
min_box = Entry(root, width=5)
min_box.grid(row=rowcount+1, column=5, sticky=W, padx=10, pady=10)
meine_eingaben.append(min_box)
global stunden_preis_box
stunden_preis_box = Entry(root, width=5)
stunden_preis_box.grid(row=rowcount+1, column=6, sticky=W, padx=10, pady=10)
meine_eingaben.append(stunden_preis_box)
global zeilen_summe_box
zeilen_summe_box = Entry(root, width=5)
zeilen_summe_box.grid(row=rowcount+1, column=7, sticky=W, padx=10, pady=10)
meine_eingaben.append(zeilen_summe_box)
rowcount += 1
create_header()
btn_add = Button(root, text="Add", command=create)
btn_add.grid(row=0,column=0)
btn_save = Button(root, text="Save", command=save)
btn_save.grid(row=0, column=1)
root.mainloop()
ich hab recht frisch angefangen mir programmieren beizubringen und Python zu lernen und bin auf ein Problem gestoßen das ich nicht so richtig durchdringe.
Es wäre toll wenn sich jemand von euch erbarmen würde mir zu erklären wo mein Fehler liegt bzw. wie ich das lösen könnte.
Es geht darum das ich eine kleine Eingabemaske bauen wollte in die erlaubt Kalkulationen zu erstellen und in einer df zu übergeben.
Um das flexibel zu gestalten wollte ich über einen Button Reihen Entry boxen hinzufügen können.
Aus dem Wert aus der Von und der Bis box sollen die Stunden berechnet werden und in die Stunden Box der jeweiligen Reihe geschrieben werden.
Das funktioniert soweit auch gut solange ich eine Reihe nach der anderen hinzufüge und ausfülle und erst nach dem ausfüllen den Button wieder betätige.
Sobald ich mehr als eine Reihe hinzufüge wird der errechnete Stunden Wert immer in die Stunden box in der letzten Reihe geschrieben.
Das soll so nicht sein, aber ich hab keine Idee mehr wie ich das verhindern kann.
Kann mir jemand sagen wo mein Fehler liegt, wie ich das vermeide ?
Der Code dazu:
from tkinter import *
from tkinter import ttk
from datetime import datetime
import pandas as pd
root = Tk()
root.title("Boxen Hinzufügen")
root.geometry("900x300")
meine_eingaben = []
meine_liste = []
rowcount = 2
# Labels erstellen
def create_header():
Kunde_label = Label(root, text="Kunde:")
Kunde_label.grid(row=1, column=0, sticky=W, )
anzahl_label = Label(root, text="Anzahl")
anzahl_label.grid(row=2, column=0, sticky=W, )
artikel_label = Label(root, text="Artikel")
artikel_label.grid(row=2, column=1, sticky=W, padx=10)
von_label = Label(root, text="Von")
von_label.grid(row=2, column=2, sticky=W, padx=10)
bis_label = Label(root, text="Bis")
bis_label.grid(row=2, column=3, sticky=W, padx=10)
stunden_label = Label(root, text="h")
stunden_label.grid(row=2, column=4, sticky=W, padx=10)
min_label = Label(root, text="Min. h")
min_label.grid(row=2, column=5, sticky=W, padx=10)
stunden_preis_label = Label(root, text="preis/h")
stunden_preis_label.grid(row=2, column=6, sticky=W, padx=10)
zeilen_summe_label = Label(root, text="Summe")
zeilen_summe_label.grid(row=2, column=7, sticky=W, padx=10)
#Funktion zum Speichern der Werte in einen DataFrame
def save():
x=0
for eintrag in meine_eingaben:
meine_liste.insert(x, eintrag.get())
x+=1
n = 8
output = [meine_liste[i:i + n] for i in range(0, len(meine_liste), n)]
df = pd.DataFrame(output, columns=['Anzahl', 'Artikel', 'von', 'Bis', 'h', 'min.h', 'preis/h', 'Summe'])
print(df.to_string(index=False))
#Funktion zum erstellen der Boxen
def create():
#Funktion zu berechnung der Arbeitsstunden
def stunden_berchnung(event):
stunden_box.delete(0, END)
bis = datetime.strptime(bis_box.get(), "%H:%M")
von = datetime.strptime(von_box.get(), "%H:%M")
if bis >= von:
stunden = bis - von
zerlegt1 = str(stunden).split(":")
hh = zerlegt1[0]
mm = zerlegt1[1]
ergebnis = float(hh) + float(mm) / 60
stunden_box.insert(0, str(ergebnis))
else:
stunden = bis - von
zerlegt1 = str(stunden).split(",")
zerlegt2 = str(zerlegt1[1]).split(":")
hh = zerlegt2[0]
mm = zerlegt2[1]
ergebnis = float(hh) + float(mm) / 60
stunden_box.insert(0, str(ergebnis))
global rowcount
anzahl_box = Entry(root, width=5)
anzahl_box.grid(row=rowcount+1, column=0, sticky=W, )
meine_eingaben.append(anzahl_box)
global artikel_drop
# Dropbox
artikel_drop = ttk.Combobox(root, value=["auswahl_1", "auswahl_2", "auswahl_3"])
artikel_drop.grid(row=rowcount+1, column=1)
meine_eingaben.append(artikel_drop)
von_box = Entry(root, width=5)
von_box.grid(row=rowcount+1, column=2, sticky=W, padx=10, pady=10)
meine_eingaben.append(von_box)
bis_box = Entry(root, width=5)
bis_box.grid(row=rowcount+1, column=3, sticky=W, padx=10, pady=10)
meine_eingaben.append(bis_box)
global stunden_box
stunden_box = Entry(root, width=5)
stunden_box.grid(row=rowcount+1, column=4, sticky=W, padx=10, pady=10)
stunden_box.bind("<FocusIn>",stunden_berchnung)
meine_eingaben.append(stunden_box)
global min_box
min_box = Entry(root, width=5)
min_box.grid(row=rowcount+1, column=5, sticky=W, padx=10, pady=10)
meine_eingaben.append(min_box)
global stunden_preis_box
stunden_preis_box = Entry(root, width=5)
stunden_preis_box.grid(row=rowcount+1, column=6, sticky=W, padx=10, pady=10)
meine_eingaben.append(stunden_preis_box)
global zeilen_summe_box
zeilen_summe_box = Entry(root, width=5)
zeilen_summe_box.grid(row=rowcount+1, column=7, sticky=W, padx=10, pady=10)
meine_eingaben.append(zeilen_summe_box)
rowcount += 1
create_header()
btn_add = Button(root, text="Add", command=create)
btn_add.grid(row=0,column=0)
btn_save = Button(root, text="Save", command=save)
btn_save.grid(row=0, column=1)
root.mainloop()