【问题标题】:Invalid property name - Kivy python无效的属性名称 - Kivy python
【发布时间】:2017-08-21 23:56:52
【问题描述】:

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

【问题讨论】:

  • 您好,您的帖子似乎主要包含代码。你能包括更多细节吗?例如,这段代码应该做什么?你希望得到什么输出?您对错误有什么了解?这是您自己的代码还是您从某个地方复制它?

标签: kivy kivy-language


【解决方案1】:

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

main.py

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

customwidget.kv

#:kivy 1.10.0

<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>:
    font_size: 32
    color: 0, 0, 0, 1
    size: 150, 150
    background_color: 0.88, 0.88, 0.88, 1
    CustButton:
        text: "Random"
        pos: root.x, 200
    CustButton:
        text: "Buttom"
        pos: 200, root.y
    CustButton:
        text: "Buttom"
        pos: 200, 400

【讨论】:

    【解决方案2】:

    缩进是错误的。它应该是这样的:

    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
    

    【讨论】:

      【解决方案3】:

      让我们看看KV文件的开头。你有一个规则&lt;CustButton@Button&gt;:,里面有一些属性。然后是&lt;CustomWidget&gt;:。乍一看,这只是上面建议的错误缩进,但是让我们看看为什么错误是关于property

      KV 语言解析器检查on_ 语法。如果不存在,那么缩进的项目可以是属性或Widget(或从它继承的类)。解析器检查 &lt;CustomWidget&gt;: 是否是一个可以添加为子实例的实例。

      • 不是,也无法继续

      它检查它是否是一个属性,或者更好的说法是在CustButton 类中是否有一些名为&lt;CustomWidget&gt;: 的属性。

      • 再说一遍,不是

      所以,它不是一个事件、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 规则而不是将其添加为子规则)。如果是这种情况,您只能在第一级定义规则,因此&lt;Rule&gt;: 之前不能有任何空格或制表符。

      如果您想将其添加为子项,那么您首先缺少小部件的声明。您应该从&lt;CustomWidget&gt; 中删除方括号(&lt;&gt;)并事先为其创建一个规则,让我们在&lt;CustButton@Button&gt;: 上方说

      <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
      

      解析器也不喜欢它,因为您使用了您在其内部声明的规则。因此,您应该将本示例中的CustButton 切换为您已经可以使用的东西。例如。 Button

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-21
        • 1970-01-01
        • 2018-01-18
        • 2021-10-07
        • 2016-01-14
        相关资源
        最近更新 更多