私はしばらくの間このstruglingと解決策を見つけることができませんでした。Python/Kivy - UrlRequestの結果
私は、Dusty Phillipsの「Creating Kivy in Apps」でPythonとKivyを勉強していました。 これは単純な天気アプリです。openweathermap.comからデータを取得しようとすると、UrlRequest関数が正常に動作しません。私はkivyやPythonなどでかなり新しくなっていますが、私が見るとおり、関数は2つの引数:requestとresult(urlから取得したリスト)を使って "found_location"メソッドを呼び出す必要があります。 ブラウザからURLにアクセスすると正しい結果が得られますが、Pythonに戻って 'results'はNONEになります。
ここでは、デバッグのためのいくつかのプリントとのコードです:
from kivy.app import App
#kivy.require("1.9.1")
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.network.urlrequest import UrlRequest
class AddLocationForm(BoxLayout):
search_input = ObjectProperty()
search_results = ObjectProperty()
def search_location(self):
search_template = "api.openweathermap.org/data/2.5/forecast/daily?APPID=ef4f6b76310abad083b96a45a6f547be&q=" + "{}"
search_url = search_template.format(self.search_input.text)
print search_url
request = UrlRequest(search_url, self.found_location)
print request
print "Result: ", request.result
def found_location(self, request, data):
print request
print 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']]
print cities
self.search_results.item_strings = cities
print "DONE"
class WeatherApp(App):
pass
if __name__ == '__main__':
WeatherApp().run()
そして、ここでコンソール:
[INFO ] [OSC ] using <multiprocessing> for socket
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
api.openweathermap.org/data/2.5/forecast/daily?APPID=ef4f6b76310abad083b96a45a6f547be&q=London
<UrlRequest(Thread-1, started daemon 139654193755904)>
Result: None
あなたが見ることができるように、それが正しいURLを渡していますし、ブラウザで私は右の結果を得ましたしかし、 "found_location"メソッドは決して呼び出されず、pythonではrequest.results = None
私は間違っていますか?
あなたは私の質問を理解することを願っています。助けてくれてありがとう、英語には申し訳ありません。
本当に答えはありますが、リクエストライブラリ(http://docs.python-requests.org/ja/master/)を使ってみましたか?これは、HTTPを扱うデファクトスタンダードなPythonの方法です.kivyは通常、外部ライブラリの使用に問題はありません。 – Synedraacus