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,请阅读 。
假设一个 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,请阅读