Seite 2 von 2
Re: Wetterdaten aus Internet in Python
Verfasst: Donnerstag 15. November 2018, 18:05
von No17
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?
Re: Wetterdaten aus Internet in Python
Verfasst: Donnerstag 15. November 2018, 18:25
von __deets__
wieso willst du denn *main* alle 10 Sekunden starten? Wenn fenster.label_akualisieren.
Re: Wetterdaten aus Internet in Python
Verfasst: Donnerstag 15. November 2018, 18:26
von __blackjack__
@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.
Re: Wetterdaten aus Internet in Python
Verfasst: Donnerstag 15. November 2018, 18:45
von No17
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.
Re: Wetterdaten aus Internet in Python
Verfasst: Donnerstag 15. November 2018, 19:01
von __blackjack__
@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.
Re: Wetterdaten aus Internet in Python
Verfasst: Freitag 16. November 2018, 20:55
von __blackjack__
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.
Re: Wetterdaten aus Internet in Python
Verfasst: Samstag 17. November 2018, 14:27
von No17
OK verstehe, das dass noch nicht so "sauber" ist, allerdings habe ich es jetzt geschafft, das es so funktioniert wie ich wollte

.
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
Re: Wetterdaten aus Internet in Python
Verfasst: Samstag 17. November 2018, 14:58
von __deets__
Was du suchst nennt sich Ausnahme oder Exception, und wie man die behandelt wird in jedem Grundlagentutorial besprochen.