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
не могли бы вы сказать мне причину?
Одним из основных преимуществ kv является возможность отделить логику вашего приложения от пользовательского интерфейса. Ваша логика должна соответствовать определениям ваших классов и быть привязана к методам, которыми обладают эти классы. kv - это просто средство структурирования вашего пользовательского интерфейса для использования возможностей этих классов. Из вашего вопроса видно, что вы хотите создать много ярлыков в GridLayout, это легко достигается со стороны Python. Просто создайте там виджеты в цикле for, поскольку ваша переменная businfolist
уже находится там.
@ rahlf23 Я согласен с вашим комментарием о преимуществах интерфейса и логики, но в коде вопроса указывается на создание интерфейса, а не на логику.
#:import Label kivy.uix.label.Label
on_parent
для выполнения цикла for в файле kvThere 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).
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)))
'''))
Думаю, ваш ответ правильный, мне просто интересно, почему именно on_parent
?
@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).
@JohnAnderson Я понимаю on_property
, но мой вопрос заключается в том, зачем именно использовать свойство parent
?
Я настоятельно рекомендую сохранить всю вашу логику в сценарии Python и зарезервировать файл .kv для структуры и макета пользовательского интерфейса.