1

我正在使用 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下,还是因为我只是不知道如何正确编写它。在此先感谢您的帮助!

4

1 回答 1

0

问题

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

根本原因

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

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

解决方案

  1. 实现一个方法,initialize_widget()
  2. 替换canvas.addcanvas.before.add因为没有before关键字,文本将不可见。
  3. 在 Kivy 完成样式后,使用 Kivy Clockschedule_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  
于 2019-06-29T14:30:48.233 回答