Kivy. Настройка цвета для интерфейса и серверной части в одной переменной

#kivy

#kivy

Вопрос:

Я ищу способ установить цвета для интерфейса и серверной части в одном месте. Пусть это будет словарь, как в приведенном ниже коде. Когда я запускаю программу, я не хочу, чтобы она устанавливала цвета для kv строки, не требуя, чтобы она жестко кодировала ее в этой строке как #:set main_bcolor hex('#f4f8fb') . Если это возможно, это было бы очень полезно и чисто, поскольку мне не нужно повторять определения цвета.

код

 from kivy.config import Config

Config.set('graphics', 'multisamples', '0')
Config.set('graphics', 'width', '1280')
Config.set('graphics', 'height', '720')

from kivy.utils import get_color_from_hex
from kivy.app import App
from kivy.lang.builder import Builder


colors = {
    'main_bcolor' : get_color_from_hex('#f4f8fb'),
    'active_bcolor': get_color_from_hex('#cde2fc')
}

kv = """

<Dir@BoxLayout>
    orientation: 'vertical'
    canvas.before:
        Color:
            rgba: (0, 0, 0, 1)  if main_bcolor is None else main_bcolor
        Rectangle:
            pos: self.pos
            size: self.size
Dir:

"""

class RemoteDir(App):
    def build(self):

        for color in colors.items():
            print('Setting color for frontend and backend', color[0], color[1])

        return Builder.load_string(kv)

if __name__ == '__main__':
    RemoteDir().run()
 

Ответ №1:

Удобный способ сделать это — создать a DictProperty , на который можно ссылаться в ‘kv’:

 from kivy.config import Config
from kivy.properties import DictProperty

Config.set('graphics', 'multisamples', '0')
Config.set('graphics', 'width', '1280')
Config.set('graphics', 'height', '720')

from kivy.utils import get_color_from_hex
from kivy.app import App
from kivy.lang.builder import Builder

kv = """
<Dir@BoxLayout>
    orientation: 'vertical'
    canvas.before:
        Color:
            rgba: app.colors['main_bcolor']
        Rectangle:
            pos: self.pos
            size: self.size
Dir:
"""

class RemoteDir(App):
    colors = DictProperty({
        'main_bcolor' : get_color_from_hex('#f4f8fb'),
        'active_bcolor': get_color_from_hex('#cde2fc')
    })

    def build(self):
        return Builder.load_string(kv)

if __name__ == '__main__':
    RemoteDir().run()