on_press中的缩进级别太多(按钮)

时间:2016-11-07 17:25:13

标签: python kivy kivy-language

我需要将if块放入on_press事件中,但我的编译器不会让这段代码继续存在。它说我的压痕水平太多了。我错过了什么?我做对了吗?这是如何运作的?如果它是一个bug,我怎么能避免它呢?我在1.9.1和1.9.0 Kivy上都出现了这个错误。

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()

kv输出

 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之后使用一个操作。

1 个答案:

答案 0 :(得分:2)

那是因为它没有实现。至少不是你认为它的工作方式。它还表明您应该将逻辑直接移动到Python。代码块过多,主要是kv文件中的这类代码会变得混乱。对于未来的代码而言,这似乎是一种好方法,否则您只需要kv个文件,并且这不适合用于分析,打印以及您对{.py执行的其他变形方法编码时{1}}文件。

.kv文件主要用于布局设计和一些逻辑,只是在python中编写时很烦人,例如with partials,带参数(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.'

好老;来救援,你可以自由地把你想要多少行。