Wetterdaten aus Internet in Python

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.
No17
User
Beiträge: 16
Registriert: Mittwoch 24. Oktober 2018, 14:40

ok verstehe
dennoch wollte ich jetzt gerne, das die Daten in einem Label angezeigt werden.

Code: Alles auswählen

observation = owm.weather_at_place('MEINE STADT, de')
w = observation.get_weather()
class WetterVorhersage:

    def __init__(self, temperatur, wind):
        self.temperatur = temperatur
        self.wind = wind
        print("erstellt")
    def print_wetter(self):
        print("Temperatur aktuell {}".format(self.temperatur.get("temp")))
        print("maximal {}".format(self.temperatur.get("temp_max")))
        print("minimal {}".format(self.temperatur.get("temp_min")))
        print("Wind {}" .format(self.wind.get("speed")))
        print("Windrichtung {}".format(self.wind.get("deg")))

    def label_aktualisieren(self):
        Temperatur.config(text="Temperatur aktuell {}".format(self.temperatur.get("temp")))
        Temperatur_max.config(text="maximal {}".format(self.temperatur.get("temp_max")))
        Temperatur_min.config(text="mainimal {}".format(self.temperatur.get("temp_min")))
        Status_Label.config(text=self.wind)

        
        
        
vorhersage = WetterVorhersage(w.get_temperature("celsius"), w.get_wind())
vorhersage.print_wetter()

def main():
    vorhersage.label_aktualisieren()
    vorhersage.print_wetter()
    print ("*******************************")
    fenster.after(10000, main)
Eigentlich habe ich gehofft, das die Wetterdaten jetzt aktualisiert werden und somit ständig aktuell sind. Leider ist das nicht der Fall. Wie kann ich das jetzt lösen, das die Daten ständig neu geladen werden?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

wieso willst du denn *main* alle 10 Sekunden starten? Wenn fenster.label_akualisieren.
Benutzeravatar
__blackjack__
User
Beiträge: 14017
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@No17: Na welche Zeile/Anweisung holt denn die Daten vom Server? Und wie oft/wann wird die ausgeführt? Wie oft/wann müsste die ausgeführt werden?

Und wenn Du schon Klassen verwendest, dann gibt es keinen Grund mehr mit globalen Variablen zu arbeiten. Funktionen und Methoden sollten alles was sie benötigen (ausser Konstanten) als Argumente übergeben bekommen. Das `label_aktualisieren()` also auf ”magische” Weise einfach so auf die vier Label-Objekte zugreifen kann, ist nicht okay.

Eine sinnvolle Klasse ist das IMHO immer noch nicht. Wenn Du einfach nur Werte zu einem Objekt zusammenfassen möchtest, dann schau Dir mal `collections.namedtuple` an. Oder falls die Attribute veränderbar sein sollen finde ich https://www.attrs.org/ ganz praktisch, selbst dann wenn man die Klasse als „frozen“ markiert und `attr.evolve()` für “Veränderungen“ verwendet.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
No17
User
Beiträge: 16
Registriert: Mittwoch 24. Oktober 2018, 14:40

So weit ich weiß holt man die Daten mit

Code: Alles auswählen

observation = owm.weather_at_place('MEINE STADT, de')
w = observation.get_weather()
Eine sinnvolle Klasse ist das IMHO immer noch nicht. Wenn Du einfach nur Werte zu einem Objekt zusammenfassen möchtest, dann schau Dir mal `collections.namedtuple` an. Oder falls die Attribute veränderbar sein sollen finde ich https://www.attrs.org/ ganz praktisch, selbst dann wenn man die Klasse als „frozen“ markiert und `attr.evolve()` für “Veränderungen“ verwendet.
werde ich mir gleich mal angucken. Hat das nur den Vorteil, dass das zugreifen auf die Label "richtig" erfolgt?
Das `label_aktualisieren()` also auf ”magische” Weise einfach so auf die vier Label-Objekte zugreifen kann, ist nicht okay.
Benutzeravatar
__blackjack__
User
Beiträge: 14017
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@No17: Das hat mit den Labeln nix zu tun, das war als Vorschlag um Deine Klasse zu ersetzen deren Methoden eigentlich einfach nur Funktionen sein sollten. Oder im Falle der Labels eine Methode auf einer anderen Klasse, nämlich die wo die GUI mit modelliert wird.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 14017
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn man das Wetter in ein eigenes Datenobjekt umverpacken möchte, zum Beispiel um bessere Namen und eine ”Attribut-API” zu haben, könnte man das beispielsweise so machen:

Code: Alles auswählen

#!/usr/bin/env python3
from addict import Dict
from attr import attrib, attrs
from pyowm import OWM

API_KEY = '<API KEY>'
PLACE = 'Berlin,DE'


@attrs
class Weather:
    
    temperatures = attrib()
    wind = attrib()
    
    @classmethod
    def from_owm(cls, owm, place):
        weather = owm.weather_at_place(place).get_weather()
        temperature = weather.get_temperature('celsius')
        return cls(
            Dict(
                current=temperature['temp'],
                min=temperature['temp_min'],
                max=temperature['temp_max'],
            ),
            Dict(weather.get_wind()),
        )


def print_weather(weather):
    print(f' Temperatur aktuell: {weather.temperatures.current}°C')
    print(f'            maximal: {weather.temperatures.max}°C')
    print(f'            minimal: {weather.temperatures.min}°C')
    print(f'Windgeschwindigkeit: {weather.wind.speed} m/s')
    print(f'       Windrichtung: {weather.wind.deg}°')


def main():
    owm = OWM(API_KEY)
    weather = Weather.from_owm(owm, PLACE)
    print_weather(weather)


if __name__ == '__main__':
    main()
`addict` und `attr` sind beides externe, aber sehr praktische Module.

´print_weather()` ist weiterhin eine einfache Funktion und das aktualisieren von Labels würde in einer entsprechenden Methode auf einem GUI-Objekt Sinn machen, aber nicht als Methode auf dem Wetterdatenobjekt.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
No17
User
Beiträge: 16
Registriert: Mittwoch 24. Oktober 2018, 14:40

OK verstehe, das dass noch nicht so "sauber" ist, allerdings habe ich es jetzt geschafft, das es so funktioniert wie ich wollte 8) .
Ich glaube ich lasse das jetzt so wie es ist und verändere nicht wieder alles.
Eine Frage die aber weniger damit zutun hat habe ich trotzdem noch. Wenn jetzt z.B das Internet vom PC weg ist, dann gibt es ja einen Fehler in der Shell. Gibt es eine Möglichkeit, das Python das mitbekommt und ich daraufhin eine Aktion ausführen lasse?

LG
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was du suchst nennt sich Ausnahme oder Exception, und wie man die behandelt wird in jedem Grundlagentutorial besprochen.
Antworten