沮丧的弹出错误

Kivy Popup Error

我似乎无法打开弹出窗口,因为它不是 'defined'。一切都从 Python 传递到 Kivy 语言(因为我更容易跟踪一切),这就是问题所在。

<StoryScreen>:
name: "story"
BoxLayout:
    id: storyScreen
    Popup:
        id: "popup"
        title: "Settings"
        on_parent: 
            if self.parent == storyScreen: self.parent.remove_widget(self)
        GridLayout:
            cols: 2
            Accordion:
                orientation: "vertical"

                AccordionItem:
                    title: "Main Character"
                    size_hint:.9, 0.10
                    pos_hint: {'x':0.05, 'y':0.85}

                    Label: 
                        id: first
                        text: "First Name"

                AccordionItem:
                    title: "Love Interest"
                    size_hint: .9, 0.10
                    pos_hint: {'x':0.05, 'y':0.70}
            Button:
                text: "What's up"
    Button: 
        text: "Press to open popup"
        on_release: popup.open()

    Label: 
        text: "This is a label"

我的回溯错误是:

   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/lang.py", line 1299, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "./story.kv", line 54, in <module>
     on_release: popup.open()
 NameError: name 'popup' is not defined

甚至当我尝试添加到 Python

class popup(Popup):
    pass

它仍然抛出定义错误。帮忙?

嗯...弹出窗口确实没有定义,这就是问题所在。

您需要获取弹出窗口 class 的 实例 (例如 Popup()),这样您就可以 运行 类似 Popup().open().

这只是针对 kivy 弹出 class,对于您自己的子class,您必须将其导入 kv 范围,例如#:import Yourpopupname main.Yourpopupname,那么你可以做到Yourpopupname().open()。我说 yourpopupname 而不是你选择的 popup 因为这是一个非常糟糕的名字,它很容易混淆,因为它与 kivy 的 Popup 一样大写。此外,您通常应该使用以大写字母开头的小部件名称,因为 kv 语言依赖于此来识别它们。

kv 语言 id 是 Python 标识符。你不能调用 Python 变量 "popup" (因为引号),所以它与 kv 相同。尝试使用 id: popup 而不是 id: "popup".