Wetterabfrage

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.
Antworten
tomus
User
Beiträge: 6
Registriert: Mittwoch 9. Juni 2021, 08:18

Hi zusammen,

ich hätte zu folgendem Programm eine Frage. Ich konnte mit eurer Hilfe die Wetterdaten entsprechend in die Felder eintragen und hätte noch eine Frage zur Eintragung via der API:

Die Liste LINE_TEMPLATES enthält vor den Parametern ["main"], sind diese abhängig bzw. notwendig für die API?

Die Schleife "for row_index, template in enumerate(LINE_TEMPLATES, 3):" die for Schleife verstehe ich leider nicht wirklich. Wozu werden in der Schleife 2 Werte mit den Werten LINE_TEMPLATES und 3 durchlaufen?

Falls Ihr mir weiterhelfen könnt freue ich mich natürlich riesig !

Gruß
Tom

#!/usr/bin/env python3
import tkinter as tk
from functools import partial

import requests

APP_ID = "NICHT MIT ÜBERGEBEN"
API_URL = "http://api.openweathermap.org/data/2.5/weather"

LINE_TEMPLATES = [
"Wetter in: {}",
"Luftfeuchtigkeit: {} %",
"Luftdruck: {} hpa",
"Temperatur: {}° C",
"Max. Temperatur: {}° C",
"Min. Temperatur: {}° C",
"Windgeschwindigkeit: {} m/s",
"Windrichtung: {}°",
]


def on_query(eingabefeld, status_label, line_labels):
entry_text = eingabefeld.get().strip()
if entry_text == "":
status_label.config(
text=(
"Bitte gibt eine Stadt ein,"
" für die du das Wetter wissen willst."
)
)
else:
status_label.config(text=f"Sie fragen das Wetter für {entry_text} ab.")
response = requests.get(
API_URL, params={"APPID": APP_ID, "q": entry_text}
)
weather_data = response.json()
for label, template, value in zip(
line_labels,
LINE_TEMPLATES,
[
weather_data["name"],
weather_data["main"]["humidity"],
weather_data["main"]["pressure"],
weather_data["main"]["temp"] - 273,
weather_data["main"]["temp_max"] - 273,
weather_data["main"]["temp_min"] - 273,
weather_data["wind"]["speed"],
weather_data["wind"]["deg"],
],

):
label["text"] = template.format(value)



fenster = tk.Tk()
fenster.title("Wetterabfrage")

tk.Label(fenster,highlightbackground='#3E4149', text="Gib eine Stadt ein: ").grid(row=0, column=0)
eingabefeld = tk.Entry(fenster, bd=5, width=40)
eingabefeld.grid(row=0, column=1)

query_button = tk.Button(fenster, highlightbackground='#3E4149', text="Abfragen")
query_button.grid(row=1, column=0)
tk.Button(fenster, text="Beenden", highlightbackground='#3E4149', command=fenster.quit).grid(
row=1, column=1
)

status_label = tk.Label(fenster)
status_label.grid(row=2, column=0, columnspan=2)

line_labels = []
for row_index, template in enumerate(LINE_TEMPLATES, 3):
label = tk.Label(fenster, text=template.format("?"))
label.grid(row=row_index, column=0)
line_labels.append(label)

query_button["command"] = partial(
on_query, eingabefeld, status_label, line_labels
)
fenster.mainloop()
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Bitte poste Code in Code-Tags.

Es heißt °C nicht ° C. Es fehlt eine main-Funktion.

Deine on_query-Funktion macht zu viel. Es sollte eine Funktion geben, die die Wetterdaten abfragt und aufbereitet und eine weitere, die dann die GUI füllt.

Zu Deiner for-Schleife: was passiert, steht doch da: eumerate liefert sowohl den row_index als auch die Daten. Und in Deinem Fenster fangen halt die Labels ab Zeile 3 an.

Code: Alles auswählen

#!/usr/bin/env python3
from functools import partial
from collections import namedtuple
import tkinter as tk
import requests

APP_ID = "NICHT MIT ÜBERGEBEN"
API_URL = "http://api.openweathermap.org/data/2.5/weather"

LINE_TEMPLATES = [
    "Wetter in: {0.name}",
    "Luftfeuchtigkeit: {0.humidity} %",
    "Luftdruck: {0.pressure} hpa",
    "Temperatur: {0.temperature} °C",
    "Max. Temperatur: {0.temperature_min} °C",
    "Min. Temperatur: {0.temperature_max} °C",
    "Windgeschwindigkeit: {0.wind_speed} m/s",
    "Windrichtung: {0.wind_degree}°",
]

WeatherData = namedtuple("WeatherData", "name,humidity,pressure,temperature,temperature_min,temperature_max, wind_speed, wind_degree")
EMPTY_WEATHER_DATA = WeatherData("?","?","?","?","?","?","?","?")

def read_wheather_data(query):
    response = requests.get(
        API_URL, params={"APPID": APP_ID, "q": query}
    )
    weather_data = response.json()
    return WeatherData(
        weather_data["name"],
        weather_data["main"]["humidity"],
        weather_data["main"]["pressure"],
        weather_data["main"]["temp"] - 273,
        weather_data["main"]["temp_max"] - 273,
        weather_data["main"]["temp_min"] - 273,
        weather_data["wind"]["speed"],
        weather_data["wind"]["deg"],
    )


def update_labels(labels, data):
    for label, template in zip(labels, LINE_TEMPLATES):
        label["text"] = template.format(data)

def on_query(eingabefeld, status_label, line_labels):
    entry_text = eingabefeld.get().strip()
    if entry_text == "":
        status_label.config(
            text=(
                "Bitte gibt eine Stadt ein,"
                " für die du das Wetter wissen willst."
            )
        )
    else:
        status_label.config(text=f"Sie fragen das Wetter für {entry_text} ab.")
        weather_data = read_wheather_data(entry_text)
        update_labels(line_labels, weather_data)


def main():
    fenster = tk.Tk()
    fenster.title("Wetterabfrage")

    tk.Label(fenster,highlightbackground='#3E4149', text="Gib eine Stadt ein: ").grid(row=0, column=0)
    eingabefeld = tk.Entry(fenster, bd=5, width=40)
    eingabefeld.grid(row=0, column=1)

    query_button = tk.Button(fenster, highlightbackground='#3E4149',  text="Abfragen")
    query_button.grid(row=1, column=0)
    tk.Button(fenster, text="Beenden", highlightbackground='#3E4149', command=fenster.quit).grid(
        row=1, column=1
    )

    status_label = tk.Label(fenster)
    status_label.grid(row=2, column=0, columnspan=2)

    line_labels = []
    for row_index in range(3, len(LINE_TEMPLATES) + 3):
        label = tk.Label(fenster)
        label.grid(row=row_index, column=0)
        line_labels.append(label)
    update_labels(line_labels, EMPTY_WEATHER_DATA)

    query_button["command"] = partial(
        on_query, eingabefeld, status_label, line_labels
    )
    fenster.mainloop()

if __name__ == "__main__":
    main()
tomus
User
Beiträge: 6
Registriert: Mittwoch 9. Juni 2021, 08:18

Vielen Dank Sirius3 für die Antwort!
Antworten