Nov-23-2018, 07:19 AM
hi! refined the code a little, although output is the same. Tried to make the second RV a dynamic class in a widget and then clear the widget and update it everytime a button is clicked on the left. Kindly advice.
import openpyxl from kivy.app import App from kivy.lang import Builder from kivy.uix.recycleview import RecycleView from kivy.uix.recycleview.views import RecycleDataViewBehavior from kivy.uix.label import Label from kivy.properties import BooleanProperty from kivy.uix.recycleboxlayout import RecycleBoxLayout from kivy.uix.behaviors import FocusBehavior from kivy.uix.recycleview.layout import LayoutSelectionBehavior from kivy.uix.boxlayout import BoxLayout from kivy.uix.widget import Widget from kivy.factory import Factory Builder.load_string(''' <SelectableLabel>: # Draw a background to indicate selection canvas.before: Color: rgba: (.0, 0.5, .1, .3) if self.selected else (0, 0, 0, 1) Rectangle: pos: self.pos size: self.size <RootWid>: orientation: 'vertical' ActionBar: pos_hint: {'top':1} ActionView: use_separator: True ActionPrevious: title: 'StuCheck' with_previous: False ActionOverflow: ActionButton: text: 'Populate list' on_press: QuestionsList().populate() ActionButton: text: 'Sort list' on_press: root.sort() ActionButton: text: 'Clear list' on_press: root.clear() ActionGroup: text: 'More' ActionButton: text: 'Insert new item' on_press: root.insert(new_item_input.text) ActionButton: text: 'Update first item' on_press: root.update(update_item_input.text) ActionButton: text: 'Remove first item' on_press: root.remove() BoxLayout: orientation: 'horizontal' RV: Middle_c: Questions_list: <Middle_c>: orientation: 'horizontal' <Questions_list@RecycleView>: data: [{'text':'123'}] viewclass: 'SelectableLabel' SelectableRecycleBoxLayout: default_size: None, dp(56) default_size_hint: 1, None size_hint_y: None height: self.minimum_height orientation: 'vertical' multiselect: False touch_multiselect: True <RV>: data: self.data viewclass: 'SelectableLabel' SelectableRecycleBoxLayout: default_size: None, dp(56) default_size_hint: 1, None size_hint_y: None height: self.minimum_height orientation: 'vertical' multiselect: False touch_multiselect: True ''') class RootWid(BoxLayout): pass class Middle_c(BoxLayout): uq = Factory.Questions_list() def update_questions(self, subject): uq = Factory.Questions_list() self.clear_widgets() uq.data = self.populate(subject) def populate(self, subject): wb = openpyxl.load_workbook('sWL.xlsx') sheet = wb[subject] self.data = [] for row in range (2, sheet.max_row+1): question = sheet.cell(row=row, column=1).value self.data.append({'text' : question}) return self.data class RV(RecycleView): def __init__(self, **kwargs): super(RV, self).__init__(**kwargs) subjects = [some list here] self.data = [] for subject in subjects: self.data.append({'text':subject}) class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior, RecycleBoxLayout): ''' Adds selection and focus behaviour to the view. ''' 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): Middle_c().update_questions(RV().data[self.index]['text']) return True if self.collide_point(*touch.pos) and self.selectable: Middle_c().update_questions(RV().data[self.index]['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: Middle_c().update_questions(RV().data[self.index]['text']) print("selection changed to {0}".format(rv.data[index])) else: print("selection removed for {0}".format(rv.data[index])) class TestApp(App): def build(self): return RootWid() if __name__ == '__main__': TestApp().run()