fastmhc
fastmhc

Reputation: 47

ReferenceError: weakly-referenced object no longer exists Kivy DropDown

Running this example of DropDown works. However, after some use/time I get the error ReferenceError: weakly-referenced object no longer exists

This is likely do to an issue in on_release:dropdown.open(self)

Bonus points as to why on_parent: self.dismiss() also doesn't work with the way I have these widgets set up. Without this, I have the submenu items appearing when the app first runs and with this enabled, the submenu items flash (appear and quickly disappear).

#!/usr/bin/kivy
import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty
from kivy.uix.dropdown import DropDown
from kivy.core.window import Window

Window.size = (400, 240)

sm = """

ScreenManager:
    id:manager
    canvas.before:
        Color:
            rgba: 0.5, 0.5, 0.5, 0.5
        Rectangle:
            pos: 0,0
            size: 800, 480
    Notes:
        id:Notes
        name: 'Notes'
        manager: manager

<Notes>:
    name: "Notes"
    orientation: "vertical"

    FloatLayout:
        size_hint: None, None

        canvas.before:
            Color:
                rgba: 1, 1, 0, 1    

        Button:

            id: mainbutton
            text: "Menu name"
            font_size: 20
            size_hint: None, None
            size: 150, 50
            pos: 20,400
            on_release:dropdown.open(self)

        CustomDropDown:
            id: dropdown
            #on_parent: self.dismiss()
            on_select: mainbutton.text = '{}'.format(args[1])

            Button:
                id: button1
                text: 'First Item'
                size_hint_y: None
                height: 40
                font_size: 18
                on_release: dropdown.select('First Item')

            Button:
                id: button2
                text: 'Second Item'
                size_hint_y: None
                height: 40
                font_size: 18
                on_release: dropdown.select('Second Item')

            Button:
                id: button3
                text: 'Third Item'
                size_hint_y: None
                height: 40
                font_size: 18
                on_release: dropdown.select('Third Item')

"""


class Notes(Screen):
    pass

class CustomDropDown(DropDown):
    pass

#dropdown = CustomDropDown()


class TestApp(App):

    def build(self):

        return Builder.load_string(sm)

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

Upvotes: 1

Views: 1740

Answers (2)

Ron87k
Ron87k

Reputation: 169

from : $Yourkivydir/kivy-examples/demo/showcase/data/screens

ShowcaseScreen:
    fullscreen: True
    name: 'DropDown'

    # trick to not lost the Dropdown instance
    # Dropdown itself is not really made to be used in kv.
    __safe_id: [dropdown.__self__]

    Button:
        id: btn
        text: '-'
        on_release: dropdown.open(self)
        size_hint_y: None
        height: '48dp'

    Widget:
        on_parent: dropdown.dismiss()

    DropDown:

        id: dropdown
        on_select: btn.text = 'Selected value: {}'.format(args[1])

        Button:
            text: 'Value A'
            size_hint_y: None
            height: '48dp'
            on_release: dropdown.select('A')

        Button:
            text: 'Value B'
            size_hint_y: None
            height: '48dp'
            on_release: dropdown.select('B')

        Button:
            text: 'Value C'
            size_hint_y: None
            height: '48dp'
            on_release: dropdown.select('C')

Upvotes: 1

ikolim
ikolim

Reputation: 16041

In child widget, CustomDropDown

With on_parent: self.dismiss()

When you clicked on the main button, Menu name sometimes it gives an error, ReferenceError: weakly-referenced object no longer exists. If there is no ReferenceError, the drop-down list flash (appear and quickly disappear). The reason is that the DropDown was dismissed.

Without on_parent: self.dismiss()

It will display the CustomDropDown list at app startup. When the main button, Menu name is clicked, the drop-down list that appeared at startup disappeared but it displayed a drop-down list twice as long i.e. submenu items repeated twice.

Note

Drop-Down List is similar to Popup. They are special widget. Don't try to add it as a child to any other widget. If you do, they will be handled like an ordinary widget and won't be created hidden in the background.

Please refer to the example below illustrating how to create Drop-Down list.

Example

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.dropdown import DropDown
from kivy.core.window import Window


Window.size = (800, 480)


class CustomDropDown(DropDown):
    pass


class Notes(Screen):
    pass


class MyScreenManager(ScreenManager):
    pass


class TestApp(App):
    title = "Kivy Drop-Down List Demo"

    def build(self):
        return MyScreenManager()


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

test.kv

#:kivy 1.10.0
#:import Factory kivy.factory.Factory

<CustomDropDown>:
    on_select: app.root.ids.Notes.ids.mainbutton.text = '{}'.format(args[1])

    Button:
        id: button1
        text: 'First Item'
        size_hint_y: None
        height: 40
        font_size: 18
        on_release: root.select(self.text)

    Button:
        id: button2
        text: 'Second Item'
        size_hint_y: None
        height: 40
        font_size: 18
        on_release: root.select(self.text)

    Button:
        id: button3
        text: 'Third Item'
        size_hint_y: None
        height: 40
        font_size: 18
        on_release: root.select(self.text)

<MyScreenManager>:
    canvas.before:
        Color:
            rgba: 0.5, 0.5, 0.5, 0.5
        Rectangle:
            pos: 0,0
            size: 800, 480
    Notes:
        id:Notes
        name: 'Notes'

<Notes>:
    orientation: "vertical"

    FloatLayout:
        size_hint: None, None

        canvas.before:
            Color:
                rgba: 1, 1, 0, 1

        Button:
            id: mainbutton
            text: "Menu name"
            font_size: 20
            size_hint: None, None
            size: 150, 50
            pos: 20,400
            on_release: Factory.CustomDropDown().open(self)

Output

App Startup

Upvotes: 1

Related Questions