私は 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()
問題が解決することを願っています。テキストの先頭にあるマークアップ構文は、ボタンが押される回数とともに増加し続けます。
多分それはループのせいだと思いました。そのため、ループを削除し、最初のウィジェットのみでテストしました。同じ問題。
これがキャッチです-次のように変更関数の内容を変更して色を変更すると:
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'
ラベルの数を知っている神のテキストの最初の文字の色を変更する方法を誰かが持ってきてくれたら、本当にうれしいです。:'(