0

DTErrorBar という 1 つのカスタム ウィジェットを使用してサンプル レイアウトを作成しました。

<DTErrorBar>:
    RelativeLayout:
        size_hint: None, None
        size: 20, 450
        canvas:
            Color:
                rgba: col_fg
            Line:
                points: 10, 10, 10, 410
                width: 4
            Color:
                hsv: col_gn_marker_hsla
            Line:
                points: 10, 10, 10, 410
                width: 2

私の例では、このウィジェットは次のような BoxLayout に含まれています。

    BoxLayout:
        orientation: "horizontal"
        DTErrorBar:
        Button:
        Button:
        DTErrorBar:

しかし、boxLayout内にあるボタンや他のDTErrorBarとスタックすることはできません。これが私が得ているものです:

ここに画像の説明を入力

そして、これは私が期待するものです:

ここに画像の説明を入力

さて、どうやって期待したイメージを手に入れたのでしょうか? カスタム ウィジェットを使用するコードに小さな変更を加えて作成されました。

    BoxLayout:
    orientation: "vertical"
    BoxLayout:
        orientation: "horizontal"
        RelativeLayout:
            DTErrorBar:
        Button:
        Button:
        RelativeLayout:
            DTErrorBar:

したがって、DTErrorBar ウィジェットを RelativeLayout 内にラップすると機能するように見えますが、DTErrorBar ウィジェット内のすべてのラッパーとして RelativeLayout が既にある場合、その理由はわかりません。

要約すると、予想される動作を得るために DTErrorBar の定義に何をする必要がありますか? 私の過ちから学ぶために、ここで何が間違っているのかを誰かが説明できれば興味深いでしょう、ありがとう。

予期しない場合の完全なコード: https://gist.github.com/payala/bc54f4d3d2378a97c26c9afe88858b07

予想外の場合の完全なコード: https://gist.github.com/payala/9de4de166c7c1942cc923c32550bf661

編集:jligezaの回答後の変更

Python 側では、DTErrorBar クラスは次のように宣言されています。

class DTErrorBar(Widget):
    pass

基本Widgetクラスから派生したカスタム ウィジェットを作成していました。Layout クラスから継承するように変更すると解決しました。

class DTErrorBar(RelativeLayout):
    pass

これを行うと、ウィジェット自体が RelativeLayout であるため、ウィジェット定義内に RelativeLayout を含める意味がなくなり、最終的なウィジェット定義コードは次のようになります。

<DTErrorBar>:
    size_hint: None, None
    size: 20, 450
    canvas:
        Color:
            rgba: col_fg
        Line:
            points: 10, 10, 10, 410
            width: 4
        Color:
            hsv: col_gn_marker_hsla
        Line:
            points: 10, 10, 10, 410
            width: 2
4

1 に答える 1