2017-04-18 22 views
0

試圖通過多灰塵的菲利普斯「在Kivy創建應用程序」一書的工作,但有一個部分,這是非常模糊的,並導致不正常運行的代碼。我相信我知道這個問題,但不知道如何解決它。的Python Kivy:on_press不使用根

這裏是我的.kv文件:

WeatherRoot: 

<WeatherRoot>: 
    AddLocationForm: 
     orientation: 'vertical' 
     search_input: search_box 
     search_results: search_results_list 

     BoxLayout: 
      height: '48dp' 
      size_hint_y:None 
      TextInput: 
       multiline:False 
       write_tab:False 
       id: search_box 
       size_hint_x:50 
       on_text_validate: root.search_location() 
      Button: 
       text:'Search' 
       size_hint_x:25 
       on_press: root.search_location() 
      Button: 
       text:'Current Location' 
       size_hint_x:25 

     ListView: 
      id: search_results_list 
      adapter: 
       ListAdapter(data=[],cls=ListItemButton) 

因爲on_press和on_text_validate去根,我的根(在這種情況下,WeatherRoot)不包含SEARCH_LOCATION()函數,這個崩潰時,我嘗試做一個搜索。

這裏是我的Python代碼:

from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.properties import ObjectProperty from kivy.network.urlrequest import UrlRequest 

owm_key = 'xxxxxxxxxxxxx' 

class WeatherRoot(BoxLayout): 
    pass 

class AddLocationForm(BoxLayout): 
    search_input = ObjectProperty() 

    def search_location(self): 
    search_template = 'http://api.openweathermap.org/data/2.5/find?q={}&type=like&APPID='+ owm_key 
    search_url = search_template.format(self.search_input.text) 
    request = UrlRequest(search_url,self.found_location) 

    def found_location(self,request,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']] 

    self.search_results.item_strings = cities 
    self.search_results.adapter.data.clear() 
    self.search_results.adapter.data.extend(cities) 
    self.search_results.__trigger__reset_populate() 

class WeatherApp(App): 
    pass 

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

因爲我WeatherRoot類是空的,使用

root.search_location() 

什麼都不做。有沒有什麼辦法可以不引用根,而是「一個層次」?另一方面,有沒有其他人通過這本書的方式,你是如何處理這部分?

謝謝! 戴夫

回答

0

這結束了對我的工作,只是要帶來的「上一級」窗口小部件的ID,並引用它:

WeatherRoot: 

<WeatherRoot>: 
    AddLocationForm: 
     id: addlocationform 
     orientation: 'vertical' 
     search_input: search_box 
     search_results: search_results_list 

     BoxLayout: 
      height: '48dp' 
      size_hint_y:None 
      TextInput: 
       multiline:False 
       write_tab:False 
       id: search_box 
       size_hint_x:50 
       on_text_validate: addlocationform.search_location() 
      Button: 
       text:'Search' 
       size_hint_x:25 
       on_press: addlocationform.search_location() 
      Button: 
       text:'Current Location' 
       size_hint_x:25 

     ListView: 
      id: search_results_list 
      adapter: 
       ListAdapter(data=[],cls=ListItemButton) 
0

你可以給它一個id訪問AddLocationForm
嘗試這樣的:

AddLocationForm: 
    id: form 

然後你就可以IKE訪問此:

BoxLayout: 
     height: '48dp' 
     size_hint_y:None 
     TextInput: 
      multiline:False 
      write_tab:False 
      id: search_box 
      size_hint_x:50 
      on_text_validate: form.search_location() 
     Button: 
      text:'Search' 
      size_hint_x:25 
      on_press: form.search_location()