如何在 python 中使用格式化创建自定义 Kivy 标签类?

Posted

技术标签:

【中文标题】如何在 python 中使用格式化创建自定义 Kivy 标签类?【英文标题】:How to create a custom Kivy Label Class with formatting in python? 【发布时间】:2019-11-05 05:16:16 【问题描述】:

我正在使用 kivy 编写一个桌面应用程序,但它的运行速度没有我希望的那么快。我有很多标签和按钮,它们有很多格式,只是颜色和大小不同。我希望如果我创建一个带有格式的自定义 kivy 标签将提高性能。我已经有了所有带有格式的标签,我希望将它们全部更改为我的自定义 kivy 标签。

kivy 文件中的原始代码。这是我所有标签的样子。

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  

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

Python 文件

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  

但它产生的结果与我的原始代码不同: 1.矩形的大小是关闭的(更窄和更高),所以字母不再适合直线。我不知道如何将矩形的大小绑定到 kivy 文件中的 size_hint。 2、标签颜色不变。 我不知道是不是因为代码不应该在 init 下,还是因为我只是不知道如何正确编写它。在此先感谢您的帮助!

【问题讨论】:

“但它产生的结果与我的原始代码不同。” 抱歉不具体!是的,矩形的大小不合适,但画布颜色也没有改变,它始终是白色的。 我认为您的问题是,当您在 Python 中执行 Widget 属性时,您不会获得在 kv 中执行相同操作所产生的额外功能。在FormattedLabel__init__() 方法中,用于sizeposbackground_color 的值是执行__init__() 方法时的值,对这些属性的任何更改都将无效(所有这些属性都在__init__ 之后更改)。您可以设置绑定以反映这些属性的更改(这是 kv 为您所做的)。 【参考方案1】:

问题

    矩形的大小已关闭(更窄和更高),因此字母不再适合直线。不知道怎么绑定 矩形的大小到 kivy 文件中的 size_hint。 标签的颜色没有改变。我不知道是因为代码不应该在 init 下还是因为我不是 了解如何正确编写它。

根本原因

结果不如预期,因为 Kivy 还没有完成它的造型。例如,矩形的大小是关闭的,因为它使用的是小部件的默认大小,即 (100, 100)。

load_kv() 函数是从run() 调用的,因此, 其样式在此 kv 文件中定义并创建的任何小部件 在调用run() 之前(例如在__init__ 中),不会有它的样式 应用。请注意,build() 是在 load_kv 被调用之后调用的 调用。

解决方案

    实现一个方法,initialize_widget()canvas.add 替换为canvas.before.add,因为没有before 关键字,文本将不可见。 在 Kivy 完成样式设置后,使用 Kivy Clock schedule_once() 方法调用 initialize_widget() 函数。

片段

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  

【讨论】:

以上是关于如何在 python 中使用格式化创建自定义 Kivy 标签类?的主要内容,如果未能解决你的问题,请参考以下文章

Python日志记录使用自定义格式加密

如何强制Python XlsxWriter以自定义格式写入单元格

使用 Python 解析这个自定义 Twitter 捕获数据并创建统计信息

如何自定义 Python 日志记录的时间格式?

如何使用 python 请求模块创建自定义标头

Python:如何在创建 RecycleView 时访问自定义参数?