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()
Wetterabfrage
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.
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()