【发布时间】:2020-04-29 14:56:13
【问题描述】:
我正在尝试使用 Openweathermap API 的 Tkinter 进行几天的天气预报。 在第一个函数:“def format_response(weather)”中,如果我使用 print(final_str),Python Shell 上的结果很好,但标签上没有显示任何内容。如果我使用 return(final_str),标签只显示一天的天气。如何在标签中显示整个结果?
谢谢你。
import tkinter as tk
from tkinter import font
from PIL import ImageTk, Image
import requests
from datetime import datetime
HEIGHT = 700
WIDTH = 700
def format_response(weather):
for i in range(10):
dt_txt = weather['list'][i]['dt']
date = (datetime.fromtimestamp(dt_txt)).strftime('%d-%b-%Y %H:%M:%S')
desc = weather['list'][i]['weather'][0]['description']
temp_min = weather['list'][i]['main']['temp_min']
temp_max = weather['list'][i]['main']['temp_max']
final_str = 'Date: %s \nConditions: %s \nMin.Temperature(Celsius): %s\nMax.Temperature(Celsius): %s' %(date, desc, temp_min, temp_max)
return(final_str)
def get_weather(city):
api_key = 'a4aa5e3d83ffefaba8c00284de6ef7c3'
url = 'https://api.openweathermap.org/data/2.5/forecast' # can switch between forecast and weather
params = {'APPID': api_key, 'q': city, 'units': 'metric'}
response = requests.get(url, params = params)
weather = response.json()
label['text'] = format_response(weather)
root = tk.Tk()
# CANVAS SIZE
canvas = tk.Canvas(root, height = HEIGHT, width = WIDTH)
canvas.pack()
# BACKGROUND
background_image = ImageTk.PhotoImage(Image.open("D:/Documents/Python/GUI/Weather App/beach.png"))
background_label = tk.Label(root, image = background_image)
background_label.place(relwidth = 1, relheight = 1)
# FRAME, UPPER
frame = tk.Frame(root, bg = '#b1cfff', bd = 5)
frame.place(relx = 0.5, rely = 0.15, relwidth = 0.80, relheight = 0.05, anchor = 'n')
# use value '1' to fill entire box
# ENTRY/INPUT
entry = tk.Entry(frame, bg='#fce300', font = 40)
entry.place(relx = 0.0, rely = 0, relwidth = 0.75, relheight = 1)
# BUTTON
button = tk.Button(frame, text = "SEARCH", font = 40, bg = 'black', fg = 'yellow', command = lambda: get_weather(entry.get()))
button.place(relx = 0.758, rely = 0, relwidth = 0.24, relheight = 1)
# FRAME, LOWER
lower_frame = tk.Frame(root, bg = '#b1cfff', bd = 5)
lower_frame.place(relx = 0.5, rely = 0.25, relwidth = 0.80, relheight = 0.6, anchor = 'n')
# LABEL, FRAME, LOWER
label = tk.Label(lower_frame, font = ('courier new',10), bg = '#fce300', anchor = 'nw', justify = 'left')
label.place(relwidth = 1, relheight = 1)
root.mainloop()
【问题讨论】:
-
带有无条件
return的for循环毫无意义;只有循环的第一次迭代才会发生,一旦它达到return,函数就完成。您需要从每次迭代中累积文本,然后在循环之外返回。 -
请考虑从帖子中修改您的 API 密钥