Python 3.x 如何在kivy中正确导入自定义小部件

Python 3.x 如何在kivy中正确导入自定义小部件,python-3.x,kivy,kivy-language,Python 3.x,Kivy,Kivy Language,我有一个小部件(W2),由其他小部件(W1)组成。每个都有一个对应的.kv文件,如下所示。运行main.py,我希望看到一个带有两个标签的黑色背景,垂直堆叠。取而代之的是,我把两个标签都贴在了一起,所以出了点问题 kivy.factory.FactoryException: Unknown class <W1> w1.kv: import kivy from kivy.properties import StringProperty from kivy.uix.widget imp

我有一个小部件(W2),由其他小部件(W1)组成。每个都有一个对应的.kv文件,如下所示。运行main.py,我希望看到一个带有两个标签的黑色背景,垂直堆叠。取而代之的是,我把两个标签都贴在了一起,所以出了点问题

kivy.factory.FactoryException: Unknown class <W1>
w1.kv:

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)
#:kivy 1.10.0

<W1>:
    text:
    Label:
        text: root.text
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)
#:kivy 1.10.0
#:include w1.kv

<W2>:
    orientation: 'vertical'
    W1:
        text: 'w1.1' 
    W1:
        text: 'w1.2'
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()
#:kivy 1.10.0
#:include w2.kv

W2:
w2.kv:

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)
#:kivy 1.10.0

<W1>:
    text:
    Label:
        text: root.text
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)
#:kivy 1.10.0
#:include w1.kv

<W2>:
    orientation: 'vertical'
    W1:
        text: 'w1.1' 
    W1:
        text: 'w1.2'
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()
#:kivy 1.10.0
#:include w2.kv

W2:
main.kv:

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)
#:kivy 1.10.0

<W1>:
    text:
    Label:
        text: root.text
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)
#:kivy 1.10.0
#:include w1.kv

<W2>:
    orientation: 'vertical'
    W1:
        text: 'w1.1' 
    W1:
        text: 'w1.2'
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()
#:kivy 1.10.0
#:include w2.kv

W2:
编辑 重叠问题已经解决,尽管可能不正确。我让W1继承自BoxLayout而不是Widget,因为我认为在基本Widget类中可能缺少一个最小高度/宽度属性

我仍然不确定导入具有成对.kv文件的小部件的“正确”方法是什么,也不确定为什么我从小部件继承时会得到重叠的小部件;只是猜测。

为什么要为此使用两个不同的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()
`
文件是这样写的,因为应用程序会脱落,为了链接2,它必须具有相同的名称 my.kv: #“”基本上从.py文件链接
MyGrid
,然后显示 #网格布局等等 网格布局: 行数:2


是的,我的具体例子可以在一页纸上完成。这是一个最简单可行的例子,但假设我有一个小部件,我希望它在我的项目中的许多不同的小部件中。关键是我(我甚至不再使用kivy…)试图做一些不能(或不应该)在一个页面中完成的事情。