我想创建一个自定义窗口小部件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__,以及其他东西)
答案 0 :(得分:0)
首先,仅仅因为2个物体看起来相同,它并不意味着它们是相同的。 BoxLayout
和TabbedPanelItem
的界面(合约)不同。仅仅因为它们最终看起来类似并不能使它们变得相同。您应该使用2个不同的类,因为它们不同。
现在回答你的问题:
Python支持多重继承,因此您可以继承BoxLayout
和TabbedPanelItem
。
我不知道kivy关于小部件的内部工作,这可能甚至不起作用。
但是您无法以您描述的方式从.kv文件加载2种不同的布局。您需要使用Builder.load_string
或Builder.load_file
之类的内容来实现此目标。