Связывание on_press с событиями в Kivy

У меня проблемы с системой Kivy, состоящей из половины чистого python и половины настройки языка kv. Все, что я пытаюсь сделать, это событие типа 'hello world' on_press, и я не могу заставить его работать.

from kivy.uix.modalview import ModalView
from kivy.uix.listview import ListView
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder
from kivy.app import App
import citylists
import cat_dict

from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.storage.jsonstore import JsonStore

store = JsonStore('data.json')

Builder.load_string("""
#:import ListItemButton kivy.uix.listview
#:import sla kivy.adapters.listadapter

<ListViewModal>:
    ListView:
        size_hint: .8, .8
        adapter:
            sla.ListAdapter(
            data=["{0}".format(i) for i in root.categories],
            on_press=root.callback(self),
            cls=ListItemButton.ListItemButton)

""")




class ListViewModal(ModalView):
    categories = sorted(cat_dict.SECTION_DICT)

    def __init__(self, **kwargs):
        super(ListViewModal, self).__init__(**kwargs)

    def callback(self, instance):
        print "HI" + str(instance)


class MainView(GridLayout):

    def __init__(self, **kwargs):
        kwargs['cols'] = 1
        super(MainView, self).__init__(**kwargs)

        listview_modal = ListViewModal()

        self.add_widget(listview_modal)

class MainScreen(Screen):
    pass


mainscreen=MainScreen()
mainlayout = MainView()
mainscreen.add_widget(mainlayout)

sm = ScreenManager()
sm.add_widget(mainscreen)

class CARApp(App):

    def build(self):
       return sm


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

cat_dict.py

SECTION_DICT = {
    "accounting+finance": "acc",
    "admin / office": "ofc",
    "arch / engineering": "egr",
    'art / media / design': 'med',
    'biotech / science': 'sci',
    'business / mgmt': 'bus',
    'customer management': 'csr',
    'education': 'edu',....

В конечном счете, я хочу связать событие on_press для каждой из динамически созданных кнопок, названных каждой клавишей в SECTION_DICT, а затем сохранить значение в JsonStore.

Проще говоря, все, что мне нужно сделать, это чтобы пользователь нажал кнопку, чтобы выбрать категорию Craigslist, которая вернет трехбуквенную аббревиатуру, которая будет использоваться позже в программе.


person Cameron Sima    schedule 16.02.2015    source источник
comment
А что именно не работает?   -  person Tim    schedule 16.02.2015
comment
при нажатии на любую из кнопок ничего не происходит   -  person Cameron Sima    schedule 16.02.2015


Ответы (1)


ListAdapter не имеет события on_press. Вам необходимо выполнить привязку к событию on_press каждой кнопки, что можно сделать с помощью преобразователь аргументов:

#:import ListItemButton kivy.uix.listview.ListItemButton
#:import ListAdapter kivy.adapters.listadapter.ListAdapter
<ListViewModal>:
    ListView:
        size_hint: .8, .8
        adapter:
            ListAdapter(
            data=["{0}".format(i) for i in root.categories],
            args_converter=lambda row_index, rec: \
            {'text': rec, 'on_press': root.callback, 'size_hint_y': None, 'height': 25},
            cls=ListItemButton)

Кроме того, позаботьтесь о передаче самих функций в качестве обратных вызовов, а не возвращаемого значения функций. Другими словами, используйте root.callback вместо root.callback(self).

person kitti    schedule 16.02.2015
comment
это работает, но я не совсем уверен, как передать значения словаря обратному вызову - person Cameron Sima; 09.03.2015