Как создать собственный класс Kivy Label с форматированием в python? - PullRequest
1 голос
/ 22 июня 2019

Я пишу настольное приложение, используя 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, чтобы добавить к нему все нужные мне форматирования, а затем просто изменить метку для FormattedLabel в файле kivy.

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  

Kivy-файл

FormattedLabel:  
    text: "some text"  
    color: (0, 0.2, .4, 1)  
    size_hint: 1, 0.04  
    background_color: 0,0,0,1  

Но он не дал таких же результатов, как мой исходный код: 1. Размер прямоугольника равенвыкл (уже и выше), чтобы буквы больше не помещались по прямой линии.Я не знаю, как связать размер прямоугольника с size_hint в файле kivy.2. Цвет этикетки не меняется.Я не знаю, так ли это, потому что код не должен быть под init или потому что я просто не понимаю, как правильно его написать.Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 29 июня 2019

Проблемы

  1. Размер прямоугольника отключен (уже и выше), поэтому буквы больше не помещаются на прямой линии.Я не знаю, как связать размер прямоугольника с size_hint в файле kivy.
  2. Цвет метки не меняется.Я не знаю, так ли это, потому что код не должен быть инициализирован или потому что я просто не понимаю, как правильно его написать.

Основная причина

Результат не такой, как ожидалось, потому что Kivy еще не завершил свой дизайн.Например, размер прямоугольника отключен, поскольку он использует размер виджета по умолчанию, т. Е. (100, 100).

Функция load_kv() вызывается из run () , поэтому любой виджет, стиль которого определен в этом файле kv и создан до вызова run () (например, в __init__), не будет иметь егоприменяется укладка.Обратите внимание, что build () вызывается после вызова load_kv .

Решение

  1. Реализация метода, initialize_widget()
  2. Замените canvas.add на canvas.before.add, потому что без ключевого слова before текст не будет виден.
  3. Используйте метод Kivy Clock schedule_once() длявызовите функцию initialize_widget() после завершения стиля Kivy.

Snippets

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  
...