Получите доступ к kivy виджетам из кода Python, используя динамические идентификаторы - PullRequest
0 голосов
/ 02 июня 2018

У меня есть файл kv с несколькими виджетами, их ID являются числами (в строковом представлении).Допустим, это числа от 1 до 10.

Можно ли каким-то образом получить доступ к этим виджетам из Python с помощью цикла, используя их идентификатор в вызове метода (который является целым числом в строковой форме) вместо явного использования имени идентификатора?Например, (в качестве иллюстрации, это на самом деле не работает), я хотел бы использовать что-то вроде:

for i in range (1, 11)
    self.root.ids.str(i).text = str(i*5)

вместо:

self.root.ids.1.text = str(5)
self.root.ids.2.text = str(10)
self.root.ids.3.text = str(15)
... etc

Причина в том, что этот список виджетовможет стать большим.Также диапазоны (срезы), к которым я хочу получить доступ, могут варьироваться.

1 Ответ

0 голосов
/ 02 июня 2018

Для этого случая вы можете использовать getattr:

test.kv

BoxLayout:
    orientation: "vertical"
    Label:
        id: 1
    Label:
        id: 2
    Label:
        id: 3
    Label:
        id: 4
    Label:
        id: 5
    Button:
        text: "press me"
        on_press: app.testFn()

main.py

from kivy.app import App

class TestApp(App):
    def testFn(self):
        for i in range(1, 6):
            getattr(self.root.ids, str(i)).text = str(5*i)

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

Или воспользуйтесь тем, что self.ids - это словарь, в котором ключом является идентификатор, а значением - виджет.

from kivy.app import App

class TestApp(App):
    def testFn(self):
        for i in range(1, 6):
            self.root.ids[str(i)].text = str(5*i)

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

Примечание: Имейте в виду, что в прошлом для self.ids[] должна быть строка.

Обновление:

Расчет.KV

BoxLayout:

    CustomLabel1:
        id: 1

    CustomLabel2:
        id: 2

    CustomLabel3:
        id: 3

    CustomLabel4:
        id: 4

    CustomLabel5:
        id: 5

    Button:
        text: "Calculate values"
        on_press: app.calculate_values(2,4)

<CustomLabel1@Label>:
<CustomLabel2@Label>:
<CustomLabel3@Label>:
<CustomLabel4@Label>:
<CustomLabel5@Label>:

main.py

from kivy.app import App

class TestApp(App):
    def calculate_values(self, start, end):
        for i in range(start, end):
            self.root.ids[str(i)].text = str(5*i)

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