Skip to content

Error using MDRecycleGridLayout and MDFabButton #1843

@Fector101

Description

@Fector101

Description of the Bug

Anytime i try add Widget to the MDRecycleGridLayout i get an error, I tried using a plain kivy Button and it works each time but when i use MDFabButton it works 1 of 10 times or consistently dosen't work.

I tested on linux and compiled for android same result.

Code

from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import AsyncImage
from kivymd.uix.recyclegridlayout import MDRecycleGridLayout
from kivymd.uix.recycleview import MDRecycleView
from kivy.uix.screenmanager import Screen
from kivymd.uix.button import MDFabButton
from kivymd.app import MDApp


class Thumb(ButtonBehavior, AsyncImage):
    pass


class TestApp(MDApp):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.rv = None
        self.view_data = [{'source': 'img1.jpg'}]

    def build(self):
        screen = Screen()
        self.rv = MDRecycleView()
        grid = MDRecycleGridLayout(
            cols=3,
            default_size=(None, 120),
            default_size_hint=(1, None),
            size_hint_y=None)
        grid.bind(minimum_height=grid.setter("height"))
        self.rv.layout_manager = grid
        self.rv.viewclass = "Thumb"
        self.rv.data = self.view_data

        self.rv.add_widget(grid)
        screen.add_widget(self.rv)

        btn = MDFabButton(icon="plus", on_release=self.copy_add)
        screen.add_widget(btn)
        return screen

    def copy_add(self, instance):
        for each in ['img.jpg']:
            self.view_data.append({"source": each})
        self.rv.data = self.view_data


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

Logs

 Traceback (most recent call last):
   File "/home/fabian/Documents/Laner/mobile/test.py", line 48, in <module>
     TestApp().run()
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/app.py", line 956, in run
     runTouchApp()
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/base.py", line 574, in runTouchApp
     EventLoop.mainloop()
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/base.py", line 339, in mainloop
     self.idle()
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/base.py", line 391, in idle
     Clock.tick_draw()
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/clock.py", line 783, in tick_draw
     self._process_events_before_frame()
   File "kivy/_clock.pyx", line 662, in kivy._clock.CyClockBase._process_events_before_frame
   File "kivy/_clock.pyx", line 708, in kivy._clock.CyClockBase._process_events_before_frame
   File "kivy/_clock.pyx", line 704, in kivy._clock.CyClockBase._process_events_before_frame
   File "kivy/_clock.pyx", line 218, in kivy._clock.ClockEvent.tick
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/uix/recycleview/__init__.py", line 352, in refresh_views
     lm.set_visible_views(indices, data, viewport)
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/uix/recyclelayout.py", line 396, in set_visible_views
     add(widget)
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/uix/layout.py", line 97, in add_widget
     super(Layout, self).add_widget(widget, *args, **kwargs)
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/uix/widget.py", line 664, in add_widget
     widget.parent = parent = self
     ^^^^^^^^^^^^^
   File "kivy/properties.pyx", line 520, in kivy.properties.Property.__set__
   File "kivy/properties.pyx", line 567, in kivy.properties.Property.set
   File "kivy/properties.pyx", line 606, in kivy.properties.Property._dispatch
   File "kivy/_event.pyx", line 1307, in kivy._event.EventObservers.dispatch
   File "kivy/_event.pyx", line 1189, in kivy._event.EventObservers._dispatch
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/lang/builder.py", line 177, in update_intermediates
     fn(args, None, None)
   File "/home/fabian/Documents/Laner/mobile/venv/lib/python3.12/site-packages/kivy/lang/builder.py", line 69, in call_fn
     e_value = eval(value, idmap)
               ^^^^^^^^^^^^^^^^^^
   File "<string>", line 66, in <module>
 AttributeError: 'MDRecycleGridLayout' object has no attribute 'icon_active'

Edit

I create, inherited and added the property's to Stop the Bug

class MyMDRecycleGridLayout(MDRecycleGridLayout):
    icon_active = StringProperty()
    icon_inactive_color = StringProperty()
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

Versions

  • OS: Linux mint
  • Python: Python 3.12.3
  • Kivy: 2.3.1
  • KivyMD: 2.0.1.dev0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions