Обновите текстовую переменную Kivy с помощью StringpPoperty и ID - PullRequest
0 голосов
/ 27 мая 2019

Так что моя проблема в том, как обновить текст до метки. Должен ли я использовать id: s в свойстве файла и строки KV или есть какой-то другой способ?

Main.Py

    print_label = StringProperty()

    print_label = lyrics

class MyApp(App):
    def build(self):
        Window.clearcolor = (.13, .13, .13, 1)
        return MyFloatLayout()```
my.kv
```<Button>:
    font_size: 40
    color: 0.1,0.5,0.6,1
    size_hint: 0.3, 0.1



<FloatLayout>:
    print_label: print_label

    Label:
        pos_hint:{"top":1}
        id: print_label
        text: ""


    Button:
        pos_hint:{"bottom":1}
        text: "RE-SEARCH"
        font_size: 10
        on_press: root.btn()

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Проблема - обновить текст метки

как обновить текст до метки. Должен ли я использовать id: s в файле KV и строке собственность или есть еще какой нибудь способ?

Решение

Есть три варианта решения проблемы.

Вариант 1 - Использование ids

Преимущества использования ids в том, что приложение меньше, т. Е. Меньше используется кодирование и атрибуты.

Идентификатор является слабой ссылкой на виджет, а не на сам виджет. Как Как следствие, сохранение идентификатора недостаточно для сохранения виджета от быть мусором.

...

self.ids метод очень лаконичен.

Snippets - py file

class FloatLayout(FloatLayout):
    ...
    self.ids.print_label.text = lyrics

Фрагменты - файл kv

<FloatLayout>:

    Label:
        pos_hint:{"top":1}
        id: print_label
        text: ""

Вариант 2 - Использование Stringproperty

Атрибут типа Stringproperty создает событие, при котором при изменении значения атрибута все свойства, ссылающиеся на этот атрибут, автоматически обновляются.

Фрагменты - файл py

class FloatLayout(FloatLayout):
    print_label = StringProperty('')
    ...
    self.print_label = lyrics

Фрагменты - файл kv

<FloatLayout>:

    Label:
        pos_hint:{"top":1}
        text: root.print_label

Вариант 3 - Использование Objectproperty

Использование Objectproperty для связывания виджета Label, также требует id, объявленного в файле kv.

Хотя метод self.ids очень лаконичен, он обычно считается «наилучшей практикой» для использования ObjectProperty. Это создает прямая ссылка, обеспечивает более быстрый доступ и является более явным.

Snippets - файл py

class FloatLayout(FloatLayout):
    print_label = ObjectProperty(None)
    ...
    self.print_label.text = lyrics

Фрагменты - файл kv

<FloatLayout>:
    print_label: print_label

    Label:
        pos_hint:{"top":1}
        id: print_label
        text: ""
0 голосов
/ 27 мая 2019

Вам нужно решить, хотите ли вы, чтобы print_label было StringProperty или ObjectProperty.В настоящее время вы используете ObjectProperty в kv и StringProperty в python.
Если вы хотите использовать StringProperty, вы можете установить его непосредственно для атрибута text.text = root.print_label.Если вы используете его как ObjectProperty, вы привязываете его к объекту.И вы можете получить доступ к свойствам объектов, таких как текст, print_label.text = "something".Так что вам нужно выбрать то, что вы хотите print_label.

...