Python / Kivy - UrlRequest结果

时间:2016-07-20 03:29:11

标签: python kivy

我现在已经有一段时间了,并且无法找到解决方案。

所以我正在用Dusty Phillips的“在Kivy创建应用程序”来学习Python和Kivy。 这是一个简单的天气应用程序,当我尝试从openweathermap.com获取数据时,UrlRequest函数不能正常工作。我对kivy和python很新,但是正如我所看到的,该函数必须使用两个参数调用“found_location”方法:request和result(从url获取的列表)。 如果我从我的浏览器访问网址,我得到了正确的结果,但回到python,'结果'没有。

这是带有一些打印用于调试的代码:

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

我做错了什么?

希望你们能理解我的问题。感谢您的帮助和对不起的英语。

1 个答案:

答案 0 :(得分:1)

这里的问题是您在成功下载之前打印结果。

还记得把“http://”放在链接字符串的前面。

请记住,url是异步加载的。 正如UrlRequest

中的文档所述
  

您可以使用UrlRequest在Web上发出异步请求,并在请求完成后获取结果。精神与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()