绑定 on_press 与 Kivy 中的事件
Binding on_press with events in Kivy
我很难使用 Kivy 的一半 pure-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 类别,这将 return 3 个字母的缩写,稍后将在程序中使用。
A ListAdapter
没有 on_press
事件。您需要绑定到每个按钮的 on_press
事件,这可以使用 args converter:
来完成
#: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)
此外,注意将函数本身作为回调传递,而不是函数的 return 值。换句话说,使用 root.callback
而不是 root.callback(self)
.
我很难使用 Kivy 的一半 pure-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 类别,这将 return 3 个字母的缩写,稍后将在程序中使用。
A ListAdapter
没有 on_press
事件。您需要绑定到每个按钮的 on_press
事件,这可以使用 args converter:
#: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)
此外,注意将函数本身作为回调传递,而不是函数的 return 值。换句话说,使用 root.callback
而不是 root.callback(self)
.