我如何在我的kivy程序中使用json api

时间:2015-10-02 19:42:13

标签: python json kivy

我现在正在阅读O' Reilly在Kivy创建应用程序,这是一个我无法正常工作的例子,因为在他写作的时候这本书openWeatherMap并不需要api密钥(APPID),但现在它确实如此,并且我是新手程序员,并且不知道如何更改代码以便它可以正常工作。

这是main.py源代码:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.network.urlrequest import UrlRequest
import json

class AddLocationForm(BoxLayout):
    search_input = ObjectProperty()

def search_location(self):
    search_template = "http://api.openweathermap.org/data/2.5" + "find?q={}&type=like"
    search_url = search_template.format(self.search_input.text)
    request = UrlRequest(search_url, self.found_location)

def found_location(self, request, data):
    data = json.loads(data.decode()) if not isinstance(data, dict) else data
    cities = ["{} ({})".format(d['name'], d['sys']['country'])
        for d in data['list']]
    self.search_results.item_strings = cities
    print("\n".join(cities))

class WeatherApp(App):
pass

if __name__ == '__main__':
WeatherApp().run()

这是weather.kv源代码:

AddLocationForm:

<AddLocationForm>:
    orientation: "vertical"
    search_input: search_box
    search_results: search_results_list
    BoxLayout:
    height: "40dp"
    size_hint_y: None
    TextInput:
        id: search_box
        size_hint_x: 50
    Button:
        text: "Search"
        size_hint_x: 25
        on_press: root.search_location()
    Button:
        text: "Current Location"
        size_hint_x: 25
ListView:
    id: search_results_list
    item_strings: []

代码很简单,您将城市名称放在文本框中并点击搜索,然后通过显示收到的名称来确认。

1 个答案:

答案 0 :(得分:2)

好的,所以我不知道我是否迟到但最近买了这本书,我也发现自己完全陷入了这个问题。谷歌搜索这个问题后,我碰巧偶然发现了你的问题以及本书的O&#Reilly链接。这就是作者对这个问题所说的话:

  

&#34;我已经确认了这个问题; openweathermap已更改其查询   过程和书中的网址现在都被打破了。这是   彻底破坏了所有新读者的读者体验;我们需要   做一个更新,也许应该谈论第二版。&#34;

幸运的是,一位优秀的撒玛利亚人找到了解决这个问题的办法。但为了做到这一点,您必须首先创建一个免费的开放天气帐户。创建帐户后,您将获得API密钥。它会在你的个人资料中。

所以,现在这段代码:

search_template = "http://api.openweathermap.org/data/2.5/find?q={}&type=like&APPID=" + "YOUR_API_KEY"

变为:

{{1}}

这对我有用。我知道我已经晚了3个月了,可能到现在你已经得到了答案,但我认为这对那些遇到类似问题的人有用,他们的谷歌结果会把他们带到这个地方。 / p>