2016-07-20 2 views
4

Я борюсь с этим в течение некоторого времени и не могу найти решение.Результаты Python/Kivy - UrlRequest

Итак, я изучал Python и Kivy с «Создание приложений в Киви» от Dusty Phillips. Это простое приложение для погоды, и когда я пытаюсь получить данные с openweathermap.com, функция UrlRequest не работает должным образом. Я довольно новичок в kivy и python, но, как я вижу, функция должна вызывать метод «found_location» с двумя аргументами: request и result (список, полученный из URL-адреса). Если я получаю доступ к url ​​из своего браузера, я получаю правильные результаты, но вернусь к python, «результаты» появились как 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/en/master/)? Это де-факто стандартный способ Python для работы с HTTP, и у kivy обычно нет проблем с использованием внешних библиотек. – Synedraacus

ответ

1

Проблема заключается в том, что вы печатаете результат до его успешного скачивания.

Также не забудьте поставить «http: //» infront строки ссылки.

Помните, что URL загружен асинхронно. Как говорится в документации на UrlRequest

Вы можете использовать URLRequest, чтобы сделать асинхронные запросы в Интернете и получить результат, когда запрос завершен. Дух тот же, что и объект XHR в Javascript.

Вот почему вы хотите использовать on_success параметр в URLRequest

Я приведу пример для вас.

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

Смежные вопросы