Изменить переменную с помощью выбранного элемента в Kivy - PullRequest
0 голосов
/ 16 мая 2018

Итак, я изучаю Kivy, но я застрял с ListView или, поскольку ListView кажется устаревшим, RecycleView.

Моя проблема в том, что я хочу метку с species_text в качестве идентификатора для изменения в зависимости от элемента, на который я нажимаю, после того как метка будет видна.

Документация помогла мне сделать SelectableLabel и возможность щелкнуть / раскрасить его, но я не знаю, как изменить текст species_text через список данных RecycleViewили как сохранить список данных в классе ScreenTest.

Вот мой код:

from kivy.app import App
from kivy.uix.button import Label, Button
from kivy.lang import Builder
from kivy.properties import BooleanProperty
from kivy.uix.behaviors import FocusBehavior
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.screenmanager import ScreenManager, Screen

Builder.load_string("""

<ScreenTest>:
    Label:
        pos_hint: {"x": .45, "top": 1}
        text: "Headline"
        size_hint: .1, .1


    BoxLayout:
        pos_hint: {"x": 0.02, "top": .8}

        RecycleView:
            id: species_list_view
            data: [{'name': "Species1", "text": "S1"}, {'name': "Species2", "text": "S2"}]
            viewclass: 'SelectableLabel'

            SelectableRecycleBoxLayout:
                default_size: None, dp(56)
                default_size_hint: 1, None
                size_hint_y: None
                orientation: 'vertical'
                multiselect: False
                touch_multiselect: False

        Label:
            id: species_text
            text: "Speciestext"

    BoxLayout:
        size_hint_y: None
        height: 30
        spacing: 10

        canvas:
            Color:
                rgba: .5, .2, .1, 1
            Rectangle: 
                pos: self.pos
                size: self.size

        Button:
            text: "Go Back"

        Button:
            text: "Next"


<SelectableLabel>:
    # Draw a background to indicate selection
    canvas.before:
        Color:
            rgba: (.0, 0.9, .1, .3) if self.selected else (0, 0, 0, 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]))
        else:
            print("selection removed for {0}".format(rv.data[index]))


class ScreenTest(Screen):
    pass


screen_manager = ScreenManager()
screen_manager.add_widget(ScreenTest(name="screen_test"))


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


test_app = TestApp()
test_app.run()

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Метод apply_selection() имеет RecycleView аргументы, учитывая, что мы можем создать свойство с выделенным текстом, а затем сделать привязку с текстом Label:

    ...
    RecycleView:
        id: species_list_view
        data: [{'name': "Species1", "text": "S1"}, {'name': "Species2", "text": "S2"}]
        viewclass: 'SelectableLabel'
        text_selected: "" # create property

        SelectableRecycleBoxLayout:
            ...

    Label:
        id: species_text
        text: "Speciestext" if not species_list_view.text_selected else species_list_view.text_selected # apply binding
    ...

 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.text_selected  = rv.data[index]['text'] # set text
    else:
        print("selection removed for {0}".format(rv.data[index]))
0 голосов
/ 16 мая 2018

Когда вы выбираете SelectableLabel, вы должны найти ярлык «видов_текста» и изменить его текст.Один из способов сделать это - использовать метод apply_selection.

    if is_selected:
        for screen in App.get_running_app().root.screens:
            if screen.name == "screen_test":
                screen.ids.species_text.text = rv.data[index]["name"]

PS В коде kv есть опечатка: атрибут "touch_multiselect" записывается как "touc_multiselect"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...