2016-07-20 51 views
4

私はしばらくの間この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

私は間違っていますか?

あなたは私の質問を理解することを願っています。助けてくれてありがとう、英語には申し訳ありません。

+0

本当に答えはありますが、リクエストライブラリ(http://docs.python-requests.org/ja/master/)を使ってみましたか?これは、HTTPを扱うデファクトスタンダードなPythonの方法です.kivyは通常、外部ライブラリの使用に問題はありません。 – Synedraacus

答えて

1

ここでの問題は、結果が正常にダウンロードされる前に印刷することです。

また、リンク文字列の先頭に「http://」を付けてください。

URLは非同期的に読み込まれることに注意してください。それはUrlRequest

上のドキュメントに言うように あなたは、ウェブ上の非同期要求を作成し、要求が完了したときに結果を得るためにするURLRequestを使用することができます。精神はJavascriptのXHRオブジェクトと同じです。

ザッツは、URLRequest

でON_SUCCESSパラメータを使用する理由私はあなたのための一例を行います。

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 MyWidget(BoxLayout): 
    def __init__(self,**kwargs): 
     super(MyWidget,self).__init__(**kwargs) 
     search_url = "http://api.openweathermap.org/data/2.5/forecast/daily?APPID=ef4f6b76310abad083b96a45a6f547be&q=new%20york" 
     print search_url 
     self.request = UrlRequest(search_url, self.res) 
     print self.request 
     print "Result: before success", self.request.result,"\n" 


    def res(self,*args): 
     print "Result: after success", self.request.result 


class MyApp(App): 
    def build(self): 
     return MyWidget() 


if __name__ == '__main__': 
    MyApp().run() 
+0

私はそれを得ました。そのとおり。しかし、とにかく、urlrequestはfound_locationメソッドを呼び出すことはありません。何故ですか? Tks – MarceloBoy

+0

@MarceloBoy基本的に私のres関数です。最後の引数として* argsを入れてみてください。 – EL3PHANTEN

+0

ねえ、助けてくれてありがとう。私は本当にnoobの間違いを得た。 URLには "http://"がありませんでしたが、これは本の方法です。 とにかく、ありがとうございます。 – MarceloBoy