4

次のような設定があるとします。

ScrollView:
   size_hint: (1, 0.5)

   Label:
      size_hint: (1, None)

最初は、ラベルにはコンテンツ/テキストがありません。私が正しく理解していれば、オブジェクトが作成されたとき、ラベルの高さはNoneです。

アプリが実行されると、Label のtextプロパティが複数行のテキストに設定され、ScrollView の境界の外に Label のコンテンツが押し出されます。ただし、スクロールを行うには、ラベルの y 寸法/高さを動的にサイズ変更する必要があるようです。

スクロールアクションが発生するように、ラベルの新しいコンテンツに従ってラベルの高さを動的にサイズ変更する最良の方法は何ですか?

4

1 に答える 1

6

実際のテキストは、デフォルトでラベル サイズに結合されていないサイズの Rectangle に表示されます。テキストの量が多い場合、これは大きくなり、ラベルの境界を超える可能性がありますが、ラベルのサイズは変更されません。

表示されるテキストの実際のサイズを制御する関連プロパティは ですLabel.text_size。必要な動作を得るには、次のようにするだけです。

ScrollView:
   size_hint: (1, 0.5)

   Label:
      size_hint: (1, None)
      height: self.text_size[1]

これにより、表示されるテキストの高さを追跡するようにラベルの高さがバインドされるため、必要な動作が得られます。

補足として、多くの場合、 を変更または監視すると便利ですtext_size。たとえば、手動の改行に頼るのではなく、ラベルの端でtext_size: self.sizeテキストを折り返すようにするには、幅がラベルの幅を超える場合にテキストが自動的に折り返されることを意味するように設定できます。これは、ラベル自体ではなく、テクスチャ内のテキスト位置を制御する halign または valign を使用する場合にも重要です。これらのプロパティは、手動で text_size を実際のテキストのスペースよりも大きな値に (再び) 設定しない限り、目に見える効果はありません。取り上げます。

編集:以下のコメントに従って、これは私のアプリの 1 つのラベルの例です。テキストの長さが長くなると (ユーザーがスクロールできるように) 垂直方向に成長しますが、幅がラベルよりも大きい場合はテキストを自動的に折り返します幅。Label を GridLayout に配置することで実際にこれを行ったようですが、これは何らかの理由で重要だったことをぼんやりと覚えています。

GridLayout:
    cols: 1
    spacing: 10
    size_hint_y: None
    height: thetb.texture_size[1]

    Label:
        id: thetb
        text: 'whatever'
        text_size: self.width, None
        size_hint: (1, None)
        size: self.parent.width, self.texture_size[1]

text_size を使用してテキスト バウンディング ボックスを制御していることがわかりますが (ラベルの端で折り返されます)、実際には GridLayout の高さをバインドして texture_size の高さを追跡しています。GridLayout は ScrollView に配置され、私が望む動作を正確に取得します。

于 2013-11-12T21:55:23.643 に答える