动态类型的kivy小部件

时间:2017-03-13 14:51:42

标签: kivy kivy-language

我想创建一个自定义窗口小部件MyWidget,它由标题正文组成。

有时候,标题是一个标签,标识是一个盒子布局,即:

<MyWidget@BoxLayout>:
    Label:
        id: header
        text: "Title" 
    BoxLayout:
        id: body

但有时我想在TabbedPanel中对其中的几个进行分组,在这种情况下,MyWidget应该表现为:

<MyWidget@TabbedPanelItem>:
    text: "Title" 
    BoxLayout:
        id: body

也就是说,MyWidget应该是一个不同的东西,取决于谁是它的父(Tabbedpanel或其他任何东西),可以用MyWidget.on_parent检测

我知道标准的方法是分别定义两个不同的小部件,MyWidget_Tabbed和MyWidget_individual,分别是TabbedpanelItem和BoxLayout类型,但从概念上讲这两个实际上是相同的,只是它们被分组或取消分组

如何实现这一目标?

我正在考虑有3个类:MyWidgetGrouped(TabbedPanelItem),MyWidgetUngrouped(BoxLayout)和MyWidget。 只有MyWidget才会在KV中使用。然后,在mywidget.on_parent中,我将mywidget .__ class__更改为MyWidgetGrouped或MyWidgetUngrouped(也许我也必须调用__init__并设置__dict__,以及其他东西)

1 个答案:

答案 0 :(得分:0)

首先,仅仅因为2个物体看起来相同,它并不意味着它们是相同的。 BoxLayoutTabbedPanelItem的界面(合约)不同。仅仅因为它们最终看起来类似并不能使它们变得相同。您应该使用2个不同的类,因为它们不同

现在回答你的问题:

Python支持多重继承,因此您可以继承BoxLayoutTabbedPanelItem

我不知道kivy关于小部件的内部工作,这可能甚至不起作用。

但是您无法以您描述的方式从.kv文件加载2种不同的布局。您需要使用Builder.load_stringBuilder.load_file之类的内容来实现此目标。