Seite 1 von 1

Wetterabfrage

Verfasst: Freitag 4. März 2022, 10:23
von tomus
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()

Re: Wetterabfrage

Verfasst: Freitag 4. März 2022, 11:35
von Sirius3
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()

Re: Wetterabfrage

Verfasst: Samstag 5. März 2022, 09:51
von tomus
Vielen Dank Sirius3 für die Antwort!