Python 3.x 如何在kivy中正确导入自定义小部件
我有一个小部件(W2),由其他小部件(W1)组成。每个都有一个对应的.kv文件,如下所示。运行main.py,我希望看到一个带有两个标签的黑色背景,垂直堆叠。取而代之的是,我把两个标签都贴在了一起,所以出了点问题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
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…)试图做一些不能(或不应该)在一个页面中完成的事情。