Kivy小部件的新实例没有kv lang文件的属性

时间:2016-02-29 19:19:35

标签: python kivy

我为Popup创建了一个类,并在kv文件中设置了title属性。

当弹出窗口显示时,它没有kv文件中的标题,而是显示No Title,就好像它从未设置过一样。

这与此处的问题完全相同,但我不明白这个链接是什么问题或如何使其工作: https://github.com/kivy/kivy/issues/751

我理解如何使用kv lang中的ID来执行此操作,但这仅在将Popup作为根窗口小部件(例如,MainUI)的子窗口小部件时才有效。然后我可以将python类的实例链接到kv文件中的小部件。 但随后弹出窗口显示为根小部件的一部分。 我想要做的是,在单击“新建”按钮时实例化popNewDB类的新实例,并让此实例使用KV文件中的“title”等值。

请解释一下如何做到这一点?

这是我的代码:

py文件:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.popup import Popup
from kivy.properties import ObjectProperty

class popNewDB(Popup):
    pass

class MainUI(Widget):
    pop = ObjectProperty(popNewDB())

    def showpopup(self):
        self.pop.open()


class VerseReminder(App):
    def build(self):
        return MainUI()


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

kv文件:

#:kivy 1.9.1

<popNewDB>
    title: 'Hallo'

<MainUI>
    Label:
        pos: root.center_x - self.width/2,root.center_y + 200
        text: "Quote Reminder"
    BoxLayout:
        size_hint: None,None
        width: 400
        height: 200
        pos: root.center_x-200,root.center_y-50
        orientation: 'vertical'
        spacing: 20
        Button:
            size_hint: 1,1
            text: "New..."
            on_press: root.showpopup()
        Button:
            size_hint: 1,1
            text: "Open..."
        Button:
            size_hint: 1,1
            text: "Quit"

1 个答案:

答案 0 :(得分:0)

在评估pop = ObjectProperty(popNewDB())时,尚未加载规则,因此只会创建准系统Popup。相反,你可以这样做:

class MainUI(Widget):
    pop = ObjectProperty()

    def showpopup(self):
        if self.pop is None:
            self.pop = PopNewDB()
        self.pop.open()

此处,第一次按下该按钮时,将创建PopNewDB的新实例并将其存储在self.pop中。 ( NB:我将Popup子类重命名为以大写字母开头,以符合语言标准和kivy期望)