Kivy 文本标记打印自己的语法
Kivy text markup printing its own syntax
我正在测试 Kivy 的标记功能。我的测试程序的基本轮廓是有 4 个标签和一个按钮,如果按下按钮,它会改变标签文本第一个字母的颜色。现在,问题是当我第一次按下按钮时,它改变了所有标签文本的第一个字母的颜色,但是从第二次按下开始,它开始以相反的方式在文本的开头添加标记语法.这是程序:
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'
如果有人能提供一种方法来更改文本首字母的颜色,我会非常高兴知道有多少标签。 :'(
标记是 text
中存储的字符串的一部分。所以你第二次 运行 循环时,实际上第一个字符 ([
) 被插入到标记标签之间,搞乱了解析。
你想做的可以通过将原始文本存储在另一个 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
→text
自动进行。
编辑:
添加此 class 定义:
class CLabel(Label):
hidden_text = StringProperty('')
然后将 CLabel
的 kv 样式更改为
<CLabel>:
markup: True
text: self.hidden_text
并且每次使用 CLabel
都应该像
CLabel:
id: a
hidden_text: 'abcd'
我正在测试 Kivy 的标记功能。我的测试程序的基本轮廓是有 4 个标签和一个按钮,如果按下按钮,它会改变标签文本第一个字母的颜色。现在,问题是当我第一次按下按钮时,它改变了所有标签文本的第一个字母的颜色,但是从第二次按下开始,它开始以相反的方式在文本的开头添加标记语法.这是程序:
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'
如果有人能提供一种方法来更改文本首字母的颜色,我会非常高兴知道有多少标签。 :'(
标记是 text
中存储的字符串的一部分。所以你第二次 运行 循环时,实际上第一个字符 ([
) 被插入到标记标签之间,搞乱了解析。
你想做的可以通过将原始文本存储在另一个 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
→text
自动进行。
编辑:
添加此 class 定义:
class CLabel(Label):
hidden_text = StringProperty('')
然后将 CLabel
的 kv 样式更改为
<CLabel>:
markup: True
text: self.hidden_text
并且每次使用 CLabel
都应该像
CLabel:
id: a
hidden_text: 'abcd'