2017-01-13 93 views
0

我學習製作android應用的kivy。所以我讀了'在Kivy中創建應用程序'一書。 我按照說明操作時遇到了錯誤。python和json,Error - TypeError:字符串索引必須是整數

我的python代碼如下。

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import ObjectProperty 
from kivy.network.urlrequest import UrlRequest 
import json 
import urllib 
import urllib.request 
import codecs 

class AddLocationForm(BoxLayout): 

    search_input = ObjectProperty() 
    search_results = ObjectProperty() 


    def search_location(self): 
     search_template = 'http://api.openweathermap.org/data/2.5/' + 'weather?q={}&&APPID=d9733213314ecfdbd08f9753d38444bf' 
     search_url = search_template.format(self.search_input.text) 
     u = urllib.request.urlopen(search_url) 
     data = u.read().decode('utf-8') 
     print(type(data)) 
     # request = UrlRequest(search_url, self.found_location) 
     self.found_location(data) 

    def found_location(self, data): 
     # reader = codecs.getreader("utf-8") 
     data2 = json.loads(data) 
     # data2 = reader(data).json() 
     print(data2) 
     for i in data2: 
      cities = ['{} ({})'.format(i['name'],i['sys']['country'])] 
      self.search_results.item_strings = cities 

class WeatherApp(App): 
    pass 

if __name__ == '__main__': 
    WeatherApp().run() 

我的錯誤是

Traceback (most recent call last): 
    File "E:\Weather\main.py", line 52, in <module> 
    WeatherApp().run() 
    File "C:\Python34\lib\site-packages\kivy\app.py", line 828, in run 
runTouchApp() 
    File "C:\Python34\lib\site-packages\kivy\base.py", line 487, in runTouchApp 
    EventLoop.window.mainloop() 
    File "C:\Python34\lib\site-packages\kivy\core\window\window_sdl2.py", line 619, in mainloop 
    self._mainloop() 
    File "C:\Python34\lib\site-packages\kivy\core\window\window_sdl2.py", line 362, in _mainloop 
    EventLoop.idle() 
    File "C:\Python34\lib\site-packages\kivy\base.py", line 330, in idle 
    self.dispatch_input() 
    File "C:\Python34\lib\site-packages\kivy\base.py", line 315, in dispatch_input 
    post_dispatch_input(*pop(0)) 
    File "C:\Python34\lib\site-packages\kivy\base.py", line 221, in post_dispatch_input 
    listener.dispatch('on_motion', etype, me) 
    File "kivy\_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:7699) 
    File "C:\Python34\lib\site-packages\kivy\core\window\__init__.py", line 1030, in on_motion 
    self.dispatch('on_touch_down', me) 
    File "kivy\_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:7699) 
    File "C:\Python34\lib\site-packages\kivy\core\window\__init__.py", line 1046, in on_touch_down 
    if w.dispatch('on_touch_down', touch): 
    File "kivy\_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:7699) 
    File "C:\Python34\lib\site-packages\kivy\uix\widget.py", line 432, in on_touch_down 
    if child.dispatch('on_touch_down', touch): 
    File "kivy\_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:7699) 
    File "C:\Python34\lib\site-packages\kivy\uix\widget.py", line 432, in on_touch_down 
    if child.dispatch('on_touch_down', touch): 
    File "kivy\_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:7699) 
    File "C:\Python34\lib\site-packages\kivy\uix\behaviors\button.py", line 110, in on_touch_down 
    self.dispatch('on_press') 
    File "kivy\_event.pyx", line 714, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:7654) 
    File "kivy\_event.pyx", line 1224, in kivy._event.EventObservers.dispatch (kivy\_event.c:13497) 
    File "kivy\_event.pyx", line 1108, in kivy._event.EventObservers._dispatch (kivy\_event.c:12329) 
    File "C:\Python34\lib\site-packages\kivy\lang.py", line 1557, in  custom_callback 
    exec(__kvlang__.co_value, idmap) 
    File "E:\Weather\weather.kv", line 89, in <module> 
on_press: root.search_location() 
    File "E:\Weather\main.py", line 35, in search_location 
self.found_location(data) 
    File "E:\Weather\main.py", line 43, in found_location 
    cities = ['{} ({})'.format(i['name'],i['sys']['country'])] 
TypeError: string indices must be integers 

和JSON內容

{ 
"coord":{"lon":-123.12,"lat":49.25}, 
"weather":[{"id":800,"main":"Clear","description":"clearsky","icon":"02n"}], 
"base":"stations", 
"main":{"temp":265.29,"pressure":1022,"humidity":73,"temp_min":263.15,"temp_max":267.15 }, 
"visibility":48279, 
"wind":{"speed":2.6,"deg":80},"clouds":{"all":5},"dt":1484230500, 
"sys":{"type":1,"id":3359,"message":0.0149,"country":"CA","sunrise":1484237006,"sunset":1484267964}, 
"id":6173331,"name":"Vancouver","cod":200} 

我該如何解決呢?

+0

'data2'是一個'dict'持有1條記錄。 '對於data2中的我'迭代它的鍵,它們是字符串。 – tdelaney

+0

'print(i)',你會看到發生了什麼。 – tdelaney

回答

0

你正在做一個字符串的指數之,不是說你以爲你是字典,這裏

for i in data2: 
    cities = ['{} ({})'.format(i['name'],i['sys']['country'])] 
    self.search_results.item_strings = cities 

正如在評論中提到tdelaney,你是通過迭代字典,然後試圖採取它內部的字符串的指示。

另請參閱this post

1

你只得到1個記錄作爲字典,所以你不需要循環。

def found_location(self, data): 
    # reader = codecs.getreader("utf-8") 
    data2 = json.loads(data) 
    # data2 = reader(data).json() 
    print(data2) 
    cities = ['{} ({})'.format(data2['name'],data2['sys']['country'])] 
    self.search_results.item_strings = cities 
+0

我得到了anthoer錯誤:TypeError:列表索引必須是整數,而不是str – victory

+0

對不起,那工作 – victory

+0

好!我對這個問題感到困惑。 – tdelaney

相關問題