使用RecycleView滚动时,如何保持我的Kivy ToggleButton状态?

2024-05-05 12:59:44 发布

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

如果我创建了一个ToggleButtons列表并将它们放在一个RecycleView中,那么切换一个ToggleButton会导致视图外的ToggleButtons通过在视图内外滚动来更改状态。我是否错误地实现了我的RecycleView

如果我使用按钮而不是ToggleButtons,我的RecycleView工作正常

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.properties import StringProperty,NumericProperty
Builder.load_string("""
<MyLayout>:
    orientation: 'vertical'
    spacing: 10
    RV:
<RV>:
    viewclass: 'RecycleViewRow'
    RecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'

<RecycleViewRow>:
    orientation: 'horizontal'
    ToggleButton:
        text: root.text
""")

class MyLayout(BoxLayout):
    pass

class RecycleViewRow(BoxLayout):
    text = StringProperty()

class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = [{'text': "Button " + str(x+1)} for x in range(30)]

class MainscreenApp(App):
    def build(self):
        return MyLayout()

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

Tags: textfromimportselfnonesizeclassrv
1条回答
网友
1楼 · 发布于 2024-05-05 12:59:44

下面是对代码的修改,它执行self.data更新:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.recycleview import RecycleView
from kivy.properties import StringProperty

Builder.load_string("""
<MyLayout>:
    orientation: 'vertical'
    spacing: 10
    RV:
        id: rv
<RV>:
    viewclass: 'RecycleViewRow'
    RecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'

<RecycleViewRow>:
    orientation: 'horizontal'
    ToggleButton:
        id: tb
        text: root.text
        state: root.state
        on_release: app.root.ids.rv.adjust_data(root)
""")

class MyLayout(BoxLayout):
    pass

class RecycleViewRow(BoxLayout):
    text = StringProperty()
    state = StringProperty('normal')

class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = [{'text': "Button " + str(x+1), 'state': "normal"} for x in range(30)]

    def adjust_data(self, rvRow):
        for d in self.data:
            if d['text'] == rvRow.text:
                d['state'] = rvRow.ids.tb.state
                rvRow.state = rvRow.ids.tb.state
                break

class MainscreenApp(App):
    def build(self):
        return MyLayout()

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

相关问题 更多 >