如何在python中创建具有格式的自定义Kivy标签类?
我正在用kivy编写一个桌面应用程序,但它的运行速度并没有我希望的那么快。我有很多标签和按钮,有很多格式,只是颜色和大小不同。我希望,若我创建一个已经有格式的定制kivy标签,它将提高性能。我已经有了我所有的标签和格式,我想把它们都改成我的定制kivy标签 kivy文件中的原始代码。这是我所有标签的样子。 所以我尝试创建一个FormattedLabel类来添加我想要的所有格式,然后在kivy文件中更改FormattedLabel的标签 Python文件 奇维锉刀如何在python中创建具有格式的自定义Kivy标签类?,python,formatting,label,kivy,Python,Formatting,Label,Kivy,我正在用kivy编写一个桌面应用程序,但它的运行速度并没有我希望的那么快。我有很多标签和按钮,有很多格式,只是颜色和大小不同。我希望,若我创建一个已经有格式的定制kivy标签,它将提高性能。我已经有了我所有的标签和格式,我想把它们都改成我的定制kivy标签 kivy文件中的原始代码。这是我所有标签的样子。 所以我尝试创建一个FormattedLabel类来添加我想要的所有格式,然后在kivy文件中更改FormattedLabel的标签 Python文件 奇维锉刀 但它没有产生与我的原始代码相同的
但它没有产生与我的原始代码相同的结果: 1.矩形的大小已关闭(越窄越高),因此字母不再适合于直线。我不知道如何将矩形的大小绑定到kivy文件中的size_提示。 2.标签的颜色不变。 我不知道这是因为代码不应该在init下,还是因为我不知道如何正确地编写它。提前感谢您的帮助 问题
\uuuu init\uuu
中),将不具有其样式
应用注意,在已被调用之后调用
打电话来
解决方案
initialize\u widget()
canvas.add
替换为canvas.before.add
,因为如果没有before
关键字,文本将不可见初始化\u widget()
函数\uuuu init\uuu
中),将不具有其样式
应用注意,在已被调用之后调用
打电话来
解决方案
initialize\u widget()
canvas.add
替换为canvas.before.add
,因为如果没有before
关键字,文本将不可见初始化\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