如何将字典值传递给回调函数?
How to pass dictionary values to callback function?
我有一个标题字典,其值代表 3 个字母的缩写。
我有一个带有标题的按钮列表,我需要 on_click 到 return 的缩写。
我现在所拥有的 return 是标题(按钮文本),但我不知道如何传递整个字典条目,或者只是传递值。
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',....
看起来您实际上不必向回调传递任何内容。看起来以下内容符合您的要求:
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 除了使用 lambda 函数外,还列出了使用 itertools.partial
作为选项。
EECTION_DICT = {
"accounting+finance": "acc",
"admin / office": "ofc",
"arch / engineering": "egr",
'art / media / design': 'med',
'biotech / science': 'sci',
'business / mgmt': 'bus'}
def foo(args):
for item in args.items():
print(item)
foo(EECTION_DICT)
或
def foo(**args):
for key,item in args.items():
print(key, item)
foo(**EECTION_DICT)
我有一个标题字典,其值代表 3 个字母的缩写。
我有一个带有标题的按钮列表,我需要 on_click 到 return 的缩写。
我现在所拥有的 return 是标题(按钮文本),但我不知道如何传递整个字典条目,或者只是传递值。
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',....
看起来您实际上不必向回调传递任何内容。看起来以下内容符合您的要求:
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 除了使用 lambda 函数外,还列出了使用 itertools.partial
作为选项。
EECTION_DICT = {
"accounting+finance": "acc",
"admin / office": "ofc",
"arch / engineering": "egr",
'art / media / design': 'med',
'biotech / science': 'sci',
'business / mgmt': 'bus'}
def foo(args):
for item in args.items():
print(item)
foo(EECTION_DICT)
或
def foo(**args):
for key,item in args.items():
print(key, item)
foo(**EECTION_DICT)