如何在python中创建具有格式的自定义Kivy标签类?

如何在python中创建具有格式的自定义Kivy标签类?,python,formatting,label,kivy,Python,Formatting,Label,Kivy,我正在用kivy编写一个桌面应用程序,但它的运行速度并没有我希望的那么快。我有很多标签和按钮,有很多格式,只是颜色和大小不同。我希望,若我创建一个已经有格式的定制kivy标签,它将提高性能。我已经有了我所有的标签和格式,我想把它们都改成我的定制kivy标签 kivy文件中的原始代码。这是我所有标签的样子。 所以我尝试创建一个FormattedLabel类来添加我想要的所有格式,然后在kivy文件中更改FormattedLabel的标签 Python文件 奇维锉刀 但它没有产生与我的原始代码相同的

我正在用kivy编写一个桌面应用程序,但它的运行速度并没有我希望的那么快。我有很多标签和按钮,有很多格式,只是颜色和大小不同。我希望,若我创建一个已经有格式的定制kivy标签,它将提高性能。我已经有了我所有的标签和格式,我想把它们都改成我的定制kivy标签

kivy文件中的原始代码。这是我所有标签的样子。 所以我尝试创建一个FormattedLabel类来添加我想要的所有格式,然后在kivy文件中更改FormattedLabel的标签

Python文件 奇维锉刀
但它没有产生与我的原始代码相同的结果: 1.矩形的大小已关闭(越窄越高),因此字母不再适合于直线。我不知道如何将矩形的大小绑定到kivy文件中的size_提示。 2.标签的颜色不变。 我不知道这是因为代码不应该在init下,还是因为我不知道如何正确地编写它。提前感谢您的帮助

问题
  • 矩形的大小已关闭(越窄越高),因此字母不再适合于直线。我不知道如何绑定 矩形的大小与kivy文件中的size_提示相同
  • 标签的颜色不变。我不知道这是因为代码不应该在init下,还是因为我不在init下 学习如何正确书写
  • 根本原因 结果并非如预期,因为Kivy尚未完成其造型。例如,矩形的大小是关闭的,因为它使用小部件的默认大小,即(100100)

    因此,函数是从调用的, 样式在此文件中定义并创建的任何小部件 调用before(例如,在
    \uuuu init\uuu
    中),将不具有其样式 应用注意,在已被调用之后调用 打电话来

    解决方案
  • 实现一个方法,
    initialize\u widget()
  • canvas.add
    替换为
    canvas.before.add
    ,因为如果没有
    before
    关键字,文本将不可见
  • 在Kivy完成样式设置后,使用Kivy Clock方法调用
    初始化\u widget()
    函数
  • 片段 问题
  • 矩形的大小已关闭(越窄越高),因此字母不再适合于直线。我不知道如何绑定 矩形的大小与kivy文件中的size_提示相同
  • 标签的颜色不变。我不知道这是因为代码不应该在init下,还是因为我不在init下 学习如何正确书写
  • 根本原因 结果并非如预期,因为Kivy尚未完成其造型。例如,矩形的大小是关闭的,因为它使用小部件的默认大小,即(100100)

    因此,函数是从调用的, 样式在此文件中定义并创建的任何小部件 调用before(例如,在
    \uuuu init\uuu
    中),将不具有其样式 应用注意,在已被调用之后调用 打电话来

    解决方案
  • 实现一个方法,
    initialize\u widget()
  • canvas.add
    替换为
    canvas.before.add
    ,因为如果没有
    before
    关键字,文本将不可见
  • 在Kivy完成样式设置后,使用Kivy Clock方法调用
    初始化\u widget()
    函数
  • 片段
    “但是它没有产生与我的原始代码相同的结果。”抱歉,没有具体说明!是的,矩形没有正确的大小,但画布颜色也没有改变,它始终是白色的。我认为您的问题是,当您在
    Python
    中执行
    Widget
    属性时,您无法获得在
    kv
    中执行相同操作所产生的附加功能。在
    FormattedLabel
    \uuuu init\uuuuuuuuuuuuuuuuuuuuuuu()方法中,用于
    大小
    位置
    背景色
    的值都是在执行
    \uuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()方法时使用的值,对这些属性的任何更改都不会(所有这些属性都在
    \uuuu init\uuu
    之后更改)。您可以设置绑定以反映这些属性中的更改(这就是
    kv
    为您所做的)。“但它不会产生与我的原始代码相同的结果。”很抱歉说得不具体!是的,矩形没有正确的大小,但画布颜色也没有改变,它总是白色的。我想你的问题是,当你在
    Python
    中执行
    Widget
    属性时,你得不到在
    kv
    中执行相同操作所产生的额外功能。在
    格式化标签的方法
    ,用于
    大小
    位置
    背景色
    的值都是在执行
    \uuuu init\uuuuuuuuuu()
    方法时使用的值,对这些属性的任何更改都不会产生任何影响(并且所有这些属性在
    \uuuu init\uuuuuuuuuuuuuuu
    之后都会更改)。您可以设置绑定以反映这些属性中的更改(这是
    kv
    为您所做的)。
    Label:  
        text: "some text"  
        color: (0, 0.2, .4, 1)  
        size_hint: 1, 0.04  
        text_size: self.size  
        halign: 'left'  
        valign: 'top'  
        bold: True  
        canvas.before:  
            Color:  
                rgba: 1, 1, 1, 1  
            Rectangle:  
                pos: self.pos  
                size: self.size  
    
    import kivy  
    from kivy.app import App  
    
    from kivy.uix.label import Label  
    from kivy.properties import ListProperty  
    from kivy.graphics import Color, Rectangle  
    from kivy.lang import Builder  
    
    with open("crea_kivy_file.kv", encoding='utf8') as f: 
        Builder.load_string(f.read())  
    
    class FormattedLabel(Label):  
        background_color = ListProperty()  
    
        def __init__(self, *args, **kwargs):  
            Label.__init__(self, *args, **kwargs)  
            self.canvas.add(Color(self.background_color))  
            self.canvas.add(Rectangle(pos=self.pos, size=self.size))  
            self.text_size= self.size  
            self.halign= 'left'  
            self.valign= 'top'  
            self.bold= True  
    
    FormattedLabel:  
        text: "some text"  
        color: (0, 0.2, .4, 1)  
        size_hint: 1, 0.04  
        background_color: 0,0,0,1  
    
    from kivy.clock import Clock
    
    ...
    
    class FormattedLabel(Label):  
        background_color = ListProperty()  
    
        def __init__(self, *args, **kwargs):  
            Label.__init__(self, *args, **kwargs)  
            Clock.schedule_once(lambda dt: self.initialize_widget(), 0.002)
    
        def initialize_widget(self):
            self.canvas.before.add(Color(self.background_color))  
            self.canvas.before.add(Rectangle(pos=self.pos, size=self.size))  
            self.text_size = self.size  
            self.halign = 'left'  
            self.valign = 'top'  
            self.bold = True