Kivy 标记搞乱了开始方括号

Kivy markup messing up opening square bracket

假设一个 Label 小部件有一个文本 'abcd[',它会按预期在输出屏幕上打印出正确的内容。但是,当我将该 Label 小部件的标记设置为 True 时,它​​会打印出 'abcd[[/color]'。我该如何克服这个问题?我通过在文本中的左括号后添加 '\n' 找到了一种可能的修复方法。但是因为我有很多小部件并排在一起,换行符很明显而且看起来有点丑。

在这个例子中,我使用的是 Button 而不是 Label。

这是

的输出
Button:
    markup: True
    text: 'abcd\n['

这是

的输出
Button:
    markup: True
    text: 'abcd\n[\n'

正如我所说,添加换行符会使它看起来很难看,并且附近小部件之间的文本级别差异看起来非常明显。

这可以通过使用 escape_markup 或将 '[' 替换为 '&bl;' 来解决。

方法一:使用escape_markup.

from kivy.app import App
from kivy.lang import Builder

kv = ('''
#:import escape kivy.utils.escape_markup
Label:
    markup: True
    text: 'abcd{}'.format(escape('['))
''')

class mainApp(App):
    def build(self):
        return Builder.load_string(kv)

if __name__ == '__main__':
    mainApp().run()

方法二:字符替换

from kivy.app import App
from kivy.lang import Builder

kv = ('''
#:import escape kivy.utils.escape_markup
Label:
    markup: True
    text: 'abcd&bl;'
''')

class mainApp(App):
    def build(self):
        return Builder.load_string(kv)

if __name__ == '__main__':
    mainApp().run()

现在,如果你想改变“[”的颜色,你必须这样做:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.properties import StringProperty

kv = (
'''
#:import escape kivy.utils.escape_markup
<L>:
    markup: True
    text: self.hidden_text

<B>:
    Button:
        text: 'press'
        on_press: root.lel()

    L:
        id: lol
        hidden_text: 'abcd{}'.format(escape('['))
        markup: True
B
'''
)

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

class B(BoxLayout):
    def lel(self):
        self.ids.lol.text = '{}[color=#E5D209]{}[/color]'.format(self.ids.lol.hidden_text[:4], self.ids.lol.hidden_text[4:])

class color(App):
    def build(self):
        return Builder.load_string(kv)

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

注意我在 B class 的 lel() 中做了什么。要更改“[”的颜色,我键入 hidden_text[4:] 而不是 hidden_text[4]。这是因为当你执行 escape('[') 时,它所做的只是将 '[' 替换为 '&bl;'。因此,当您使用 hidden_text[4] 时,您将得到以下输出:

但是如果你使用hidden_text[4:],它会覆盖&之后的字符,直到到达分号。

要了解我为什么在 Label 的文本上使用 StringProperty,请阅读