fbpx

Не работает выбор в RecycleView. Работает, только когда нажимаешь на зону простого виджета (Label)

293 просмотра
0
0 Комментариев

Механизм выбора пункта в RecycleView работает, только когда нажимаешь на зону простого виджета (Lable), и не реагирует, когда жмешь на зону с составным виджетом. Как это исправить, в хорошем kivy-стиле?

#-*-coding:utf-8-*-
from __future__ import print_function
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.properties import NumericProperty, StringProperty, ObjectProperty, ListProperty, BooleanProperty
from kivy.uix.behaviors import FocusBehavior
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
 
kv = '''
#:set LnW 1.5
 
<Item>:
    width:2000
    canvas.before:
        Color:
            rgba:(0.2,0.7,0.95,1) if self.selec else (0.3,0.3,0.5,1)
        Rectangle:
            pos:self.pos
            size:self.size
        Color:
            rgba:(0,0.4,0.95,1)if self.selec else (0.3,0.4,0.45,1)
        Line:
            points:[self.pos[0]+LnW,self.pos[1]+LnW,self.width+self.pos[0]-LnW,self.pos[1]+LnW,self.width+self.pos[0]-LnW,self.height+self.pos[1]-LnW,self.pos[0]+LnW,self.height+self.pos[1]-LnW]
            width:LnW
            close:True
    Label:
        text: 'OkOKOFLKOK'
 
    RecycleView:
        size_hint_x:0.8
        scroll_type:['bars','content']
        scroll_wheel_distance: dp(114)
        bar_width: dp(10)
        key_selection:"True"
        viewclass:'Label'
        data:[{'text':'dhbjhvsd'},{'text':'dUIjfhih1'},{'text':'Kog'}]
        RecycleBoxLayout:
            key_selection:"True"
            default_size:None,dp(60)
            size_hint:None,1
            height:self.minimum_height
            width:2000
            orientation: 'horizontal'
            padding:dp(2)
            spacing: dp(2)
 
<MainBox>:
    id:rv
    key_selection:"True"
    viewclass: 'Item'
    SelRecyc:
        id:rbx
        key_selection:"True"
        default_size:None,dp(60)
        default_size_hint: 0.9,None
        size_hint_y: None
        height:(dp(60)+self.spacing)*len(rv.data)
        orientation: 'vertical'
        spacing: dp(2)
'''
 
 
class SelRecyc(FocusBehavior,LayoutSelectionBehavior, RecycleBoxLayout):
  pass
 
class Item(RecycleDataViewBehavior,BoxLayout):
 index = None
 previdx=None
 selec = BooleanProperty(False)
 
 def refresh_view_attrs(self, rv, index, data):
 
    self.index = index
    print(index)
 
    return super(Item, self).refresh_view_attrs(rv, index, data)
 
 def on_touch_down(self, touch):
    print('h---------h', self.index)
    if super(Item, self).on_touch_down(touch):
        return True
    if self.collide_point(*touch.pos):
        print('KooK')
        return self.parent.select_with_touch(self.index, touch)
 
 def apply_selection(self, rv, index, is_selected):
    self.selec = is_selected
    if self.selec:
        print('Sel----', index)
    else:
        self.previdx = index
        print('Desel--', self.previdx)
 
 
 
class MainBox(RecycleView):
 def __init__(self, **kwargs):
    super(MainBox, self).__init__(**kwargs)
    self.data = [{'text': str(x)} for x in range(40)]
 
class ERApp(App):
 def build(self):
    return MainBox()
 
 
Builder.load_string(kv)
 
appl = ERApp()
appl.run()


Добавить комментарий

0 Answers

Python Опубликовано 16.07.2019
Напишите свой ответ на данный вопрос.
Scroll Up