gpt4 book ai didi

python - Kivy 文本标记打印自己的语法

转载 作者:太空宇宙 更新时间:2023-11-03 16:41:10 24 4
gpt4 key购买 nike

我正在测试 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()

这是第一次按下后的输出: enter image description here

这是第二次按下后的输出: enter image description here

这是第三次按下后的输出: enter image description here

我希望你现在就能解决这个问题。文本开头的标记语法随着按钮被按下的次数而不断增加。

我想这可能是循环的错误。所以我删除了循环并仅使用第一个小部件进行测试。同样的问题。

现在这是一个问题 - 当我通过更改更改函数的内容来更改颜色时,如下所示:

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:])

通过这种方式,您可以避免重复使用添加的标记。当然,您可能希望设置绑定(bind)以使分配_hidden_​​texttext自动进行。

编辑:

添加此类定义:

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

然后将CLabel的kv样式更改为

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

每次使用CLabel应该看起来像

CLabel:
id: a
hidden_text: 'abcd'

关于python - Kivy 文本标记打印自己的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36772411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com