【问题标题】:ReferenceError: weakly-referenced object no longer exists Kivy DropDownReferenceError:弱引用对象不再存在 Kivy DropDown
【发布时间】:2023-04-04 15:57:01
【问题描述】:

运行这个 DropDown 示例可以正常工作。但是,经过一些使用/时间后,我收到错误 ReferenceError:weakly-referenced object no longer exist

这可能与 on_release:dropdown.open(self) 中的问题有关

关于为什么 on_parent: self.dismiss() 也不适用于我设置这些小部件的方式的奖励点。如果没有这个,我会在应用程序首次运行时出现子菜单项,并且启用此功能后,子菜单项会闪烁(出现并迅速消失)。

#!/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()

【问题讨论】:

    标签: python kivy dropdown weak-references


    【解决方案1】:

    来自:$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')
    

    【讨论】:

    • 如果您简要说明您的代码的作用以及它如何解决问题,那么这个答案将对未来的用户更有用(并且可能会为您赢得更多的赞成票)
    • 正如 divibisan 指出的那样,要做什么并不是很明显,所以让我根据这个答案澄清什么对我有用。 Ron87k 提供的 kv 文件顶部附近有 cmets。在 kv 文件中给你的 DropDown 一个 id,然后在出现 DropDown 的对象/小部件中添加 __safe_id: [dropdown.__self]。
    【解决方案2】:

    在子小部件中,CustomDropDown

    使用 on_parent:self.dismiss()

    当您点击主按钮时,菜单名称有时会报错,ReferenceError:weakly-referenced object no longer exist。如果没有ReferenceError,下拉列表闪烁(出现并快速消失)。原因是 DropDown 被关闭了。

    没有 on_parent:self.dismiss()

    它将在应用启动时显示 CustomDropDown 列表。单击主按钮菜单名称时,启动时出现的下拉列表消失了,但它显示的下拉列表的长度增加了两倍,即子菜单项重复了两次。

    注意

    下拉列表类似于弹出。它们是特殊的小部件。不要尝试将其作为孩子添加到任何其他小部件。如果这样做,它们将像普通小部件一样被处理,并且不会被隐藏在后台。

    请参考以下示例,说明如何创建下拉列表。

    示例

    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)
    

    输出

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 2020-08-22
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多