Изменение регистров текста в Kivy

Я пишу программу, в которой хочу изменить текст нескольких меток на верхний регистр. Но моя программа, кажется, меняет только последний текст на верхний регистр. Это моя программа. Здесь только c преобразуется в верхний регистр. a и b остаются в нижнем регистре. Где я ошибаюсь?

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.togglebutton import ToggleButton
from kivy.lang import Builder

Builder.load_string('''
<box>:
    ToggleButton:
        text: 'Caps Lock'
        on_state:
            if self.state == 'down': lol.text = lol.text.upper()
            elif self.state == 'normal': lol.text = lol.text.lower()

    Label:
        id: lol
        text: 'a'

    Label:
        id: lol
        text: 'b'

    Label:
        id: lol
        text: 'c'
''')

class box(BoxLayout):
    pass

class main(App):
    def build(self):
        return box()

if __name__ == "__main__":
    main().run()

person Parthib Biswas    schedule 17.04.2016    source источник


Ответы (1)


Свойства id уникальны в рамках правила. Вы переопределили его два раза. Я предлагаю дать каждой метке уникальный id и написать функцию (в box), которая устанавливает их содержимое либо в верхний, либо в нижний регистр.


Версия с циклом вместо присвоения каждой метке уникального id:

Builder.load_string('''
<Box>:
    toggle: toggle

    ToggleButton:
        id: toggle
        text: 'Caps Lock'
        on_state: root.change_labels()

    Label:
        text: 'a'

    Label:
        text: 'b'

    Label:
        text: 'c'
''')


class Box(BoxLayout):

    toggle = ObjectProperty()

    def change_labels(self):
        for child in self.children[:3]:
            if self.toggle.state == 'down':
                child.text = child.text.upper()
            else:
                child.text = child.text.lower()
person jligeza    schedule 17.04.2016
comment
Я знаю, что это один из способов сделать это, но есть ли для этого ярлык? Вам не кажется, что это будет много работы по копипасту? - person Parthib Biswas; 17.04.2016
comment
@ParthibBiswas Я отредактировал ответ с образцом кода, используя цикл. Могут быть и другие способы избежать использования магического числа 3, но этот самый короткий. - person jligeza; 17.04.2016