2015-03-09 4 views
1

У меня есть указатель заголовков со значениями, представляющими аббревиатуры 3 буквы.Как передать значения словаря функции обратного вызова?

У меня есть список кнопок с названиями, и мне нужно on_click, чтобы вернуть аббревиатуру.

То, что у меня есть, теперь возвращает названия (текст кнопки), но я не могу понять, как пройти по всей словарной статье или просто по значению.

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.ListItemButton 
#:import ListAdapter kivy.adapters.listadapter.ListAdapter 


<ListViewModal>: 
    ListView: 
     size_hint: .8, .8 
     adapter: 
      ListAdapter(
      data=[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) 

""") 




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

EECTION_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',.... 

ответ

2

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

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

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

    def callback(self, instance): 
     print "HI" + str(instance) 
     # Print abbreviation from dictionary lookup 
     print ListViewModal.section_dict[instance.text] 

Какие выходы:

 
HI<ListItemButton text=accounting+finance> 
acc 

Но один способ передать дополнительные аргументы обратного вызова будет изменить

'on_press': root.callback 
# to 
'on_press': lambda inst: root.callback(inst, 'some arg') 

Тогда изменения

def callback(self, instance): 
# to 
def callback(self, instance, arg): 

The docs также можно использовать, используя itertools.partial, в дополнение к использованию лямбда-функции.

Смежные вопросы