如何在Kivy中正确导入自定义小部件

时间:2018-12-12 05:55:53

标签: python-3.x kivy kivy-language

我有一个由其他小部件(W1)制成的小部件(W2)。每个都有一个对应的.kv文件,如下所示。运行main.py,我希望看到带有两个垂直堆叠标签的黑色背景。相反,我使两个标签相互重叠,所以出了点问题。

kivy.factory.FactoryException: Unknown class <W1>

所以我想,“也许我应该将w1.py导入w2.py中,即使未在py文件中显式使用它?这种工作方式……我将两个标签都放在另一个顶部,例如下图。

enter image description here

我在做什么错?编写预期将由另一个小部件导入/包含的小部件的正确方法是什么?以及正确的导入方式?

我尝试在.py文件中使用Builder.load_file(),只是导入.py文件,但结果相似。

w1.py:

import kivy
from kivy.properties import StringProperty
from kivy.uix.widget import Widget
kivy.require('1.10.0')

class W1(Widget):
    text = StringProperty('default')

    def __init__(self,  **kwargs):
        super(W1, self).__init__(**kwargs)

w1.kv:

#:kivy 1.10.0

<W1>:
    text:
    Label:
        text: root.text

w2.py:

import kivy from kivy.uix.boxlayout import BoxLayout
# from w1 import W1  # added this to get a working, but the incorrect layout
kivy.require('1.10.0')

class W2(BoxLayout):

    def __init__(self,  **kwargs):
        super(W2, self).__init__(**kwargs)

w2.kv:

#:kivy 1.10.0
#:include w1.kv

<W2>:
    orientation: 'vertical'
    W1:
        text: 'w1.1' 
    W1:
        text: 'w1.2'

main.py:

import kivy
from w2 import W2
from kivy.app import App
kivy.require('1.10.0')


class mainApp(App):

    def build(self):
        pass


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

main.kv:

#:kivy 1.10.0
#:include w2.kv

W2:

编辑 重叠已解决,尽管可能无法正确解决。我让W1继承自BoxLayout而不是Widget,以为在基本Widget类中可能缺少最小的height / width属性。

我仍然不确定导入具有成对的.kv文件的窗口小部件的“正确”方法是什么,还是我从窗口小部件继承继承重叠窗口小部件的确切原因;只是猜测。 enter image description here

1 个答案:

答案 0 :(得分:0)

为什么要为此使用两个不同的kv文件? 我会说正确的方法与我的kv文件类似。因为您要拆分可以在单个页面上完成的任务,并且如果需要其他页面,则可以使用ScreenManager导入内容

main.py

`
import kivy
from kivy.app import App
from kivy.uix.widgets import Widget
from kivy.uix.label import Label
from kivy.uix.gridlayut import GridLayout

class MyGrid(Widget):
     pass


class MyApp(App):
     def build(self):

 # this calls what we want to show in the kv file
         return MyGrid()



if __name__ == "__main__":
MyApp().run()
`

文件之所以这样写,是因为该应用程序掉线了,并且要链接两个文件,它必须具有相同的名称

my.kv : #“ <>”基本上从.py文件链接MyGrid,然后显示 #gridlayout等 网格布局: 行:2

        Label:
           text: "whatever"
        
        Label:
           text: "whatever 2"