我现在已经有一段时间了,并且无法找到解决方案。
所以我正在用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
我做错了什么?
希望你们能理解我的问题。感谢您的帮助和对不起的英语。
答案 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()