Label erstellen nach einer Funktion (def)

Fragen zu Tkinter.
Antworten
iDexter
User
Beiträge: 6
Registriert: Donnerstag 18. März 2021, 08:20

Guten Morgen zusammen,

leider zerbeiße ich mir seit einigen Tagen die Zähne, an der Umsetzung einer Berechnung bzw. der Ausgabe des Ergebnisses hier als "Label". Wie kann ich generell eine Variable über die "Label" Funktion ausgeben. Beiliegend dazu mal der Code. Hier soll nach dem Funktionsaufruf (def Netzentgeld (): , die Ergebnisse "Ans" und "Ans2" über die Labelfunktion ausgegeben werden. Wie geht das? Ich kriege es bisher nur über "Entry" hin, sieht aber in der GUI unschön aus, da ich dieses nur zum einsetzen von Zahlen nutzen möchte.

Code: Alles auswählen

from tkinter import *
from tkinter.messagebox import *

main = Tk()
main.geometry("780x600")
main.configure(bg='white')
main.title("Netznutzungsrechner")

APG = 0.8
APK = 4.31
LPG= 100.6
LPK= 12.85
FKT = 0.01
KWKG= 0.254
NEV= 0.432
OFFSHORE= 0.395
ABLAV= 0.009

info = Label(main, font=("Helvetica", 22), text = "Netznutzungsrechner"). grid(row=1, column=1)

u1 = "Niederspannung"
u2 = "Mittelspannung"
u3 = "Hochspannung"
u4 = "Höchstspannung"

variable = StringVar(main)      # Auswahl der Variable (Netzspannung)
variable.set(u1) # default value, Ausgangsvariable = u1 (Niederspannung)

#==========================================================================#
#=================Beschreibung der einzelnen Methoden======================#
#==========================================================================#
Label(main, text = "Jahresenergie [kWh]:").grid(row=3)
Label(main, text = "Jahresleistung [kW]:").grid(row=4)
Label(main, text = "Bitte wählen sie eine Spannungsebene:").grid(row=5)
Label(main, text = "Die Jahresbenutzungsdauer beträgt [h/a]:").grid(row=6)
Label(main, text = "Das Netzentgeld beträgt [€/a]:").grid(row=7)

num1 = Entry(main)
num2 = Entry(main)
blank = Entry(main)
blank2 = Entry(main)


def Netzentgeld (): 
    Ans = int(num1.get()) / int(num2.get())
    blank.insert(0, Ans)
    if Ans <= 2500:
        Ans2 = LPK*int(num2.get())+APK*FKT*int(num1.get())   
    elif Ans >= 2500:
        Ans2 = LPG*int(num2.get())+APG*FKT*int(num1.get())   
    blank2.insert(0, Ans2)
    


num1.grid(row=3, column=1)  # Jahresleistung [kW]
num2.grid(row=4, column=1)  # Jahresenergie [kWh]
blank.grid(row=6, column=1)
blank2.grid(row=7, column=1)


optionen = OptionMenu(main, variable, u1, u2, u3, u4).grid(row=5,column = 1)
Button(main, text='Berechnen',background = "gray",foreground = "white",command=Netzentgeld).grid(row=8)
Button(main, text='Programm schließen',background = "gray",foreground = "white", command=main.destroy).grid(row=9)

mainloop()
Ich bedanke mich schon mal recht Herzliche für eure Hilfe
Benutzeravatar
Dennis89
User
Beiträge: 1121
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

für Anmerkungen zu deinem Code fehlt mir gerade leider etwas die Zeit.
Grundsätzlich solltest du dich aber mit der objektorientierten Programmierung auseinander setzten, wenn du GUI programmieren willst. Bei einfachen Sachen geht es vielleicht auch noch ohne, aber das ist dann nur mit viel Aufwand erweiterbar. Also besser von Anfang an in den sauren Apfel beißen und die OOP lernen.

Zu deiner Frage: Binde das Label an einen Namen und dann kannst du den Text mit 'config' ändern.
Bsp.:

Code: Alles auswählen

    self.output = tk.Label(self, text="")
    self.output.grid(row=0, column=0)

def netzentgeld_anzeigen(self):
    self.output.config(text='Neuer Text')
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Hier die üblichen Anmerkungen zum Code:
Benutze keine *-Importe, weil damit verschleiert wird, woher welcher Name kommt und es zu Konflikten kommen kann.
messagebox wird importiert, aber gar nicht benutzt.

Benutze keine Kryptischen Abkürzungen, mit ABLAV, LPK, u3 oder variable ist das Lesen des Codes sehr schwierig.
Benutze keine globalen Variablen, alles was eine Funktion braucht, muß sie auch über ihre Argumente bekommen und auf oberster Ebene sollte kein Ausführbarer Code stehen, sondern das "Hauptprogramm" sollte in einer Funktion stehen, die üblicherweise main genannt wird.
Setze keine geometry, weil die Größe des Fensters automatisch anpasst.
`info´ wird an den Wert None gebunden, was nicht sehr sinnvoll ist.
Für die Optionen benutzt Du ja schon StringVar, genauso kannst Du ein Variablen-Objekt zur Ausgabe in einem Label benutzen.
Warum ist der Kommentar zu Jahresleistung und Jahresenergie vertauscht? Das würde bei sprechenden Namen nicht passieren.

Wenn in einer elif-Bedingung das exakte Gegenteil der if-Bedingung steht, dann benutzt man else (hier auch wenn die Bedingung nicht exakt das Gegenteil ist).

Da ich wirklich nicht weiß, was es bedeuten soll, konnte ich den Konstanten keine sinnvollen Namen geben:

Code: Alles auswählen

import tkinter as tk
from functools import partial

APG = 0.8
APK = 4.31
LPG = 100.6
LPK = 12.85
FKT = 0.01
KWKG = 0.254
NEV = 0.432
OFFSHORE = 0.395
ABLAV = 0.009

SPANNUNGEN = [
    "Niederspannung",
    "Mittelspannung",
    "Hochspannung",
    "Höchstspannung"
]


def berechne_netzentgeld(jahresleistung, jahresenergie, benutzungsdauer, nutzentgeld): 
    energie = float(jahresenergie.get())
    leistung = float(jahresleistung.get())
    dauer = energie / leistung 
    benutzungsdauer['text' ] = f"{dauer:.1f}"
    if dauer <= 2500:
        entgeld = LPK * leistung + APK * FKT * energie
    else:
        entgeld = LPG * leistung + APG * FKT * energie
    nutzentgeld['text'] = f"{entgeld:.2f}"
    

def main():
    main = tk.Tk()
    main.title("Netznutzungsrechner")

    tk.Label(main, font=("Helvetica", 22), text = "Netznutzungsrechner"). grid(row=1, column=1)

    tk.Label(main, text="Jahresenergie [kWh]:").grid(row=3, column=0)
    jahresenergie = tk.Entry(main)
    jahresenergie.grid(row=4, column=1)
    
    tk.Label(main, text="Jahresleistung [kW]:").grid(row=4, column=0)
    jahresleistung = tk.Entry(main)
    jahresleistung.grid(row=3, column=1)
    
    tk.Label(main, text="Bitte wählen sie eine Spannungsebene:").grid(row=5, column=0)
    netzspannung = tk.StringVar(main, SPANNUNGEN[0])
    tk.OptionMenu(main, netzspannung, *SPANNUNGEN).grid(row=5, column=1)
    
    tk.Label(main, text="Die Jahresbenutzungsdauer beträgt [h/a]:").grid(row=6, column=0)
    benutzungsdauer = tk.Label(main)
    benutzungsdauer.grid(row=6, column=1)

    tk.Label(main, text="Das Netzentgeld beträgt [€/a]:").grid(row=7, column=0)
    nutzentgeld = tk.Label(main)
    nutzentgeld.grid(row=7, column=1)

    tk.Button(main, text='Berechnen', background="gray", foreground="white",
        command=partial(berechne_netzentgeld, jahresleistung, jahresenergie, benutzungsdauer, nutzentgeld)).grid(row=8, column=0)
    tk.Button(main, text='Programm schließen', background="gray", foreground="white", command=main.destroy).grid(row=9, column=0)
    main.mainloop()

if __name__ == "__main__":
    main()
Es fehlt noch die Fehlerbehandlung bei Falscheingaben.
iDexter
User
Beiträge: 6
Registriert: Donnerstag 18. März 2021, 08:20

Hallo zusammen,

erst einmal einen schönen Dank für die ausführlichen Kommentare und Lösungshinweise. Ich bin in keiner weise der Profi Programmierer, freue mich jedoch immer wieder über professionelle Ratschläge wie eure! Und natürlich besonders dann wenn es auch Fachlich bzw. von der Syntax her richtig sein soll. Wie es schon gesagt wurde, wenn schon dann sollte man es richtig lernen.
Bzgl. meinem Programm, soll es in Zukunft schon etwas ausführlicher werden, es sollen jetzt noch ein paar weitere Daten ausgegeben werden, was ich denke ich hinbekomme, jedoch fehlt mir jetzt das Verständnis, die Netzebene in diesem Fall der String SPANNUNGEN = [„Niederspannung“, „Mittelspannung“, etc…] in die IF-Abfrage zu integrieren? Also wenn das Programm startet, soll man erst die Netzebene auswählen können und darauf aufbauend sollen dann die Jahresbenutzungsdauer ermittelt werden und weitere Rechnungen folgen. Ich habe schon verstanden das die SPANNUNG [0] = Niederspannung ist, SPANNUNG [1] Mittelspannung usw. wenn ich es richtig interpretiert habe, aber wie kann ich das ganze jetzt, vor allem richtig in die Schleife integrieren?
Am Ende würde ich das ganze einmal als PDF Datei abspeichern, aber nur die Daten die ich gerne vorher definiere also als Bsp. wenn ich das Programm öffne soll er mir row1-2 und row 4-8 in eine PDF abspeichern.
Wichtiger wäre mir jedoch erst mal der Schritt mit der Wahl der Netzebene, da ich auch immer wissen und lernen möchte was das Programm gerade macht und wie es agiert!

Zu den Kryptischen Zeichen :D , dass hat eigentlich schon alles Hand und Fuß, jeder einzelne Buchstabe davon Bsp: APKM = Arbeitspreis klein Niederspannung. LPGH = Leistungspreis groß Hochspannung.

Wie immer bedanke ich mich jetzt schon recht Herzlich für eure Unterstützung

Code: Alles auswählen

import tkinter as tk
from functools import partial
from tkinter.constants import S

APGN = 3.49
APKN = 4.91
APKM = 4.31
APGM = 0.80
APKH = 3.34
APGH = 0.12
LPGN = 49.75
LPKN = 14.25
LPKM = 12.85
LPGM = 100.6
LPKH = 9.99
LPGH = 90.49
FKT = 0.01
KWKG = 0.254
NEV = 0.432
OFFSHORE = 0.395
ABLAV = 0.009

SPANNUNGEN = [
    "Niederspannung",
    "Mittelspannung",
    "Hochspannung",
    "Höchstspannung"
]


def berechne_netzentgeld_niederspannung(jahresleistung, jahresenergie, benutzungsdauer, nutzentgeld, ukwkg): 
    energie = float(jahresenergie.get())
    leistung = float(jahresleistung.get())
    dauer = energie / leistung
    benutzungsdauer['text' ] = f"{dauer:.1f}"
    kwk = KWKG*FKT*energie   
    ukwkg['text'] = f"{kwk:.1f}"
    if dauer <= 2500: 
        entgeld = LPKN * leistung + APKN * FKT * energie
    else:
        entgeld = LPGN * leistung + APGN * FKT * energie
    nutzentgeld['text'] = f"{entgeld:.2f}"    

def main():
    main = tk.Tk()
    main.title("Netznutzungsrechner")

    tk.Label(main, font=("Helvetica", 22), text = "Netznutzungsrechner"). grid(row=1, column=1)

    tk.Label(main, text="Jahresenergie [kWh]:").grid(row=3, column=0)
    jahresenergie = tk.Entry(main)
    jahresenergie.grid(row=3, column=1)
    
    tk.Label(main, text="Jahresleistung [kW]:").grid(row=4, column=0)
    jahresleistung = tk.Entry(main)
    jahresleistung.grid(row=4, column=1)
    
    tk.Label(main, text="Bitte wählen sie eine Spannungsebene:").grid(row=5, column=0)
    netzspannung = tk.StringVar(main, SPANNUNGEN[0])
    tk.OptionMenu(main, netzspannung, *SPANNUNGEN).grid(row=5, column=1)
    
    tk.Label(main, text="Die Jahresbenutzungsdauer beträgt [h/a]:").grid(row=6, column=0)
    benutzungsdauer = tk.Label(main)
    benutzungsdauer.grid(row=6, column=1)

    tk.Label(main, text="Das Netzentgeld beträgt [€/a]:").grid(row=7, column=0)
    nutzentgeld = tk.Label(main)
    nutzentgeld.grid(row=7, column=1)

    tk.Label(main, text="Die KWKG-Umlage beträgt [€/a]:").grid(row=8, column=0)
    ukwkg = tk.Label(main)
    ukwkg.grid(row=8, column=1)

    tk.Button(main, text='Berechnen', background="gray", foreground="white",
    command=partial(berechne_netzentgeld_niederspannung, jahresleistung, jahresenergie, benutzungsdauer, nutzentgeld, ukwkg)).grid(row=9, column=0)
    tk.Button(main, text='Programm schließen', background="gray", foreground="white", command=main.destroy).grid(row=10, column=0)
    main.mainloop()

if __name__ == "__main__":
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@iDexter: Das Du nicht völlig willkürliche Buchstabenfolgen verwendest war schon klar, trotzdem sind die für Fremde unverständlich und Du selbst wirst in ein paar Monaten auch ein Fremder sein, und es besteht halt auch die Gefahr von Verwechslungen die nicht so leicht auffallen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

iDexter hat geschrieben: Dienstag 23. März 2021, 17:52aber wie kann ich das ganze jetzt, vor allem richtig in die Schleife integrieren?
Wo hast Du eine Schleife?

Der ausgewählte Wert steht in `netzspannung`; Du mußt also nur die Variable auch noch an die Funktion übergeben und schon kannst Du sie nutzen.
iDexter
User
Beiträge: 6
Registriert: Donnerstag 18. März 2021, 08:20

Guten Abend zusammen,

leider hänge ich immer noch ein wenig fest :( und verstehe es nicht die variable für die Netzspannung zu integrieren :|
import tkinter as tk
from functools import partial
from tkinter.constants import S

APGN = 3.49
APKN = 4.91
APKM = 4.31
APGM = 0.80
APKH = 3.34
APGH = 0.12
LPGN = 49.75
LPKN = 14.25
LPKM = 12.85
LPGM = 100.6
LPKH = 9.99
LPGH = 90.49
FKT = 0.01
KWKG = 0.254
NEV = 0.432
OFFSHORE = 0.395
ABLAV = 0.009

SPANNUNGEN = [
"Niederspannung",
"Mittelspannung",
"Hochspannung",
"Höchstspannung"
]

def berechne_netzentgeld_niederspannung(jahresleistung, jahresenergie, benutzungsdauer, nutzentgeld, ukwkg, uStromnev, uOffshore, uAbLaV, netzspannung):
energie = float(jahresenergie.get())
leistung = float(jahresleistung.get())
dauer = energie / leistung
benutzungsdauer['text' ] = f"{dauer:.1f}"
netzspannung = [*SPANNUNGEN]
kwk = KWKG*FKT*energie
ukwkg['text'] = f"{kwk:.1f}"
Stromnev = NEV*FKT*energie
uStromnev['text'] = f"{Stromnev:.1f}"
Offshore = OFFSHORE*FKT*energie
uOffshore['text'] = f"{Offshore:.1f}"
AbLaV = ABLAV*FKT*energie
uAbLaV['text'] = f"{AbLaV:.1f}"
if dauer <= 2500 and netzspannung.get() == 0:
entgeld = LPKN * leistung + APKN * FKT * energie
else:
dauer > 2500 and netzspannung.get() == 0
entgeld = LPGN * leistung + APGN * FKT * energie
nutzentgeld['text'] = f"{entgeld:.2f}"

def main():
main = tk.Tk()
main.title("Netznutzungsrechner")

tk.Label(main, font=("Helvetica", 22), text = "Netznutzungsrechner"). grid(row=1, column=1)

tk.Label(main, text="Jahresenergie [kWh]:").grid(row=3, column=0)
jahresenergie = tk.Entry(main)
jahresenergie.grid(row=3, column=1)

tk.Label(main, text="Jahresleistung [kW]:").grid(row=4, column=0)
jahresleistung = tk.Entry(main)
jahresleistung.grid(row=4, column=1)

tk.Label(main, text="Bitte wählen sie eine Spannungsebene:").grid(row=5, column=0)
netzspannung = tk.StringVar(main, SPANNUNGEN[0])
tk.OptionMenu(main, netzspannung, command= berechne_netzentgeld_niederspannung, *SPANNUNGEN).grid(row=5, column=1)

tk.Label(main, text="Die Jahresbenutzungsdauer beträgt [h/a]:").grid(row=6, column=0)
benutzungsdauer = tk.Label(main)
benutzungsdauer.grid(row=6, column=1)

tk.Label(main, text="Das Netzentgeld beträgt [€/a]:").grid(row=7, column=0)
nutzentgeld = tk.Label(main)
nutzentgeld.grid(row=7, column=1)

tk.Label(main, text="Die KWKG-Umlage beträgt [€/a]:").grid(row=8, column=0)
ukwkg = tk.Label(main)
ukwkg.grid(row=8, column=1)

tk.Label(main, text="Die NEV-Umlage beträgt [€/a]:").grid(row=9, column=0)
uStromnev = tk.Label(main)
uStromnev.grid(row=9, column=1)

tk.Label(main, text="Die Offshore-Umlage beträgt [€/a]:").grid(row=10, column=0)
uOffshore = tk.Label(main)
uOffshore.grid(row=10, column=1)

tk.Label(main, text="Die AbLaV-Umlage beträgt [€/a]:").grid(row=11, column=0)
uAbLaV = tk.Label(main)
uAbLaV.grid(row=11, column=1)

tk.Button(main, text='Berechnen', background="gray", foreground="white",
command=partial(berechne_netzentgeld_niederspannung, jahresleistung, jahresenergie, benutzungsdauer, nutzentgeld, ukwkg, uStromnev, uOffshore, uAbLaV)).grid(row=12, column=0)
tk.Button(main, text='Programm schließen', background="gray", foreground="white", command=main.destroy).grid(row=13, column=0)
main.mainloop()

if __name__ == "__main__":
main()
Das Problem ist, ich bräuchte eigentlich zwei Bedingungen: Einmal muss ich gucken ob die Zeit <= 2500 h ist und zugleich muss ich beachten welche Netzebene ausgewählt wurde. Das selbe natürlich für > 2500 h.

In einem anderen Forum habe ich eine variante gefunden, die wie folgt aussehen würde

def berechne_netzentgeld_niederspannung (netzspannung)
if netzspannung.get() == 'Niederspannung':
Aber dies führte leider auch nicht zu meinem Erfolg :(

Im tk.Option.Menu hatte ich zu dem noch kein command= Eintrag, den ich noch rein gemacht habe, führt jedoch auch nicht zu meinem Erfolg :shock: Ich sehe einfach vor lauter Wald die Bäume nicht mehr, oder wie war das....

Viele Grüße
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum schreibst Du ukwkg statt kwkg_umlage? Und uStromnev statt nev_umlage? Das mit uOffshore kannst Du Dir ja selbst denken.

Du mußt auch bei jedem command partial mit allen Argumenten benutzen. Da ist ja die Fehlermeldung, die Du bekommst, recht eindeutig.

Und damit irgendwas "zu einem Erfolg" führt, mußt Du die Fehlermeldungen schon lesen, einfach nur Kopflos irgendwelche Zeilen zu schreiben, führt zu keinem Erfolg.

Was zum Beispiel bewirkt die Zeile:

Code: Alles auswählen

    netzspannung = [*SPANNUNGEN]
Und warum hast Du dem OptionMenü ein command gegeben? Du hast doch einen Berechnen-Knopf.
iDexter
User
Beiträge: 6
Registriert: Donnerstag 18. März 2021, 08:20

Sirius3 hat geschrieben: Donnerstag 25. März 2021, 19:31 Warum schreibst Du ukwkg statt kwkg_umlage? Und uStromnev statt nev_umlage? Das mit uOffshore kannst Du Dir ja selbst denken.

Du mußt auch bei jedem command partial mit allen Argumenten benutzen. Da ist ja die Fehlermeldung, die Du bekommst, recht eindeutig.

Und damit irgendwas "zu einem Erfolg" führt, mußt Du die Fehlermeldungen schon lesen, einfach nur Kopflos irgendwelche Zeilen zu schreiben, führt zu keinem Erfolg.

Was zum Beispiel bewirkt die Zeile:

Code: Alles auswählen

    netzspannung = [*SPANNUNGEN]
Und warum hast Du dem OptionMenü ein command gegeben? Du hast doch einen Berechnen-Knopf.
Bei dem Bereich netzspannung = [*SPANNUNGEN], habe ich gedacht, dass er so durch meine Auswahl der Netzspannung bei der Simulation, automatisch dann die richtige Netzebene auswählt, war leider so aber auch ohne Erfolg
iDexter
User
Beiträge: 6
Registriert: Donnerstag 18. März 2021, 08:20

So ich denke das ich es jetzt so richtig am laufen habe.
import tkinter as tk
from tkinter.constants import CENTER, LEFT

arbeitspreis_groß_niederspannung = 3.49
arbeitspreis_klein_niederspannung = 4.91
arbeitspreis_klein_mittelspannung = 4.31
arbeitspreis_groß_mittelspannung = 0.80
arbeitspreis_klein_hochspannung = 3.34
arbeitspreis_groß_hochspannung = 0.12
leistungspreis_groß_niederspannung = 49.75
leistungspreis_klein_niederspannung = 14.25
leistungspreis_klein_mittelspannung = 12.85
leistungspreis_groß_mittelspannung = 100.6
leistungspreis_klein_hochspannung = 9.99
leistungspreis_groß_hochspannung = 90.49
Faktor = 0.01
KWKG_Umlage = 0.254
NEV_Umlage = 0.432
OFFSHORE_Umlage = 0.395
ABLAV_Umlage = 0.009
tk.PhotoImage

def button_action():
energie_str = eingabefeld.get()
energie = float(energie_str)
leistung_str = eingabefeld2.get()
leistung = float(leistung_str)
dauer = energie/leistung
entgeld_niederspannung_klein = leistungspreis_klein_niederspannung * leistung + arbeitspreis_klein_niederspannung * Faktor * energie
entgeld_niederspannung_groß = leistungspreis_groß_niederspannung * leistung + arbeitspreis_groß_niederspannung * Faktor * energie
wahl = variable.get()
if wahl == u1:
message = str(Niederspannung(dauer)) + " €/a"
elif wahl == u2:
message = str(Mittelspannung(dauer)) + "€/a"
elif wahl == u3:
message = str(Hochspannung(dauer)) + "€/a"
ausgabe.configure(text=message)

def Niederspannung(dauer):
energie_str = eingabefeld.get()
energie = float(energie_str)
leistung_str = eingabefeld2.get()
leistung = float(leistung_str)
dauer = energie/leistung
leistung = eingabefeld2
energie = eingabefeld
entgeld_niederspannung_klein = leistungspreis_klein_niederspannung * float(leistung.get()) + arbeitspreis_klein_niederspannung * Faktor * float(energie.get())
entgeld_niederspannung_groß = leistungspreis_groß_niederspannung * float(leistung.get()) + arbeitspreis_groß_niederspannung * Faktor * float(energie.get())
if dauer <= 2500:
return entgeld_niederspannung_klein
else:
return entgeld_niederspannung_groß

def Mittelspannung(dauer):
energie_str = eingabefeld.get()
energie = float(energie_str)
leistung_str = eingabefeld2.get()
leistung = float(leistung_str)
dauer = energie/leistung
leistung = eingabefeld2
energie = eingabefeld
entgeld_mittelspannung_klein = leistungspreis_klein_mittelspannung * float(leistung.get()) + arbeitspreis_klein_mittelspannung * Faktor * float(energie.get())
entgeld_mittelspannung_groß = leistungspreis_groß_mittelspannung * float(leistung.get()) + arbeitspreis_groß_mittelspannung * Faktor * float(energie.get())
if dauer <= 2500:
return entgeld_mittelspannung_klein
else:
return entgeld_mittelspannung_groß

def Hochspannung(dauer):
energie_str = eingabefeld.get()
energie = float(energie_str)
leistung_str = eingabefeld2.get()
leistung = float(leistung_str)
dauer = energie/leistung
leistung = eingabefeld2
energie = eingabefeld
entgeld_hochspannung_klein = leistungspreis_klein_hochspannung * float(leistung.get()) + arbeitspreis_klein_hochspannung * Faktor * float(energie.get())
entgeld_hochspannung_groß = leistungspreis_groß_hochspannung * float(leistung.get()) + arbeitspreis_groß_hochspannung * Faktor * float(energie.get())
if dauer <= 2500:
return entgeld_hochspannung_klein
else:
return entgeld_hochspannung_groß

main = tk.Tk()
main.title("Netzentgeldrechner")

info = tk.Label(main, justify = tk.CENTER, font=("Helvetica", 16),
text="""\
************* Netzentgeldrechner *************
1) Gewünschte Netzebene wählen.
2) Jahresenergie und Jahresleistung eingeben.
3) Taste "Berechnen" drücken.""")

info.grid(row = 0, column = 0, columnspan = 4, pady = 20, padx = 50)


u1 = "Niederspannung"
u2 = "Mittelspannung"
u3 = "Hochspannung"

logo = tk.PhotoImage(file="C:\\Users\\Martin\\Documents\\Projekte_2021\\Python\\images\\pv.gif")
w1 = tk.Label(main, image=logo).grid(row=11, column=3)

variable = tk.StringVar(main)
variable.set(u1) # default value

optionen = tk.OptionMenu(main, variable, u1, u2, u3)
optionen.configure(width = 40, font=("Helvetica", 16))
optionen.grid(row = 1, column = 0, columnspan = 4, pady = 20)

eingabefeld = tk.Entry(main, bd=5, width=20)
eingabefeld2 = tk.Entry(main, bd=5, width=20)

tk.Label(main, justify = LEFT, font=("Helvetica", 16), text="Jahresenergie [kWh]:").grid(row=3, column=0, columnspan= 3)
energie = tk.Label(main)
eingabefeld.grid(row = 3, column = 2, columnspan= 4, pady = 20)

tk.Label(main, justify = LEFT, font=("Helvetica", 16), text="Jahresleistung [kW]:").grid(row=4, column=0, columnspan= 3)
leistung = tk.Entry(main)
eingabefeld2.grid(row = 4, column = 2, columnspan= 4, pady = 20)

tk.Label(main, justify = CENTER, font=("Helvetica", 16), text="Ausgabe:").grid(row=5, column=1)
ausgabe = tk.Label(main, font=("Helvetica", 18))
ausgabe.grid(row = 5, column =3)

tk.Button(main, text='Berechnen', background="gray", foreground="white",
command=(button_action)).grid(row=9, column=1)
tk.Button(main, text='Programm schließen', background="gray", foreground="white", command=main.destroy).grid(row=10, column=1)
main.mainloop()
Sollte es trotzdem noch Verbesserungsvorschläge geben, versuche ich diese gerne noch umzusetzen.

Viele Grüße
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Dass man nichts Ausführbares auf oberster Ebene hat und dass Funktionen alles, was sie brauchen, über ihre Argumente bekommen müssen, wurde Dir ja schon gesagt, und ich habe schon genug Beispielcode gepostet, dass es mich wundert, warum Du das jetzt wieder total ignorierst. Den Rest hast Du auch ignoriert.
Selbst die Variablennamen hast Du wieder schlechtgeschrieben.

Die Konstanten existieren auch schon über tk. tk.CENTER.
Statt drei identischer Funktionen, würde man die Konstanten in eine passende Datenstruktur packen.
Konstanten schreibt man KOMPLETT_GROSS.

Was soll das unmotivierte tk.PhotoImage mitten drin?
Warum erzeugst Du labels, die Du dann nicht mehr benutzt?

Da ich nicht nochmal alles korrigieren will, nehme ich einfach mein altes Programm und füge die Spannungen ein:

Code: Alles auswählen

import tkinter as tk
from functools import partial

ARBEITSPREISE = {
    ("Niederspannung", "klein"): 4.91,
    ("Niederspannung", "gross"): 3.49,
    ("Mittelspannung", "klein"): 4.31,
    ("Mittelspannung", "gross"): 0.80,
    ("Hochspannung", "klein"): 3.34,
    ("Hochspannung", "gross"): 0.12,
}

LEISTUNGSPREISE = {
    ("Niederspannung", "klein"): 14.25,
    ("Niederspannung", "gross"): 49.75,
    ("Mittelspannung", "klein"): 12.85,
    ("Mittelspannung", "gross"): 100.6,
    ("Hochspannung", "klein"): 9.99,
    ("Hochspannung", "gross"): 90.49,
}

SPANNUNGEN = [
    "Niederspannung",
    "Mittelspannung",
    "Hochspannung"
]

FAKTOR = 0.01
KWKG_UMLAGE = 0.254
NEV_UMLAGE = 0.432
OFFSHORE_UMLAGE = 0.395
ABLAV_UMLAGE = 0.009

def berechne_netzentgeld(jahresleistung, jahresenergie, benutzungsdauer, nutzentgeld, netzspannung, ukwkg): 
    energie = float(jahresenergie.get())
    leistung = float(jahresleistung.get())
    dauer = energie / leistung
    benutzungsdauer['text' ] = f"{dauer:.1f}"
    spannung = netzspannung.get()
    groesse = "klein" if dauer <= 2500 else "gross"
    arbeitspreis = ARBEITSPREISE[spannung, groesse]
    leistungspreis = LEISTUNGSPREISE[spannung, groesse]
    entgeld = leistungspreis * leistung + arbeitspreis * FAKTOR * energie
    ausgabe.configure(text=f"{entgeld:.2f}€/a")


def main():
    main = tk.Tk()
    main.title("Netznutzungsrechner")

    tk.Label(main, font=("Helvetica", 22), text = "Netznutzungsrechner"). grid(row=1, column=1)

    tk.Label(main, text="Jahresenergie [kWh]:").grid(row=3, column=0)
    jahresenergie = tk.Entry(main)
    jahresenergie.grid(row=3, column=1)
    
    tk.Label(main, text="Jahresleistung [kW]:").grid(row=4, column=0)
    jahresleistung = tk.Entry(main)
    jahresleistung.grid(row=4, column=1)
    
    tk.Label(main, text="Bitte wählen sie eine Spannungsebene:").grid(row=5, column=0)
    netzspannung = tk.StringVar(main, SPANNUNGEN[0])
    tk.OptionMenu(main, netzspannung, *SPANNUNGEN).grid(row=5, column=1)
    
    tk.Label(main, text="Die Jahresbenutzungsdauer beträgt [h/a]:").grid(row=6, column=0)
    benutzungsdauer = tk.Label(main)
    benutzungsdauer.grid(row=6, column=1)

    tk.Label(main, text="Das Netzentgeld beträgt [€/a]:").grid(row=7, column=0)
    nutzentgeld = tk.Label(main)
    nutzentgeld.grid(row=7, column=1)

    tk.Label(main, text="Die KWKG-Umlage beträgt [€/a]:").grid(row=8, column=0)
    ukwkg = tk.Label(main)
    ukwkg.grid(row=8, column=1)

    tk.Button(main, text='Berechnen', background="gray", foreground="white",
    command=partial(berechne_netzentgeld, jahresleistung, jahresenergie, benutzungsdauer, nutzentgeld, netzspannung, ukwkg)).grid(row=9, column=0)
    tk.Button(main, text='Programm schließen', background="gray", foreground="white", command=main.destroy).grid(row=10, column=0)
    main.mainloop()

if __name__ == "__main__":
    main()
iDexter
User
Beiträge: 6
Registriert: Donnerstag 18. März 2021, 08:20

Entschuldige bitte wenn ich nach 30 Std. (Gefühlt) noch nicht auf deinem Niveau Programmieren kann. Ich bin froh einigermaßen auch nur ein Programm am laufen zu bekommen. Und wenn es abschweift vom programmierstyle her gesehen, dann soll es dir gegenüber keine Beleidigung entgegen bringen. Zu mal die Art und weiße wie dann geantwortet wird, die Freude und der Spaß an das Programmieren eher genommen als gegeben wird.
Eine Aussage wie, halte dich bitte mehr an die Richtlinien und dem Programmiertyp von Python, damit nicht so viele unsaubere Fehler entstehen, hätte es auch getan.

Zu dem Funktioniert trotz der sauberen Codierung wie man es selten bei Leuten so vorfindet das Programm auch nicht. Es gibt die Jahresbenutzungsdauer aus und das war es leider. Es sollte aber auch die Summe zum Netzentgeld niederlegen und das unterschieden zwischen < 2500 h und > 2500 h gefolgt von der Beachtung der jeweiligen Spannungsebene, die dann den Preis ausmachen ! Aber das habe ich ja jetzt soweit geschafft vom Aufbau her

Viele Grüße
Antworten