Могу ли я использовать оператор for в файле .kv?

GridLayout:
    cols:
    rows: root.numberoflist

    for i in range(root.businfolist): 
        Label:
            font_name: 'C:/Windows/Fonts/HYWULM'
            text_size: cm(2), cm(2)
            pos: self.pos
            id: my_custom_label
            text: root.businfolist[0]
            color: [255,255,255,1]

.kv файл

я хочу использовать FOR STATEMENT в .kv файл, и я увидел

https://kivy.org/docs/api-kivy.lang.html?highlight=statement

эта страница, но я не понимаю.

Я думаю, что отступы кажутся неправильными. что не так с этим кодом?

трассировка здесь, спасибо, что прочитали мой вопрос.

 Traceback (most recent call last):
   File "C:/Users/mg/Desktop/Tubuc/TubucTest.py", line 58, in <module>
     class Bus_Information(Screen):
   File "C:/Users/mg/Desktop/Tubuc/TubucTest.py", line 60, in Bus_Information
     Builder.load_string(f.read())
   File "C:\Users\mg\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 368, in load_string
     parser = Parser(content=string, filename=fn)
   File "C:\Users\mg\Anaconda3\lib\site-packages\kivy\lang\parser.py", line 392, in __init__
     self.parse(content)
   File "C:\Users\mg\Anaconda3\lib\site-packages\kivy\lang\parser.py", line 501, in parse
     objects, remaining_lines = self.parse_level(0, lines)
   File "C:\Users\mg\Anaconda3\lib\site-packages\kivy\lang\parser.py", line 605, in parse_level
     level + 1, lines[i:], spaces)
   File "C:\Users\mg\Anaconda3\lib\site-packages\kivy\lang\parser.py", line 615, in parse_level
     'Invalid property name')
 kivy.lang.parser.ParserException: Parser: File "<inline>", line 28:
 ...
      26:       rows: root.numberoflist
      27:       
 >>   28:       for i in range(root.businfolist): 
      29:           Label:
      30:               font_name: 'C:/Windows/Fonts/HYWULM'
 ...
 Invalid property name

Я настоятельно рекомендую сохранить всю вашу логику в сценарии Python и зарезервировать файл .kv для структуры и макета пользовательского интерфейса.

rahlf23 10.08.2018 17:17

не могли бы вы сказать мне причину?

m0f1us 10.08.2018 17:38

Одним из основных преимуществ kv является возможность отделить логику вашего приложения от пользовательского интерфейса. Ваша логика должна соответствовать определениям ваших классов и быть привязана к методам, которыми обладают эти классы. kv - это просто средство структурирования вашего пользовательского интерфейса для использования возможностей этих классов. Из вашего вопроса видно, что вы хотите создать много ярлыков в GridLayout, это легко достигается со стороны Python. Просто создайте там виджеты в цикле for, поскольку ваша переменная businfolist уже находится там.

rahlf23 10.08.2018 17:57

@ rahlf23 Я согласен с вашим комментарием о преимуществах интерфейса и логики, но в коде вопроса указывается на создание интерфейса, а не на логику.

eyllanesc 10.08.2018 18:31
0
4
3 630
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Добавить оператор импорта, #:import Label kivy.uix.label.Label
  2. Используйте событие on_parent для выполнения цикла for в файле kv

Действительные выражения

There are two places that accept python statements in a kv file: after a property, which assigns to the property the result of the expression (such as the text of a button as shown above) and after a on_property, which executes the statement when the property is updated (such as on_state).

main.py

from kivy.lang import Builder
from kivy.base import runTouchApp

runTouchApp(Builder.load_string('''
#:kivy 1.11.0
#:import Label kivy.uix.label.Label

GridLayout:
    cols: 3
    on_parent:
        for i in range(10): txt = "Label {0}".format(i); self.add_widget(Label(text = txt, text_size=(cm(2), cm(2)), pos=self.pos,
        id=txt, color=(1,1,1,1)))
'''))

Выход

Img01

Думаю, ваш ответ правильный, мне просто интересно, почему именно on_parent?

eyllanesc 10.08.2018 18:35

@eyllanesc, согласно руководству по языку Kivy: There are two places that accept python statements in a kv file: after a property, which assigns to the property the result of the expression (such as the text of a button as shown above) and after a on_property, which executes the statement when the property is updated (such as on_state).

John Anderson 10.08.2018 18:46

@JohnAnderson Я понимаю on_property, но мой вопрос заключается в том, зачем именно использовать свойство parent?

eyllanesc 10.08.2018 18:48

Другие вопросы по теме