2017-03-13 7 views
0

Ich mag ein eigenes Widget erstellen, mywidget, die einen Kopf und einen Körper zusammengesetzt ist.Kivy Widget mit dynamischem Typ

Manchmal ist der Kopf würden ein Box-Layout, dh ein Etikett und der Körper sein:

<[email protected]>: 
    Label: 
     id: header 
     text: "Title" 
    BoxLayout: 
     id: body 

Aber manchmal ich zu einer Gruppe in einem TabbedPanel mehrere von diesen will, in diesem Fall, mywidget sollte so verhalten:

<[email protected]>: 
    text: "Title" 
    BoxLayout: 
     id: body 

das heißt, mywidget eine andere Sache je nach sein sollte, wer seine Eltern ist (ein Tabbedpanel oder irgendetwas anderes), die mit MyWi nachgewiesen werden kann dget.on_parent

ich den Standard-Weg weiß, es zu tun ist, zwei verschiedene Widgets zu definieren, MyWidget_Tabbed und MyWidget_individual, von Typen TabbedpanelItem und BoxLayout jeweils, aber konzeptionell diese beiden sind wirklich die gleichen, nur, dass sie entweder gruppiert sind oder nicht gruppierten

Wie erreichen?

Ich denke über 3 Klassen: MyWidgetGrouped (TabbedPanelItem), MyWidgetUngrouped (BoxLayout) und MyWidget. In KV wird nur MyWidget verwendet. Dann, in mywidget.on_parent, werde ich mywidget .__ class__ in entweder MyWidgetGrouped oder MyWidgetUngrouped ändern (und vielleicht muss ich auch __init__ aufrufen und __dict__ setzen, und andere Dinge)

Antwort

0

Zunächst einmal, nur weil 2 Objekte aussehen Gleiches bedeutet nicht, dass sie gleich sind. Die Schnittstelle (Vertrag) für BoxLayout und TabbedPanelItem ist unterschiedlich. Nur weil sie am Ende ähnlich aussehen, machen sie sie nicht gleich. Sie sollten 2 verschiedene Klassen für diese verwenden, da sie verschiedene sind.

Nun zu Ihrer Frage:

Python Unterstützung Mehrfachvererbung, so dass Sie beide BoxLayout und TabbedPanelItem erben können.

Ich weiß nicht über die innere Arbeit von Kivy in Bezug auf Widgets, das kann nicht einmal funktionieren.

Sie können jedoch nicht 2 verschiedene Layouts aus .kv-Dateien in der von Ihnen beschriebenen Weise laden. Sie müssen etwas wie Builder.load_string oder Builder.load_file verwenden, um dies zu erreichen.

+0

Hallo! Danke für die Antwort. Ich habe versucht mit Mehrfachvererbung aber konnte es nicht arbeiten lassen. Ich habe die Frage bearbeitet, schau sie dir an –