2

私は Kivy のマークアップ機能をテストしていました。私のテスト プログラムの基本的な概要は、4 つのラベルとボタンがあり、ボタンが押されると、ラベルのテキストの最初の文字の色が変わることです。さて、問題は、ボタンを初めて押すと、すべてのラベルのテキストの最初の文字の色が変わりますが、2回目以降は、テキストの先頭に逆の方法でマークアップ構文を追加し始めることです. これはプログラムです:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.lang import Builder
import string

Builder.load_string(
'''
<CLabel@Label>:
    markup: True

<box>:
    orientation: 'vertical'

    Button:
        text: 'press'
        on_press: app.change()


    CLabel:
        id: a
        text: 'abcd'

    CLabel:
        id: b
        text: 'efgh'

    CLabel:
        id: c
        text: 'ijkl'

    CLabel:
        id: d
        text: 'mnop'
'''
)

class box(BoxLayout):
    pass

class main(App):
    def change(self):
        for lol in string.lowercase[:4]:
            self.root.ids[lol].text = '[color=#E5D209]{}[/color]{}'.format(self.root.ids[lol].text[0], self.root.ids[lol].text[1:])

    def build(self):
        return box()

if __name__ == "__main__":
    main().run()

これは、最初に押した後の出力です。 ここに画像の説明を入力

これは、2 回目のプレス後の出力です。 ここに画像の説明を入力

これは、3 回目のプレス後の出力です。 ここに画像の説明を入力

問題が解決することを願っています。テキストの先頭にあるマークアップ構文は、ボタンが押される回数とともに増加し続けます。

多分それはループのせいだと思いました。そのため、ループを削除し、最初のウィジェットのみでテストしました。同じ問題。

これがキャッチです-次のように変更関数の内容を変更して色を変更すると:

def change(self):
    self.root.ids.a.text = '[color=#E5D209]a[/color]bcd'
    self.root.ids.b.text = '[color=#E5D209]e[/color]fgh'
    self.root.ids.c.text = '[color=#E5D209]i[/color]jkl'
    self.root.ids.d.text = '[color=#E5D209]m[/color]nop'

それは完全にうまく機能します。しかし、この方法を行うと、多くの行をコピーして貼り付ける必要があります。これは私が取り組んでいることのほんの一部でした。私が取り組んでいる実際のプロジェクトには 15 を超えるラベルがあり、すべてのラベルをコピーして貼り付けるのは面倒です。それがループで行われると、はるかに良いでしょう。それは仕事を短く正確にします。

この後、欲求不満から、次のコードで get_color_from_hex メソッドを試しました。

self.root.ids[lol].text[0] = self.root.ids[lol].text[0].get_color_from_hex('#E5D209')

しかし、次のようなエラーメッセージが表示されました。

AttributeError: 'str' object has no attribute 'color'

ラベルの数を知っている神のテキストの最初の文字の色を変更する方法を誰かが持ってきてくれたら、本当にうれしいです。:'(

4

1 に答える 1

2

マークアップは、 に格納されている文字列の一部ですtext。したがって、ループを 2 回目に実行すると、最初の文字 ( [) がマークアップ タグの間に挿入され、解析が台無しになります。

やりたいことは、生のテキストを別の に保存することで実現できます。StringPropertyそれを と呼びましょう_hidden_text。次に、ループで設定できます

self.root.ids[lol].text = '[color=#E5D209]{}[/color]{}'.format(self.root.ids[lol]._hidden_text[0], self.root.ids[lol]._hidden_text[1:])

このようにして、追加されたマークアップの再利用を避けることができます。もちろん、割り当て_hidden_text→<code>text を自動化するためのバインドを設定したい場合もあります。

編集:

次のクラス定義を追加します。

class CLabel(Label):
    hidden_text = StringProperty('')

次に、 kv スタイルをCLabelに変更します

<CLabel>:
    markup: True
    text: self.hidden_text

の各使用は次のCLabelようになります

CLabel:
    id: a
    hidden_text: 'abcd'
于 2016-04-21T15:33:19.727 に答える