Seite 1 von 1

Kivy und Root Widgets

Verfasst: Dienstag 17. Juni 2014, 11:04
von audacity363
Guten Tag,
ich bin's mal wieder mit Kivy. Habe nun folgendes Problem: Laut Buch soll ich nun ein Customwidget unter dem Root Layout erstellen.
Erstmal hier der Code:
KV File:

Code: Alles auswählen

#: import ListItemButton kivy.uix.listview.ListItemButton
#: import ListAdapter kivy.adapters.listadapter.ListAdapter

WeatherRoot:
<WeatherRoot>:
    AddLocationForm:
        orientation: "vertical"
        search_input: search_box
        search_results: search_result_list
        BoxLayout:
            height: "40dp"
            size_hint_y: None
            TextInput:
                id: search_box
                size_hint_x: 50
            Button:
                text: "Search"
                size_hint_x: 25
                on_press: root.search_location()
            Button:
                text: "Current Location"
                size_hint_x: 25
            
        ListView:
            id: search_result_list
            adapter:
                ListAdapter(data=[], cls=ListItemButton)         
Python Code:

Code: Alles auswählen

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

class WeatherRoot(BoxLayout):
    pass
    
class AddLocationForm(BoxLayout):
    search_input = ObjectProperty()
    search_results = ObjectProperty()
    def search_location(self):
        search_template = "http://api.openweathermap.org/data/2.5/" + "find?q={}&type=like"
        search_url = search_template.format(self.search_input.text)
        request = UrlRequest(search_url, self.found_location)

    def found_location(self, request, data):
        cities = ["{}({})".format(d['name'], d['sys']['country'])
                for d in data['list']]
        if not cities:
            self.search_results.item_strings = ["Nichts gefunden"]
        else:
            self.search_results.item_strings = cities
        self.search_results.adapter.data.clear()
        self.search_results.adapter.data.extened(cities)
        self.search_results._trigger_reset_populate()

class WeatherApp(App):
    pass

if __name__ == '__main__':
    WeatherApp().run()
Jetzt funktioniert der ButtonListner auf den search_location Button natürlich nicht mehr, weil er natürlich auf die Root Klasse zeigt. Aber auch wenn ich die Zeile auf AddLocationForm.search_location() ändere funktioniert es nicht.

Re: Kivy und Root Widgets

Verfasst: Sonntag 21. September 2014, 20:33
von barrio
Das Beispiel funktioniert, hab es selber grade gemacht, sind also irgendwo Tippfehler drin, z. B. seh ich auf Anhieb, dass Deine Einrückungen in der found_location methode nach else nicht alle stimmen. Mach also mal copy&paste (sofern Du ein ebook hast) und schau, ob es dann läuft. Wenn nicht nochmal genau mit analogem Buch vergleichen... :-) Wenn Du Python 3 benutzt denk an den dirty hack für UrlRequest zum JSON parsen: data = json.loads(data.decode()) if not isinstance(data, dict) else data am Anfang von found_location.

Good luck
barrio