Python 3.x Kivy的依亲回收视图

Python 3.x Kivy的依亲回收视图,python-3.x,kivy,Python 3.x,Kivy,我的问题:我需要两个RecycleView,第二个(CultureSubView)取决于第一个(CultureView)中单击的内容。 只要单击CultureView中的某个内容,就可以调用CultureSubView的“更新”功能,但我不知道如何做到这一点 因为这必须在SelectableLabel中完成(这可能需要额外的SelectableLabel,因为CultureView不需要额外的功能) 或者在《文化评论》中用基维语的东西 我还试图在CultureView中找到任何可能触发“on_p

我的问题:我需要两个RecycleView,第二个(CultureSubView)取决于第一个(CultureView)中单击的内容。
只要单击CultureView中的某个内容,就可以调用CultureSubView的“更新”功能,但我不知道如何做到这一点

因为这必须在SelectableLabel中完成(这可能需要额外的SelectableLabel,因为CultureView不需要额外的功能)
或者在《文化评论》中用基维语的东西

我还试图在CultureView中找到任何可能触发“on_press”的内容,然后更新CultureSubView,但我也没有找到任何选项。这个想法在代码中被注释掉了

from kivy.app import App
from kivy.properties import StringProperty, BooleanProperty
from kivy.uix.behaviors import FocusBehavior
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.scrollview import ScrollView


Builder.load_string('''
<ScreenCulture>:
    BoxLayout:
        orientation: 'vertical'

        Label:
            pos_hint: {"x": .45, "top": 1}
            text: "Testosterone"
            size_hint: .1, .1

        GridLayout:
            id: culture_layout
            rows: 1
            cols: 3
            padding: dp(10)
            spacing: dp(10)
            orientation: 'horizontal'

            CultureView:
                id: culture_list_view
                # on_press? culture_sub_view.update()

            CultureSubView:
                id: culture_sub_view
                name_selected: 
                    "Planet" if not culture_list_view.name_selected else culture_list_view.name_selected

            CultureLabel:
                id: culture_text
                name_selected: "NVM" if not culture_sub_view.name_selected else culture_sub_view.name_selected
                text_selected: "This is totally a test text" if not culture_sub_view.text_selected else culture_sub_view.text_selected


<CultureView>:
    viewclass: 'SelectableLabel'
    name_selected: ''

    SelectableRecycleBoxLayout:
        orientation: 'vertical' 
        default_size: None, dp(32)
        default_size_hint: .6, None
        size_hint: 1, .9
        multiselect: False
        touch_multiselect: False


<CultureSubView>:
    viewclass: 'SelectableLabel'
    text_selected: ''
    name_selected: ''

    SelectableRecycleBoxLayout:
        orientation: 'vertical' 
        default_size: None, dp(32)
        default_size_hint: .6, None
        size_hint: 1, .9
        multiselect: False
        touch_multiselect: False


<CultureLabel>:
    size_hint_y: .85
    Label:
        halign: 'left'
        valign: 'middle'
        size_hint_y: None
        height: self.texture_size[1]
        text_size: self.width, None
        text: root.text_selected


<SelectableLabel>:
    # Draw a background to indicate selection
    canvas.before:
        Color:
            rgba: (.05, 0.5, .9, .8) if self.selected else (.5, .5, .5, 1)
        Rectangle:
            pos: self.pos
            size: self.size
''')


class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
                                 RecycleBoxLayout):
    pass


class SelectableLabel(RecycleDataViewBehavior, Label):
    ''' Add selection support to the Label '''
    index = None
    selected = BooleanProperty(False)
    selectable = BooleanProperty(True)

    def refresh_view_attrs(self, rv, index, data):
        ''' Catch and handle the view changes '''
        self.index = index
        return super(SelectableLabel, self).refresh_view_attrs(
            rv, index, data)

    def on_touch_down(self, touch):
        ''' Add selection on touch down '''
        if super(SelectableLabel, self).on_touch_down(touch):
            return True
        if self.collide_point(*touch.pos) and self.selectable:
            return self.parent.select_with_touch(self.index, touch)

    def apply_selection(self, rv, index, is_selected):
        ''' Respond to the selection of items in the view. '''
        self.selected = is_selected
        if is_selected:
            print("selection changed to {0}".format(rv.data[index]))
            rv.name_selected = rv.data[index]['text']
        else:
            print("selection removed for {0}".format(rv.data[index]))


class CultureView(RecycleView):
    def __init__(self, **kwargs):
        super(CultureView, self).__init__(**kwargs)

        self.data = [
            {"text": "Test1", "description": "testu"},
            {"text": "Test2", "description": "testo"}
        ]


class CultureSubView(RecycleView):
    planet_selected = StringProperty('')

    def __init__(self, **kwargs):
        super(CultureSubView, self).__init__(**kwargs)
        self.selection_data = {
            '': [],
            'Test1': [
                {"text": "test1.1", "description": "test1"},
                {"text": "test1.2", "description": "text1"}
            ],
            'Test2': [
                {"text": "test2.1", "description": "text2"},
                {"text": "test2.2", "description": "test2"}
            ]
        }
        self.data = self.selection_data[self.planet_selected]

    def update(self):
        print("Updating")
        self.data = self.selection_data[self.planet_selected]
        self.refresh_from_data()


class CultureLabel(ScrollView):
    text_selected = StringProperty('')
    name_selected = StringProperty('')


class ScreenCulture(Screen):
    pass


screen_manager = ScreenManager()
screen_manager.add_widget(ScreenCulture(name="screen_culture"))

class TestApp(App):
    def build(self):
        return screen_manager


if __name__ == "__main__":
    TestApp().run()
从kivy.app导入应用
从kivy.properties导入StringProperty、BooleanProperty
从kivy.uix.behaviors导入焦点行为
从kivy.lang导入生成器
从kivy.uix.label导入标签
从kivy.uix.recycleboxlayout导入recycleboxlayout
从kivy.uix.recycleview导入recycleview
从kivy.uix.recycleview.layout导入LayoutSelectionBehavior
从kivy.uix.recycleview.views导入RecycleDataViewBehavior
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.uix.scrollview导入scrollview
Builder.load_字符串(“”)
:
盒子布局:
方向:“垂直”
标签:
pos_提示:{“x”:.45,“top”:1}
正文:“睾丸激素”
大小提示:.1,.1
网格布局:
id:文化版面
行数:1
科尔斯:3
填充:dp(10)
间距:dp(10)
方向:“水平”
文化评论:
id:区域性列表视图
#按?区域性子视图。更新()
文化子视图:
id:区域性子视图
所选名称:
“行星”如果不是文化\u列表\u视图.名称\u选中其他文化\u列表\u视图.名称\u选中
文化标签:
id:文化文本
名称\已选择:“NVM”如果不是区域性\子\视图。名称\已选择其他区域性\子\视图。名称\已选择
text\u selected:“这完全是一个测试文本”,如果不是区域性\u sub\u view.text\u selected否则区域性\u sub\u view.text\u selected
:
viewclass:“SelectableLabel”
所选名称\u:“”
可选择的可循环利用布局:
方向:“垂直”
默认大小:无,dp(32)
默认大小提示:.6,无
尺寸提示:1.9
多重选择:错误
触摸多选:错误
:
viewclass:“SelectableLabel”
已选择文本“”“”
所选名称\u:“”
可选择的可循环利用布局:
方向:“垂直”
默认大小:无,dp(32)
默认大小提示:.6,无
尺寸提示:1.9
多重选择:错误
触摸多选:错误
:
尺寸提示:.85
标签:
哈利格:“左”
valign:“中间”
尺寸提示:无
高度:自身纹理大小[1]
文本大小:self.width,无
text:root.text\u已选定
:
#绘制背景以指示选择
在以下情况之前:
颜色:
rgba:(.05,0.5,9,8)如果自选,则为其他(.5,5,5,1)
矩形:
pos:self.pos
大小:self.size
''')
类SelectableRecycleBoxLayout(焦点行为、布局选择行为、,
可回收性布局):
通过
类SelectableLabel(RecycleDataViewBehavior,Label):
''将选择支持添加到标签''
索引=无
selected=布尔属性(False)
可选=布尔属性(真)
def刷新\视图\属性(自身、rv、索引、数据):
''捕获并处理视图更改''
self.index=索引
返回超级(SelectableLabel,self)。刷新\u视图\u属性(
rv、索引、数据)
def on_触控向下(自身,触控):
''在触地时添加选择''
如果是超级(SelectableLabel,self)。打开时触摸下(触摸):
返回真值
如果自碰撞点(*touch.pos)和自选择:
返回self.parent。使用触摸键选择(self.index,touch)
def应用选项(选择了自身、rv、索引):
''响应视图中的项目选择''
self.selected=是否选中
如果选择了以下选项:
打印(“选择更改为{0}”。格式(rv.data[index]))
rv.name_selected=rv.data[索引]['text']
其他:
打印(“删除了对{0}的选择”。格式(rv.data[index]))
类别CultureView(RecycleView):
定义初始(自我,**kwargs):
超级(CultureView,self)。\uuuuuu init\uuuuuuuuuuu(**kwargs)
self.data=[
{“text”:“Test1”,“description”:“testu”},
{“text”:“Test2”,“description”:“testo”}
]
类CultureSubView(RecycleView):
planet_selected=StringProperty(“”)
定义初始(自我,**kwargs):
超级(CultureSubView,self)。\uuuu init\uuuuuuu(**kwargs)
self.selection_数据={
'': [],
“测试1”:[
{“text”:“test1.1”,“description”:“test1”},
{“text”:“test1.2”,“description”:“text1”}
],
“测试2”:[
{“text”:“test2.1”,“description”:“text2”},
{“text”:“test2.2”,“description”:“test2”}
]
}
self.data=self.selection\u data[self.planet\u selected]
def更新(自我):
打印(“更新”)
self.data=self.selection\u data[self.planet\u selected]
self.refresh_from_data()
类CultureLabel(滚动视图):
text_selected=StringProperty(“”)
name_selected=StringProperty(“”)
类屏幕文化(屏幕):
通过
屏幕管理器=屏幕管理器()
屏幕\管理器。添加\小部件(屏幕文化(name=“屏幕\文化”))
类TestApp(应用程序):
def生成(自):
返回屏幕管理器
如果名称=“\uuuuu main\uuuuuuuu”:
TestApp().run()
一如既往,感谢您的帮助:)

因为该项目是Selec
Builder.load_string('''
<ScreenManagement>:
    screen_culture: screen_culture

    ScreenCulture:
        id: screen_culture
        name: 'screen_culture'

<ScreenCulture>:
    culture_sub_view: culture_sub_view

...

<SelectableLabel>:
    # Draw a background to indicate selection
    canvas.before:
        Color:
            rgba: (.05, 0.5, .9, .8) if self.selected else (.5, .5, .5, 1)
        Rectangle:
            pos: self.pos
            size: self.size
    on_touch_down:
        print('on_touch_down:')
        if self.selectable: \
            app.root.screen_culture.culture_sub_view.update(self.text)
class SelectableLabel(RecycleDataViewBehavior, Label):
    ...

    def on_touch_down(self, touch):
        ''' Add selection on touch down '''
        if super(SelectableLabel, self).on_touch_down(touch):
            return True
        if self.collide_point(*touch.pos) and self.selectable:
            return self.parent.select_with_touch(self.index, touch)
...

class ScreenCulture(Screen):
    culture_sub_view = ObjectProperty(None)


class ScreenManagement(ScreenManager):
    screen_culture = ObjectProperty(None)


class TestApp(App):
    def build(self):
        return ScreenManagement()
Builder.load_string('''
<ScreenManagement>:
    screen_culture: screen_culture

    ScreenCulture:
        id: screen_culture
        name: 'screen_culture'

<ScreenCulture>:
    culture_sub_view: culture_sub_view
class SelectableLabel(RecycleDataViewBehavior, Label):
    ...

    def on_touch_down(self, touch):
        ''' Add selection on touch down '''
        if super(SelectableLabel, self).on_touch_down(touch):
            return True
        if self.collide_point(*touch.pos) and self.selectable:
            App.get_running_app().root.screen_culture.culture_sub_view.update(self.text)
            return self.parent.select_with_touch(self.index, touch)
...

class ScreenCulture(Screen):
    culture_sub_view = ObjectProperty(None)


class ScreenManagement(ScreenManager):
    screen_culture = ObjectProperty(None)


class TestApp(App):
    def build(self):
        return ScreenManagement()
from kivy.app import App
from kivy.properties import StringProperty, BooleanProperty, ObjectProperty
from kivy.uix.behaviors import FocusBehavior
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.scrollview import ScrollView

Builder.load_string('''
<ScreenManagement>:
    screen_culture: screen_culture

    ScreenCulture:
        id: screen_culture
        name: 'screen_culture'

<ScreenCulture>:
    culture_sub_view: culture_sub_view

    BoxLayout:
        orientation: 'vertical'

        Label:
            pos_hint: {"x": .45, "top": 1}
            text: "Testosterone"
            size_hint: .1, .1

        GridLayout:
            id: culture_layout
            rows: 1
            cols: 3
            padding: dp(10)
            spacing: dp(10)
            orientation: 'horizontal'

            CultureView:
                id: culture_list_view

            CultureSubView:
                id: culture_sub_view
                name_selected: 
                    "Planet" if not culture_list_view.name_selected else culture_list_view.name_selected

            CultureLabel:
                id: culture_text
                name_selected: 
                    "NVM" if not culture_sub_view.name_selected else culture_sub_view.name_selected

                text_selected: 
                    "This is totally a test text" if not culture_sub_view.text_selected else culture_sub_view.text_selected


<CultureView>:
    viewclass: 'SelectableLabel'
    name_selected: ''

    SelectableRecycleBoxLayout:
        orientation: 'vertical' 
        default_size: None, dp(32)
        default_size_hint: .6, None
        size_hint: 1, .9
        multiselect: False
        touch_multiselect: False


<CultureSubView>:
    viewclass: 'SelectableLabel'
    text_selected: ''
    name_selected: ''

    SelectableRecycleBoxLayout:
        orientation: 'vertical' 
        default_size: None, dp(32)
        default_size_hint: .6, None
        size_hint: 1, .9
        multiselect: False
        touch_multiselect: False


<CultureLabel>:
    size_hint_y: .85
    Label:
        halign: 'left'
        valign: 'middle'
        size_hint_y: None
        height: self.texture_size[1]
        text_size: self.width, None
        text: root.text_selected


<SelectableLabel>:
    # Draw a background to indicate selection
    canvas.before:
        Color:
            rgba: (.05, 0.5, .9, .8) if self.selected else (.5, .5, .5, 1)
        Rectangle:
            pos: self.pos
            size: self.size
    on_touch_down:
        print('on_touch_down:')
        if self.selectable: \
            app.root.screen_culture.culture_sub_view.update(self.text)
''')


class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
                                 RecycleBoxLayout):
    pass


class SelectableLabel(RecycleDataViewBehavior, Label):
    ''' Add selection support to the Label '''
    index = None
    selected = BooleanProperty(False)
    selectable = BooleanProperty(True)

    def refresh_view_attrs(self, rv, index, data):
        ''' Catch and handle the view changes '''
        self.index = index
        return super(SelectableLabel, self).refresh_view_attrs(
            rv, index, data)

    def on_touch_down(self, touch):
        ''' Add selection on touch down '''
        if super(SelectableLabel, self).on_touch_down(touch):
            return True
        if self.collide_point(*touch.pos) and self.selectable:
            return self.parent.select_with_touch(self.index, touch)

    def apply_selection(self, rv, index, is_selected):
        ''' Respond to the selection of items in the view. '''
        self.selected = is_selected
        if is_selected:
            print("selection changed to {0}".format(rv.data[index]))
            rv.name_selected = rv.data[index]['text']
        else:
            print("selection removed for {0}".format(rv.data[index]))


class CultureView(RecycleView):
    def __init__(self, **kwargs):
        super(CultureView, self).__init__(**kwargs)

        self.data = [
            {"text": "Test1", "description": "testu"},
            {"text": "Test2", "description": "testo"}
        ]


class CultureSubView(RecycleView):
    planet_selected = StringProperty('')

    def __init__(self, **kwargs):
        super(CultureSubView, self).__init__(**kwargs)
        self.selection_data = {
            '': [],
            'Test1': [
                {"text": "test1.1", "description": "test1"},
                {"text": "test1.2", "description": "text1"}
            ],
            'Test2': [
                {"text": "test2.1", "description": "text2"},
                {"text": "test2.2", "description": "test2"}
            ]
        }
        self.data = self.selection_data[self.planet_selected]

    def update(self, name_selected):
        print("Updating")
        self.planet_selected = name_selected
        self.data = self.selection_data[self.planet_selected]
        self.refresh_from_data()


class CultureLabel(ScrollView):
    text_selected = StringProperty('')
    name_selected = StringProperty('')


class ScreenCulture(Screen):
    culture_sub_view = ObjectProperty(None)


class ScreenManagement(ScreenManager):
    screen_culture = ObjectProperty(None)


class TestApp(App):
    def build(self):
        return ScreenManagement()


if __name__ == "__main__":
    TestApp().run()
from kivy.app import App
from kivy.properties import StringProperty, BooleanProperty, ObjectProperty
from kivy.uix.behaviors import FocusBehavior
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.scrollview import ScrollView


Builder.load_string('''
<ScreenManagement>:
    screen_culture: screen_culture

    ScreenCulture:
        id: screen_culture
        name: 'screen_culture'

<ScreenCulture>:
    culture_sub_view: culture_sub_view

    BoxLayout:
        orientation: 'vertical'

        Label:
            pos_hint: {"x": .45, "top": 1}
            text: "Testosterone"
            size_hint: .1, .1

        GridLayout:
            id: culture_layout
            rows: 1
            cols: 3
            padding: dp(10)
            spacing: dp(10)
            orientation: 'horizontal'

            CultureView:
                id: culture_list_view

            CultureSubView:
                id: culture_sub_view
                name_selected: 
                    "Planet" if not culture_list_view.name_selected else culture_list_view.name_selected

            CultureLabel:
                id: culture_text
                name_selected: 
                    "NVM" if not culture_sub_view.name_selected else culture_sub_view.name_selected

                text_selected: 
                    "This is totally a test text" if not culture_sub_view.text_selected else culture_sub_view.text_selected


<CultureView>:
    viewclass: 'SelectableLabel'
    name_selected: ''

    SelectableRecycleBoxLayout:
        orientation: 'vertical' 
        default_size: None, dp(32)
        default_size_hint: .6, None
        size_hint: 1, .9
        multiselect: False
        touch_multiselect: False


<CultureSubView>:
    viewclass: 'SelectableLabel'
    text_selected: ''
    name_selected: ''

    SelectableRecycleBoxLayout:
        orientation: 'vertical' 
        default_size: None, dp(32)
        default_size_hint: .6, None
        size_hint: 1, .9
        multiselect: False
        touch_multiselect: False


<CultureLabel>:
    size_hint_y: .85
    Label:
        halign: 'left'
        valign: 'middle'
        size_hint_y: None
        height: self.texture_size[1]
        text_size: self.width, None
        text: root.text_selected


<SelectableLabel>:
    # Draw a background to indicate selection
    canvas.before:
        Color:
            rgba: (.05, 0.5, .9, .8) if self.selected else (.5, .5, .5, 1)
        Rectangle:
            pos: self.pos
            size: self.size
''')


class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
                                 RecycleBoxLayout):
    pass


class SelectableLabel(RecycleDataViewBehavior, Label):
    ''' Add selection support to the Label '''
    index = None
    selected = BooleanProperty(False)
    selectable = BooleanProperty(True)

    def refresh_view_attrs(self, rv, index, data):
        ''' Catch and handle the view changes '''
        self.index = index
        return super(SelectableLabel, self).refresh_view_attrs(
            rv, index, data)

    def on_touch_down(self, touch):
        ''' Add selection on touch down '''
        if super(SelectableLabel, self).on_touch_down(touch):
            return True
        if self.collide_point(*touch.pos) and self.selectable:
            App.get_running_app().root.screen_culture.culture_sub_view.update(self.text)
            return self.parent.select_with_touch(self.index, touch)

    def apply_selection(self, rv, index, is_selected):
        ''' Respond to the selection of items in the view. '''
        self.selected = is_selected
        if is_selected:
            print("selection changed to {0}".format(rv.data[index]))
            rv.name_selected = rv.data[index]['text']
        else:
            print("selection removed for {0}".format(rv.data[index]))


class CultureView(RecycleView):
    def __init__(self, **kwargs):
        super(CultureView, self).__init__(**kwargs)

        self.data = [
            {"text": "Test1", "description": "testu"},
            {"text": "Test2", "description": "testo"}
        ]


class CultureSubView(RecycleView):
    planet_selected = StringProperty('')

    def __init__(self, **kwargs):
        super(CultureSubView, self).__init__(**kwargs)
        self.selection_data = {
            '': [],
            'Test1': [
                {"text": "test1.1", "description": "test1"},
                {"text": "test1.2", "description": "text1"}
            ],
            'Test2': [
                {"text": "test2.1", "description": "text2"},
                {"text": "test2.2", "description": "test2"}
            ]
        }
        self.data = self.selection_data[self.planet_selected]

    def update(self, name_selected):
        print("Updating")
        self.planet_selected = name_selected
        self.data = self.selection_data[self.planet_selected]
        self.refresh_from_data()


class CultureLabel(ScrollView):
    text_selected = StringProperty('')
    name_selected = StringProperty('')


class ScreenCulture(Screen):
    culture_sub_view = ObjectProperty(None)


class ScreenManagement(ScreenManager):
    screen_culture = ObjectProperty(None)


class TestApp(App):
    def build(self):
        return ScreenManagement()


if __name__ == "__main__":
    TestApp().run()