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 文件的代码创建小部件的主要内容,如果未能解决你的问题,请参考以下文章