tkinter funktion in label ausgeben

Fragen zu Tkinter.
zoppo
User
Beiträge: 7
Registriert: Montag 3. Juni 2019, 21:53

Guten Abend zusammen,
ich stehe vor dem Problem ein Ergebnis einer Funktion in einem tkinter Label auszugeben. (In diesem Fall das Ergebnis der Berechnung des Taupunktes).
Zu allererst habe ich mir die Werte des verwendeten DHT 22 Sensors und meiner Berechnung in Shell ausgeben gelassen und möchte diese nun in einem Label wiedergeben, was bis auf
die Ausgabe meiner Berechnung funktioniert.

Ich würde mich freuen wenn mir jemand auf die Sprünge helfen könnte
Gruß

Hier mal Code-Schnipsel des Programms, es handelt sich um den letzten Abschnitt "#Ausgabe in tkInter/Labels"

Code: Alles auswählen


temperature = StringVar()
temperature.set("----"+" °C")      

humidity = StringVar()
humidity.set("----"+" %")      

taupunkt = StringVar()
taupunkt.set("----"+" °C")

temperatureLabel = Label(root, fg="white", background="#00dbde", textvariable=temperature, font=("Helvetica", 40,"bold"))
temperatureLabel.place(x=580, y=100)

humidityLabel = Label(root, fg="white", background="#00dbde", textvariable=humidity, font=("Helvetica", 40,"bold"))
humidityLabel.place(x=580, y=200)
 
taupunktLabel = Label(root, fg="white", background="#00dbde", textvariable=taupunkt, font=("Helvetica", 40,"bold"))
taupunktLabel.place(x=580, y=300)
 
root.attributes("-fullscreen",True)
root.bind("<1>",exit)

def exit():
    root.quit()

def taupunkt_berechnen(temp, hum):
   
    a = a_bestimmen(temp)
    b = b_bestimmen(temp)
    saettigungsdampfdruck = saettigungsdampfdruck_berechnen(a, b, temp)
    v = v_berechnen(hum, saettigungsdampfdruck)
    taupunkt = b*v/(a-v)
           
    return round(taupunkt, 2)

def v_berechnen(hum, saettigungsdampfdruck):
    dampfdruck = dampfdruck_berechnen(hum, saettigungsdampfdruck)
    v = math.log10(dampfdruck/6.1078)
    return v

def dampfdruck_berechnen(hum, saettigungsdampfdruck):
    dampfdruck = hum / 100 * saettigungsdampfdruck
    return dampfdruck

def saettigungsdampfdruck_berechnen(a, b, temp):
    saettigungsdampfdruck = 6.1078 * 10 ** ((a * temp) / (b + temp))
    return saettigungsdampfdruck

def a_bestimmen(temp):
    if temp >= 0:
        a = 7.5
    else:
        a = 7.6
    return a

def b_bestimmen(temp):
    if temp >= 0:
        b = 237.3
    else:
        b = 240.7
    return b

# Sensor auslesen und ausgeben
def main():
    root.after(2000, main)      
    # Temperatur und Luftfeuchtigkeit von DHT22 auslesen
    hum,temp = dht.read_retry(dht.DHT22, DHT)
   
    # Ausgabe in Shell
    print('Temperatur={0:0.1f}°C Luftfeuchtigkeit={1:0.1f}%'.format(temp,hum))
    print(taupunkt_berechnen(temp, hum))
   
    # Ausgabe in tkInter/Labels
    temp = "%.1f" %temp
    temperature.set(temp+" °C")  
    hum = "%.1f" %hum
    humidity.set(hum+"  %")
    tp =
    taupunkt.set(tp+" °C")
   
if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du hilfe willst, solltest Du schon funktionierenden Code posten, oder wenigstens die Fehlermeldung, die Du bekommst.
Du hast ja offensichtlich Dinge weggelassen, und nun weiß man nicht, ob da die Teile, die fehlen, Teil des Problems sind, oder nicht.
zoppo
User
Beiträge: 7
Registriert: Montag 3. Juni 2019, 21:53

Ich, dachte so wäre es vllt. Übersichtlicher, aber du hast recht.
Hier der funktionierende Code: (einige Importe die nicht gebraucht werden sind noch von vorherigen Versuchen drin)

Code: Alles auswählen

#Bibliotheken
from tkinter import *
import Adafruit_DHT as dht
import math
from time import sleep
import RPi.GPIO as GPIO
import tkinter as tk
import threading
import tkinter.font
from PIL import ImageTk, Image
import tkinter.messagebox

#DATA pin und Definitionen

DHT = 4

# Hauptfenster erstellen
root = tk.Tk()

# Fenster-Eigenschaften
root.title("Raumüberwachung mit Taupunktberechnung")
root.minsize(width=400, height=400)

# Labels zur Ausgabe der Sensordaten

#background = Label(root, image = image)
#background.place(x=0,y=0,relwidth=1, relheight=1)

temperature = StringVar()
temperature.set("----"+" °C")      

humidity = StringVar()
humidity.set("----"+" %")      

taupunkt = StringVar()
taupunkt.set("----"+" °C")

temperatureLabel = Label(root, fg="white", background="#00dbde", textvariable=temperature, font=("Helvetica", 40,"bold"))
temperatureLabel.place(x=580, y=100)

humidityLabel = Label(root, fg="white", background="#00dbde", textvariable=humidity, font=("Helvetica", 40,"bold"))
humidityLabel.place(x=580, y=200)
 
taupunktLabel = Label(root, fg="white", background="#00dbde", textvariable=taupunkt, font=("Helvetica", 40,"bold"))
taupunktLabel.place(x=580, y=300)
 
root.attributes("-fullscreen",True)
root.bind("<1>",exit)

def exit():
    root.quit()

def taupunkt_berechnen(temp, hum):
   
    a = a_bestimmen(temp)
    b = b_bestimmen(temp)
    saettigungsdampfdruck = saettigungsdampfdruck_berechnen(a, b, temp)
    v = v_berechnen(hum, saettigungsdampfdruck)
    taupunkt = b*v/(a-v)
           
    return round(taupunkt, 2)

def v_berechnen(hum, saettigungsdampfdruck):
    dampfdruck = dampfdruck_berechnen(hum, saettigungsdampfdruck)
    v = math.log10(dampfdruck/6.1078)
    return v

def dampfdruck_berechnen(hum, saettigungsdampfdruck):
    dampfdruck = hum / 100 * saettigungsdampfdruck
    return dampfdruck

def saettigungsdampfdruck_berechnen(a, b, temp):
    saettigungsdampfdruck = 6.1078 * 10 ** ((a * temp) / (b + temp))
    return saettigungsdampfdruck

def a_bestimmen(temp):
    if temp >= 0:
        a = 7.5
    else:
        a = 7.6
    return a

def b_bestimmen(temp):
    if temp >= 0:
        b = 237.3
    else:
        b = 240.7
    return b

# Sensor auslesen und ausgeben
def main():
    root.after(2000, main)      
    # Temperatur und Luftfeuchtigkeit von DHT22 auslesen
    hum,temp = dht.read_retry(dht.DHT22, DHT)
   
    # Ausgabe in Shell
    print('Temperatur={0:0.1f}°C Luftfeuchtigkeit={1:0.1f}%'.format(temp,hum))
    print(taupunkt_berechnen(temp, hum))
   
    # Ausgabe in tkInter/Labels
    temp = "%.1f" %temp
    temperature.set(temp+" °C")  
    hum = "%.1f" %hum
    humidity.set(hum+"  %")
    tp =
    taupunkt.set(tp+" °C")
   
if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

`as` dient dazu Module umzubenennen. Bei `import RPi.GPIO as GPIO` wird aber nichts umbenannt, das as ist also Quatsch. Das einzig sinnvolle, was man tun könnte, wäre `import RPi.GPIO as gpio`, dann hält sich der Modulname wenigstens an die Namenskonvention. Apropos Namenskonvention, Variablen schreibt man klein_mit_unterstrich (taupunkt_label). Mischen von Englisch und Deutsch, sogar im gleichen Namen, ist verwirrend.
Du importierst tkinter sowohl per * als auch `as tk`. Ersteres nicht benutzen, denn mit * holst Du Dir unkontrolliert über 200 Namen in Deinen Namensraum. Tk-Objekte immer per tk.xyz ansprechen.
Zeilen 17-48 gehören in eine Funktion, die üblicherweise `main` genannt wird. Das was Du `main` nennst, würde man wohl `loop` nennen.
Das `exit` das Du an die <1> bindest, ist nicht das `exit´ das Du zwei Zeilen später definierst, hier kannst Du aber auch gleich root.quit benutzen.
Gerundet wird erst bei der Ausgabe. Nicht-triviale Zahlenwerte (6.1078) definiert man am Anfang der Datei als Konstanten.

Funktionen bekommen alles, was sie brauchen über ihre Argumente, exit braucht z.B. `root`, Dein `main` temperature, humidity und taupunkt.

Du hast immer noch einen SyntaxError und verrätst immer noch nicht, was passiert, und wie sich Dein Fehler äußert.
Hast Du schon einmal ein GUI-Programm geschrieben? Und was ist eines der wesentlichen Dinge, die dafür sorgen, dass die GUI läuft?
zoppo
User
Beiträge: 7
Registriert: Montag 3. Juni 2019, 21:53

Danke für deine Antwort.
Ich habe noch nie ein GUI-Programm geschrieben und arbeite mich da gerade mehr oder weniger ein.
Wenn ich tkinter nicht per * importiere bekomme ich ständig eine Fehlermeldung angezeigt, dass irgendein Modul fehlt. Ich denke dann muss ich mich mal erkundigen wie die einzelnen Objekte, die ich benötige, aufgerufen werden.
Ich werde deine Anmerkungen beherzigen und versuchen sie bestmöglich auszubessern.

Im folgenden Bild ist mein Problem zu erkennen:

Bild

Die Temperatur und Luftfeuchtigkeit bekomme ich ohne Probleme in der GUI ausgegeben. Dort wo "- - - - °C" steht, möchte ich die Berechnung meines Taupunktes ausgeben, die ich im folgenden Abschnitt festlegen möchte. Allerdings weiß ich nicht, wie ich das Ergebnis meiner Berechnung als Variable deklariere, wenn du verstehst was ich meine.

Code: Alles auswählen

tp =
taupunkt.set(tp+" °C")
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zoppo: Das Bild kann ja nicht mit dem Code entstanden sein, den Du uns zeigst, genau wegen dem Codeabschnitt: das ist ein Syntaxfehler, der Code kommt so also nicht am Compiler vorbei. Hinter dem Gleichheitszeichen muss ein Ausdruck stehen der den Wert beschreibt, der an den Namen `tp` gebunden werden soll. Der Rechner/Python füllt diese Lücke nicht durch Gedankenlesen für Dich. Das wäre schön, würde aber andererseits Programmierer arbeitslos machen. 😉

Was Du da jetzt nicht weisst/verstehst, verstehe ich wiederum nicht, denn Du hast das ja bereits mehrfach in Deinem Programm gemacht – warum geht das da jetzt plötzlich nicht mehr so wie an all den anderen Stellen im Programm?

Neben den Namenskonventionen zur Schreibweise, sollte man übrigens keine kryptischen Abkürzungen verwenden. Der Wert für den Taupunkt sollte `taupunkt` heissen und nicht `tp`. Das was jetzt `taupunkt` heisst ist kein Taupunkt, sondern ein Label in dem der Taupunkt angezeigt werden soll. Analog gilt das auch für `temp`/`temperature` und `hum`/`humidity`.

Warum verwendest Du für die Labeltexte den ``%``-Operator und pappst dann die Einheit/das Prozentzeichen per ``+`` an das Ergebnis, wo Du doch ein paar Zeilen davor schon `format()` für die `print()`-Ausgabe verwendet hast?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
zoppo
User
Beiträge: 7
Registriert: Montag 3. Juni 2019, 21:53

Mir ist schon klar, dass der Compiler nicht meine Gedanken lesen kann. Ich habe die Stelle nur freigelassen weil meine Ideen nicht funktioniert haben.

Das Programm was auf dem Bild zu sehen ist, ist 1zu1 das was ich hier gepostet habe.
Wenn ich in Thonny auf run klicke, ist das das Ergebnis was ich ausgegeben bekomme.

Die format Funktion hat in Verbindung mit der Label Ausgabe, warum auch immer, nicht funktioniert, weswegen ich dann auf diese umständliche Variante zurückgegriffen habe.

P.s: es ist anzumerken, dass ich ein Python Anfänger bin
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

Dein Programm macht doch nur eine Ausgabe mittels print. Wie genau soll denn das oben gezeigt dabei herauskommen?
Ich sehe da nämlich nicht, dass irgend ein Fenster angezeigt wird.
Oder startet deine Umgebung den mainloop magisch?
zoppo
User
Beiträge: 7
Registriert: Montag 3. Juni 2019, 21:53

sparrow hat geschrieben: Dienstag 4. Juni 2019, 09:08 Dein Programm macht doch nur eine Ausgabe mittels print. Wie genau soll denn das oben gezeigt dabei herauskommen?
Ich sehe da nämlich nicht, dass irgend ein Fenster angezeigt wird.
Oder startet deine Umgebung den mainloop magisch?
Ich habe in meinem Code doch Labels gesetzt und schreibe weiter unten im Code meine Messdaten rein.

siehe hier:

Code: Alles auswählen

 
  # Ausgabe in tkInter/Labels
    temp = "%.1f" %temp
    temperature.set(temp+" °C")  
    hum = "%.1f" %hum
    humidity.set(hum+"  %")
    tp =
    taupunkt.set(tp+" °C")
In Thonny kann ich das Programm ausführen wie es oben zu sehen ist.
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

Und wo genau sagst du ihm in dem Code oben, dass er irgendetwas anzeigen soll, das Labels enthält?
Und das Programm sollte mit dem Syntax-Fehler gar nicht laufen.

Hier ist auf deutsch beschrieben, was Funktionen in Python sind. Da du ja eine entsprechend Funktion bereits hast, scheint das Problem zu sein, dass du nicht weißt, wie man sie aufruft. Da sollte die Seite helfen.
Funktionen ruft man mit funktionsname() auf, wobei in den Klammern Parameter stehen. Das Ergebnis der Funktion (mittels return zurück gegeben) kann man an einen Namen binden.
Also ruf die vorhandene Funktion mit den Parametern auf. Das tust du doch schon ein paar Zeilen weiter oben.
Wer hat die Funktion eigentlich geschrieben?
zoppo
User
Beiträge: 7
Registriert: Montag 3. Juni 2019, 21:53

sparrow hat geschrieben: Dienstag 4. Juni 2019, 09:48 Und wo genau sagst du ihm in dem Code oben, dass er irgendetwas anzeigen soll, das Labels enthält?
Und das Programm sollte mit dem Syntax-Fehler gar nicht laufen.
Hier definiere ich doch meine Labels und weise eine Position zu.
Und mit, beispielsweise temperature.set schreibe ich dann mein Ergebnis rein.

Code: Alles auswählen

temperatureLabel = Label(root, fg="white", background="#00dbde", textvariable=temperature, font=("Helvetica", 40,"bold"))
temperatureLabel.place(x=580, y=100)

humidityLabel = Label(root, fg="white", background="#00dbde", textvariable=humidity, font=("Helvetica", 40,"bold"))
humidityLabel.place(x=580, y=200)
 
taupunktLabel = Label(root, fg="white", background="#00dbde", textvariable=taupunkt, font=("Helvetica", 40,"bold"))
taupunktLabel.place(x=580, y=300)
Eben habe ich noch versucht vergebens mein Programm über die Kommandozeile zu starten - Hier wird mir der angesprochene Syntax-Fehler angzeigt.
Starte ich das Programm einfach über Thonny, wird das GUI ausgeführt und die Messdaten werden in Labels und in Shell angezeigt. Warum das so funktioniert kann ich nicht sagen, aber ich verstehe was du meinst. Den Fehler werde ich später beheben.
Hier ist auf deutsch beschrieben, was Funktionen in Python sind. Da du ja eine entsprechend Funktion bereits hast, scheint das Problem zu sein, dass du nicht weißt, wie man sie aufruft. Da sollte die Seite helfen.
Das sieht sehr hilfreich aus, ich danke dir. Ich arbeite das heute Abend mal durch und gebe dann nochmal Rückmeldung wie der Stand der Dinge ist.
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

Ist das eigentlich ein Beispielcode, den du nur modifizierst, oder hast du den tatsächlich geschrieben?
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zoppo: Es ist egal ob Du das von der Kommandozeile oder über Thonny startest – wenn da ein Syntaxfehler enthalten ist, dann läuft das nicht. Oder anders herum betrachtet: Wenn das mit Thonny läuft und etwas anzeigt, dann ist das nicht der Quelltext den Du uns hier gezeigt hast, sondern ein anderer der mindestens zwei Unterschiede enthält: die Zeile mit dem Syntaxfehler kann da nicht drin sein, und irgendwo muss der fehlende Aufruf der GUI-Hauptschleife her kommen.

Ja, Du erzeugst da `Label`\s und setzt auch deren Text, aber das nützt alles nichts wenn das Programm einfach endet, denn dann verschwindet auch die GUI. Man muss die GUI-Hauptschleife aufrufen und die muss laufen, damit die GUI auch dauerhaft angezeigt wird, und auf Benutzereingaben reagieren kann oder auf Zeitereignisse die mit `after()` angefordert werden.

Letztlich wirst Du Dich auch mit objektorientierter Programmierung (OOP) auseinander setzen. Am besten *vor* GUI-Programmierung. OOP setzt aber voraus, dass man Funktionen verstanden hat. Ich habe das Gefühl Du willst zu schnell zu viel auf einmal.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Thonny scheint selbst tkinter zu benutzen und wahrscheinlich keine separate Python-Instanz zu starten, wenn Programme ausgeführt werden. Also der typische Fehler, wenn man sich auf seine IDE verläßt, die nicht ordentlich designet ist.

@zoppo: wie sollen wir helfen, wenn wir nicht wissen, was Du versucht hast und was dann schief läuft. Das gilt für die format-Geschichte genauso wie für den nicht funktionierenden Taupunkt. Du solltest schreiben: "Hier ist der Code, den ich ausprobiert habe, und es kommt folgende Fehlermeldung wenn ich das Programm starte."

Denn, Deine Print-Ausgabe funktioniert und Du hast für Temperatur und Feuchtigkeit gezeigt, dass es auch mit Label funktioniert. daher mußt Du auch wissen, wie Du den Taupunkt anzeigen kannst.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi zoppo

Hier etwas fürs Studium:

Code: Alles auswählen

#!/usr/bin/env python3
'''
Tipps:
    a) from tkinter import *           -> VERGESSEN!
    b) place                           -> WENN MéGLICH VERGESSEN!
    c) Gui-Programmierung ohne OOP     -> VERGESSEN!
    d) Globale Vars                    -> VERGESSEN!
'''

import math
import random
import tkinter as tk

APP_TITLE = "Raumüberwachung mit Taupunktberechnung"
SAMPLING_TIME = 1000


class Application(object):

    def __init__(self, main_win):
        self.main_win = main_win
        self.main_win.protocol("WM_DELETE_WINDOW", self.close)
        
        self.build()
        self.sampling_loop()
        
    def build(self):
        self.main_frame = tk.Frame(self.main_win)
        self.main_frame.pack(fill='both', expand=True)

        data_display_frame = tk.Frame(self.main_frame)
        data_display_frame.pack(expand=True)
        
        self.temperature = tk.StringVar()
        self.temperature.set("----"+" °C")      

        self.humidity = tk.StringVar()
        self.humidity.set("----"+" %")      

        self.taupunkt = tk.StringVar()
        self.taupunkt.set("----"+" °C")

        tk.Label(data_display_frame, fg="white",
            background="#00dbde", textvariable=self.temperature, width=10,            font=("Helvetica",40,"bold")).pack(fill='x', pady=8)

        tk.Label(data_display_frame, fg="white",
            background="#00dbde", textvariable=self.humidity,
            font=("Helvetica", 40,"bold")).pack(fill='x', pady=8)
         
        tk.Label(data_display_frame, fg="white",
            background="#00dbde", textvariable=self.taupunkt,
            font=("Helvetica", 40,"bold")).pack(fill='x', pady=8)

        button_frame = tk.Frame(self.main_frame)
        button_frame.pack(side='bottom', pady=10)
        
        tk.Button(button_frame, text="Beenden", font=("Helvetica", 12,"bold"),
            command=self.close).pack()

    def taupunkt_berechnen(self, temp, hum):
        a = self.a_bestimmen(temp)
        b = self.b_bestimmen(temp)
        saettigungsdampfdruck = self.saettigungsdampfdruck_berechnen(a, b, temp)
        v = self.v_berechnen(hum, saettigungsdampfdruck)
        taupunkt = b*v/(a-v)
               
        return round(taupunkt, 2)

    def sampling_loop(self):
        temperature =  random.randrange(5.0, 28.0)
        humidity = random.randint(70, 90)
        taupunkt = self.taupunkt_berechnen(temperature, humidity)
                    
        self.temperature.set("{0:0.1f} °C".format(temperature))
        self.humidity.set("{} %".format(humidity))         
        self.taupunkt.set("{0:0.1f} °C".format(taupunkt))
               
        self.main_win.after(SAMPLING_TIME, self.sampling_loop)

    def dampfdruck_berechnen(self, hum, saettigungsdampfdruck):
        dampfdruck = hum / 100 * saettigungsdampfdruck
        return dampfdruck

    def saettigungsdampfdruck_berechnen(self, a, b, temp):
        saettigungsdampfdruck = 6.1078 * 10 ** ((a * temp) / (b + temp))
        return saettigungsdampfdruck

    def v_berechnen(self, hum, saettigungsdampfdruck):
        dampfdruck = self.dampfdruck_berechnen(hum, saettigungsdampfdruck)
        v = math.log10(dampfdruck/6.1078)
        return v

    def a_bestimmen(self, temp):
        if temp >= 0:
            a = 7.5
        else:
            a = 7.6
        return a

    def b_bestimmen(self, temp):
        if temp >= 0:
            b = 237.3
        else:
            b = 240.7
        return b
        
    def close(self):
        self.main_win.withdraw()
        self.main_win.destroy()
        

def exit():
    root.quit()

def main():
    main_win = tk.Tk()
    main_win.title(APP_TITLE)
    main_win.attributes("-fullscreen",True)
    main_win.minsize(width=400, height=400)
    
    app = Application(main_win)
    
    main_win.mainloop()
    
    
if __name__ == "__main__":
    main()
Gruss wuf :-)
Take it easy Mates!
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@wuf: die Funktionen `dampfdruck_berechnen` oder `v_berechnen` etc haben nichts mit der GUI zu tun, gehören also alle nicht in die Klasse. Die Funktion `exit` ist noch ein Überbleibsel, was nicht mehr funktioniert. Was in der `build`-Methode steht, sollte direkt in `__init__` stehen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

@Sirius3: Danke für deine Hinweise.

Hi zoppo

Das Ganze kann natürlich auf verschiedene Arten geschrieben werden. Zum Beispiel auch so:

Code: Alles auswählen

#!/usr/bin/env python3
'''
Tipps:
    a) from tkinter import *           -> VERGESSEN!
    b) place                           -> WENN MéGLICH VERGESSEN!
    c) Gui-Programmierung ohne OOP     -> VERGESSEN!
    d) Globale Vars                    -> VERGESSEN!
'''

import math
import random
import tkinter as tk

APP_TITLE = "Raumüberwachung mit Taupunktberechnung"
SAMPLING_TIME = 1000


class Caculations(object):

    def taupunkt_berechnen(self, temp, hum):
        a = self.a_bestimmen(temp)
        b = self.b_bestimmen(temp)
        saettigungsdampfdruck = self.saettigungsdampfdruck_berechnen(a, b, temp)
        v = self.v_berechnen(hum, saettigungsdampfdruck)
        taupunkt = b*v/(a-v)
               
        return round(taupunkt, 2)

    def dampfdruck_berechnen(self, hum, saettigungsdampfdruck):
        dampfdruck = hum / 100 * saettigungsdampfdruck
        return dampfdruck

    def saettigungsdampfdruck_berechnen(self, a, b, temp):
        saettigungsdampfdruck = 6.1078 * 10 ** ((a * temp) / (b + temp))
        return saettigungsdampfdruck

    def v_berechnen(self, hum, saettigungsdampfdruck):
        dampfdruck = self.dampfdruck_berechnen(hum, saettigungsdampfdruck)
        v = math.log10(dampfdruck/6.1078)
        return v

    def a_bestimmen(self, temp):
        if temp >= 0:
            a = 7.5
        else:
            a = 7.6
        return a

    def b_bestimmen(self, temp):
        if temp >= 0:
            b = 237.3
        else:
            b = 240.7
        return b    


class Gui(object):
    LABEL_FONT = ("Helvetica", 40,"bold")
    LABEL_BG = "#00dbde"
    LABEL_FG = 'white'
    BUTTON_FONT = ("Helvetica", 12,"bold")
    
    def __init__(self, app):
        self.app = app
    
        self.main_frame = tk.Frame(app.main_win)
        self.main_frame.pack(fill='both', expand=True)

        data_display_frame = tk.Frame(self.main_frame)
        data_display_frame.pack(expand=True)
        
        self.temperature = tk.StringVar()      

        self.humidity = tk.StringVar()      

        self.taupunkt = tk.StringVar()

        tk.Label(data_display_frame, fg=self.LABEL_FG,
            background=self.LABEL_BG, textvariable=self.temperature, width=10,
            font=self.LABEL_FONT).pack(fill='x', pady=8)
            
        tk.Label(data_display_frame, fg=self.LABEL_FG,
            background=self.LABEL_BG, textvariable=self.humidity,
            font=self.LABEL_FONT).pack(fill='x', pady=8)
         
        tk.Label(data_display_frame, fg=self.LABEL_FG,
            background=self.LABEL_BG, textvariable=self.taupunkt,
            font=self.LABEL_FONT).pack(fill='x', pady=8)

        button_frame = tk.Frame(self.main_frame)
        button_frame.pack(side='bottom', pady=10)
        
        tk.Button(button_frame, text="Beenden", font=self.BUTTON_FONT,
            command=app.close).pack()
        

class Application(Caculations):
    
    def __init__(self, main_win):
        self.main_win = main_win
        
        self.gui = Gui(self)
        self.sampling_loop()
        
    def sampling_loop(self):
        temperature =  random.randrange(5.0, 28.0)
        humidity = random.randint(70, 90)
        taupunkt = self.taupunkt_berechnen(temperature, humidity)
                    
        self.gui.temperature.set("{0:0.1f} °C".format(temperature))
        self.gui.humidity.set("{} %".format(humidity))         
        self.gui.taupunkt.set("{0:0.1f} °C".format(taupunkt))
               
        self.main_win.after(SAMPLING_TIME, self.sampling_loop)

    def close(self):
        self.main_win.withdraw()
        self.main_win.destroy()


def main():
    main_win = tk.Tk()
    main_win.title(APP_TITLE)
    main_win.attributes("-fullscreen",True)
    main_win.minsize(width=400, height=400)
    
    app = Application(main_win)
    
    main_win.mainloop()
    
    
if __name__ == "__main__":
    main()
Gruss wuf :-)
Take it easy Mates!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wuf: Man kann das auch alles auf Modulebene mit viel ``global`` schreiben, aber das ist genau so falsch wie die `Calculations`-Klasse die keine Klasse ist, sondern Funktionen sinnlos in eine Klasse gestopft. Und da `Calculations` keine Klasse ist, ist es folglich auch ein Fehler das `Application` davon auch noch erbt.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

@black_jack: Ok! Ok! Um den sinnfreien Nachgeschmack des Skripts etwas zu entschärfen könnte eventuell die folgende Variante besser sein?

Code: Alles auswählen

#!/usr/bin/env python3
'''
Tipps:
    a) from tkinter import *           -> VERGESSEN!
    b) place                           -> WENN MéGLICH VERGESSEN!
    c) Gui-Programmierung ohne OOP     -> VERGESSEN!
    d) Globale Vars                    -> VERGESSEN!
'''

import math
import random
import tkinter as tk

APP_TITLE = "Raumüberwachung mit Taupunktberechnung"
SAMPLING_TIME = 1000


class Gui(object):
    LABEL_FONT = ("Helvetica", 40,"bold")
    LABEL_BG = "#00dbde"
    LABEL_FG = 'white'
    BUTTON_FONT = ("Helvetica", 12,"bold")
    
    def __init__(self, app):
        self.app = app
    
        self.main_frame = tk.Frame(app.main_win)
        self.main_frame.pack(fill='both', expand=True)

        data_display_frame = tk.Frame(self.main_frame)
        data_display_frame.pack(expand=True)
        
        self.temperature = tk.StringVar()      

        self.humidity = tk.StringVar()      

        self.taupunkt = tk.StringVar()

        tk.Label(data_display_frame, fg=self.LABEL_FG,
            background=self.LABEL_BG, textvariable=self.temperature, width=10,
            font=self.LABEL_FONT).pack(fill='x', pady=8)
            
        tk.Label(data_display_frame, fg=self.LABEL_FG,
            background=self.LABEL_BG, textvariable=self.humidity,
            font=self.LABEL_FONT).pack(fill='x', pady=8)
         
        tk.Label(data_display_frame, fg=self.LABEL_FG,
            background=self.LABEL_BG, textvariable=self.taupunkt,
            font=self.LABEL_FONT).pack(fill='x', pady=8)

        button_frame = tk.Frame(self.main_frame)
        button_frame.pack(side='bottom', pady=10)
        
        tk.Button(button_frame, text="Beenden", font=self.BUTTON_FONT,
            command=app.close).pack()
        

class Application(object):
    
    def __init__(self, main_win):
        self.main_win = main_win
        
        self.gui = Gui(self)
        self.sampling_loop()
        
    def sampling_loop(self):
        temperature =  random.randrange(5.0, 28.0)
        humidity = random.randint(70, 90)
        taupunkt = taupunkt_berechnen(temperature, humidity)
                    
        self.gui.temperature.set("{0:0.1f} °C".format(temperature))
        self.gui.humidity.set("{} %".format(humidity))         
        self.gui.taupunkt.set("{0:0.1f} °C".format(taupunkt))
               
        self.main_win.after(SAMPLING_TIME, self.sampling_loop)

    def close(self):
        self.main_win.withdraw()
        self.main_win.destroy()


def taupunkt_berechnen(temp, hum):
    a = a_bestimmen(temp)
    b = b_bestimmen(temp)
    saettigungsdampfdruck = saettigungsdampfdruck_berechnen(a, b, temp)
    v = v_berechnen(hum, saettigungsdampfdruck)
    taupunkt = b*v/(a-v)
    return round(taupunkt, 2)

def dampfdruck_berechnen(hum, saettigungsdampfdruck):
    dampfdruck = hum / 100 * saettigungsdampfdruck
    return dampfdruck

def saettigungsdampfdruck_berechnen(a, b, temp):
    saettigungsdampfdruck = 6.1078 * 10 ** ((a * temp) / (b + temp))
    return saettigungsdampfdruck

def v_berechnen(hum, saettigungsdampfdruck):
    dampfdruck = dampfdruck_berechnen(hum, saettigungsdampfdruck)
    v = math.log10(dampfdruck/6.1078)
    return v

def a_bestimmen(temp):
    if temp >= 0:
        a = 7.5
    else:
        a = 7.6
    return a

def b_bestimmen(temp):
    if temp >= 0:
        b = 237.3
    else:
        b = 240.7
    return b    

def main():
    main_win = tk.Tk()
    main_win.title(APP_TITLE)
    main_win.attributes("-fullscreen",True)
    main_win.minsize(width=400, height=400)
    
    app = Application(main_win)
    
    main_win.mainloop()
    
    
if __name__ == "__main__":
    main()
Druss wuf :-)
Take it easy Mates!
zoppo
User
Beiträge: 7
Registriert: Montag 3. Juni 2019, 21:53

Ich kam leider erst jetzt dazu mich wieder meinem Projekt zu widmen.
Vielen Dank für die bisherigen Antworten - ich werde mich jetzt erstmal da durcharbeiten

Gruß :)

P.S: @wuf: Danke, dass du mir mal zeigst, wie strukturiert ein Programm sein kann - da werde ich ab nun auch mehr achten
Antworten