Python / Kivy – UrlRequest结果

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

所以我正在用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,并且在浏览器中我得到了正确的结果,但是“find_location”方法永远不会被调用,而在python中,request.results = None

我究竟做错了什么?

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

最佳答案 这里的问题是您在成功下载之前打印结果.

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

请记住,url是异步加载的.
正如它在UrlRequest的文档中所述

You can use the UrlRequest to make asynchronous requests on the web and get the result when the request is completed. The spirit is the same as the XHR object in Javascript.

这就是你想在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()
点赞