与Kivy事件捆绑在一起

2024-04-27 18:35:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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()

猫_字典.py在

^{pr2}$

最后,我想为每个动态创建的按钮绑定on_press事件,每个按钮的标题为SECTION_DICT,然后将值保存在JsonStore中。在

简单地说,我需要做的就是让用户按一个按钮来选择一个craigslist类别,这将返回3个字母的缩写,以便稍后在程序中使用。在


Tags: fromimportselfinitondefkwargsclass
1条回答
网友
1楼 · 发布于 2024-04-27 18:35:16

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)

另外,注意将函数本身作为回调传递,而不是函数的返回值。换句话说,使用root.callback代替root.callback(self)。在

相关问题 更多 >