无效的属性名称 - Kivy python

时间:2017-08-21 23:56:52

标签: kivy kivy-language

tuto.py

import kivy
kivy.require('1.9.0')

from kivy.app import App
from kivy.uix.widget import Widget

class CustomWidget(Widget):
    pass

class CustomWidgetApp(App):
    def build(self):
        return CustomWidget()

customwidget = CustomWidgetApp()
customwidget.run()

customwidget.kv

<CustButton@Button>:
    font_size: 32
    color: 0, 0, 0, 1
    size: 150, 50
    background_normal: ''
    background_down: 'bt-down.png'
    background_color: .88, .88, .88, 1

    <CustomWidget>:
        CustButton:
            text: "Random"
            pos: root.x, 200

        CustButton:
            text: "Buttom"
            pos: 200, root.y

        CustButton:
            text: "Buttom"
            pos: 200, 400

我运行此代码后立即收到此错误:

 ...
       7:    background_color: .88, .88, .88, 1
       8:
 >>    9:    <CustomWidget>:
      10:        CustButton:
      11:            text: "Random"
 ...
 Invalid property name

3 个答案:

答案 0 :(得分:3)

问题是由于kv文件中的缩进造成的。

main.py

sess.run

customwidget.kv

from kivy.app import App
from kivy.uix.widget import Widget


class CustomWidget(Widget):
    pass


class CustomWidgetApp(App):

    def build(self):
        return CustomWidget()


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

答案 1 :(得分:0)

这种压抑是错误的。这就是它应该是这样的:

<强> customwidget.kv

<CustButton@Button>:
    font_size: 32
    color: 0, 0, 0, 1
    size: 150, 50
    background_normal: ''
    background_down: 'bt-down.png'
    background_color: .88, .88, .88, 1

<CustomWidget>:
    CustButton:
        text: "Random"
        pos: root.x, 200

    CustButton:
        text: "Buttom"
        pos: 200, root.y

    CustButton:
        text: "Buttom"
        pos: 200, 400

答案 2 :(得分:0)

让我们看一下KV文件的开头。你有一个规则<CustButton@Button>:,里面有一些属性。然后是<CustomWidget>:的事情。从第一眼看来,我觉得它只是一个错误的缩进,如上所述,但让我们看看为什么错误是property

KV语言解析器检查on_语法。如果不存在,则缩进项可以是属性或Widget(或从其继承的类)。解析器检查<CustomWidget>:是否是可以添加为子节点的实例。

  • 它没有,它无法继续

它检查它是否属于某个属性,或者更好地说是否<CustomWidget>:类中有一些名为CustButton的属性。

  • 再次,它不是

所以,它不是一个事件,Widget实例甚至是Kivy属性。那么,让我们抛出一个关于未知项目的错误然后:)

<CustButton@Button>:
    font_size: 32
    color: 0, 0, 0, 1
    size: 150, 50
    background_normal: ''
    background_down: 'bt-down.png'
    background_color: .88, .88, .88, 1

    <CustomWidget>:  # boom
        CustButton:
            text: "Random"
            pos: root.x, 200

        CustButton:
            text: "Buttom"
            pos: 200, root.y

        CustButton:
            text: "Buttom"
            pos: 200, 400

您可以检查缩进是否良好(即,您是否要声明CustomWidget规则而不是将其添加为子项)。如果是这种情况,您只能在第一级定义规则,因此<Rule>:之前不得有任何空格或制表符。

如果您想将其添加为孩子,那么您首先会错过窗口小部件的声明。您应该从<>中删除括号(<CustomWidget>),然后在<CustButton@Button>:

之上预先创建一个规则
<CustomWidget>:
    # empty

<CustButton@Button>:
    font_size: 32
    color: 0, 0, 0, 1
    size: 150, 50
    background_normal: ''
    background_down: 'bt-down.png'
    background_color: .88, .88, .88, 1

    CustomWidget:
        CustButton:  # boom with AssertionError
            text: "Random"
            pos: root.x, 200

        CustButton:
            text: "Buttom"
            pos: 200, root.y

        CustButton:
            text: "Buttom"
            pos: 200, 400

Parser也不喜欢它,因为你使用了你自己内部声明的规则。因此,您应该将此示例中的CustButton切换为您已经可以使用的内容。例如。 Button