Kivy 通过加载 .kv 文件的代码创建小部件

Posted

技术标签:

【中文标题】Kivy 通过加载 .kv 文件的代码创建小部件【英文标题】:Kivy create widget by code which loads a .kv file 【发布时间】:2016-06-18 09:10:52 【问题描述】:

我想为用户第一次打开应用程序创建一个弹出式教程。因为我希望本教程与应用程序其余部分的代码尽可能分开(并且仅在使用教程时加载),所以我将代码分开如下:

在同一个文件夹中:

foo.py foo.kv learnkanji_tut.py learnkanji_tut.kv

编辑 foo.py

​​>

foo.py(在 .kv 文件中有 id:lfunc):

class LayoutFunctioning(BoxLayout):
    def __init__(self, **kwargs):
        super(LayoutFunctioning, self).__init__(**kwargs)

        tutorial = 1

        if tutorial:
            Clock.schedule_once(lambda dt: self.tutwidget())

    def tutwidget(self):         
        import learnkanji_tut
        tutpop = learnkanji_tut.TutInteraction()
        self.ids.lfunc.add_widget(tutpop)

learnkanji_tut.py:

#!/usr/bin/kivy
# -*- coding: utf-8 -*-

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.popup import Popup
from os.path import join, dirname


class TutInteraction(Popup):
    curdir = dirname(__file__)
    Builder.load_file(join(curdir, 'learnkanji_tut.kv'))
    tut_text = "Tut"

    def __init__(self, **kwargs):
        self.title = 'Tutorial Popup'
        self.auto_dismiss = 'False'
        super(TutInteraction, self).__init__(**kwargs)

        print("Tutorial loaded")
        self.tut_step = 0  # Current step in the tutorial

learnkanji_tut.kv:

#:kivy 1.9.1

<TutInteraction>:
    id: tutpop

    BoxLayout:
        ScrollView:
            size_hint_y: 0.8
            text: "test"

        BoxLayout:
            size_hint_y: 0.2

            Button:
                size_hint_x: 0.3
                text: "Skip"

            Button:
                size_hint_x: 0.7
                text: "Next"

错误:

self.ids.lfunc.add_widget(tutpop) File "kivy\properties.pyx", line 757, in kivy.properties.ObservableDict.__getattr__ (kivy\properties.c:11882) AttributeError: 'super' object has no attribute '__getattr__'

问题:

我做错了什么?为什么我不能添加这样的弹出窗口小部件? 按照文档:https://kivy.org/docs/api-kivy.uix.popup.html,弹出窗口应该有:Popup.title and Popup.content

我有一个标题 (self.title = 'Tutorial Popup') 和内容(.kv 文件)。那么我是在这里还是在其他地方做错了什么?

【问题讨论】:

【参考方案1】:

来自 IRC 频道#kivy 中的@inclement:“不要将 add_widget 与 Popup 一起使用,调用它的 .open() 方法”

所以这意味着:

if tutorial:
    import learnkanji_tut
    tutpop = learnkanji_tut.TutInteraction()
    tutpop.open()

附言看来Clock.schedule_once()是没有必要的。

【讨论】:

以上是关于Kivy 通过加载 .kv 文件的代码创建小部件的主要内容,如果未能解决你的问题,请参考以下文章

python中的kivy小部件到kv文件,如何控制它

在 Kivy 中传递自定义小部件属性

带有 kivy 语言和自定义小部件的 Kivy 滚动视图

Kivy - 使用 .kv

如何将位于同一行的 Kivy 小部件移得更远?

Kivy:弹出窗口只能有一个小部件作为内容