2016-11-07 3 views
1

Мне нужно поставить if в on_press событие, но мой компилятор не пропускает этот код. В нем говорится, что у меня слишком много уровней отступов. Я что-то упустил? Правильно ли я поступаю? Как это работает? Если это ошибка, как я могу ее избежать? Эта ошибка появляется для меня как на 1.9.1, так и на 1.9.0 Kivy.Слишком много уровней отступов в on_press (кнопка)

main.py

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.button import Button 

Builder.load_string(''' 
#:set some_data 'text' 
#:set Condition True 

<MyClass>: 
    text: 'Some text' 
    on_press: 
     if Condition: 
      root.doSomething() 
      root.DoSomething(some_data) 
''') 

class MyClass(Button): 
    def DoSomething(*args): 
     pass #not actually doing anything 

class MyApp(App): 

    def build(self): 
     return MyClass() 

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

выход киловольт

Traceback (most recent call last): 
File "file.py", line 15, in <module> 
''') 
File "C:\Python27\lib\site-packages\kivy\lang.py", line 1889, in load_string 
parser = Parser(content=string, filename=fn) 
File "C:\Python27\lib\site-packages\kivy\lang.py", line 1264, in __init__ 
self.parse(content) 
File "C:\Python27\lib\site-packages\kivy\lang.py", line 1366, in parse 
objects, remaining_lines = self.parse_level(0, lines) 
File "C:\Python27\lib\site-packages\kivy\lang.py", line 1540, in parse_level 
'Invalid indentation (too many levels)') 
kivy.lang.ParserException: Parser: File "<inline>", line 8: 
... 
     7:  on_press: 
     8:    if Condition: 
>> 9:      root.doSomething() 
     10:      root.DoSomething(some_data) 
... 
Invalid indentation (too many levels) 

Это работает, если я помещаю if прямо на той же строке:

on_press: if Condition: DoSomething() 

, но я могу толькоиспользование один действие после if так как есть.

ответ

2

Это потому, что оно не реализовано. По крайней мере, не так, как вы думаете, что это сработает. Это также указывает на то, что вы должны перенести логику непосредственно на Python. Слишком много блоков кода, в основном такие вещи, как в файле kv, станут беспорядочными. Это похоже на хороший способ для будущего кода, иначе вам понадобится только файл kv, и это не оптимально для профилирования, печати и других курсивных методов, которые вы делаете с файлом .py во время кодирования.

.kv файлы в основном используются для компоновки и немного логики, что было бы просто раздражать, чтобы писать в python, например. с частичными, методы с аргументом (un) упаковки и так далее. Я думаю, что язык по-прежнему нуждается в небольшой работе, и это можно считать ошибкой (если язык поддерживает такие блоки), но вы можете работать с ним неплохо даже без целого блока if-else.

E.g. как это:

Button: 
    text: 'a' 
    on_press: 
     if self.text == 'a': print 'It is A!'; print 'Sure it is!' 
     else: print 'No.' 

Хороший старый ; приходит на помощь, и вы можете поставить там, сколько строк вы хотите.

Смежные вопросы