Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 访问kvlang中的Kivy布局大小_Python_Kivy_Typeerror_Nonetype_Kivy Language - Fatal编程技术网

Python 访问kvlang中的Kivy布局大小

Python 访问kvlang中的Kivy布局大小,python,kivy,typeerror,nonetype,kivy-language,Python,Kivy,Typeerror,Nonetype,Kivy Language,我有以下代码: from kivy.app import App from kivy.uix.boxlayout import BoxLayout class TestGUI(BoxLayout): pass class TestApp(App): def build(self): return TestGUI() if __name__ == '__main__': TestApp().run() 以及相应的.kv文件: #:kivy 1.

我有以下代码:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout


class TestGUI(BoxLayout):
    pass


class TestApp(App):
    def build(self):
        return TestGUI()


if __name__ == '__main__':
    TestApp().run()
以及相应的
.kv
文件:

#:kivy 1.9.1

<TestGUI>:
    temp_size: (0.5 * x for x in self.size)
    canvas.before:
        Color:
            rgba: (1, 0, 0, 1)
        Rectangle:
            size: self.temp_size
由于
kv
文件中的最后一行代码。声明
temp\u size
时,
self.size
似乎没有初始化,但这会引发一些问题

  • 如果它是
    NoneType
    对象,为什么在声明
    temp\u size
    时允许我遍历
    self.size

  • 另外,当我将最后一行替换为
    size:(0.5*x表示self.size中的x)
    而不是使用变量时,为什么代码工作得非常好

  • 另外,我如何避免这个问题,并根据
    self.size
    的值分配变量


    • 这里发生的基本情况是:

      [x for x in None]
      
      为什么你可以在这本书里读到。这是因为
      canvas
      还不可用,而且属性似乎是在创建之后计算的,因此-如果没有
      canvas
      ,那么value==垃圾

      要修复它,您必须像这样在画布本身中进行,而不是在属性外部,因为画布是先构建的:

      <TestGUI>:
          canvas.before:
              Color:
                  rgba: (1, 0, 0, 1)
              Rectangle:
                  size: (0.5 * x for x in self.size)
      

      是“根”而不是“自我”吗?在这种情况下,它们可以互换,但我想问的是一般情况。例如,如果
      TestGUI
      嵌套在
      BoxLayout
      中,那么它将是
      self.size
      。但是如果画布是在属性初始化之前构建的,那么为什么设置矩形的大小时,
      self.size
      不返回
      None
      ?@kooting我相信我错过了画布创建之前的一两个步骤。在画布创建之前,最有可能是righr,大小/pos/。。。属性对于画布本身是可用的,但我相信定制属性是在这之后创建的。但是,在画布中使用时,自定义属性也是在画布创建之前计算的,甚至是在画布的“size/pos/…”之前。。。是可用的(因此大小/pos/…为无)。这更有意义,但为什么在将
      temp\u size
      设置为
      [x代表x无]
      时没有错误?我只在将矩形的大小设置为
      temp\u size
      @Kootling时出错,因为属性的计算顺序不同。尝试使用on_*事件打印变量的值。
      <TestGUI>:
          canvas.before:
              Color:
                  rgba: (1, 0, 0, 1)
              Rectangle:
                  size: (0.5 * x for x in self.size)
      
      from kivy.app import App
      from kivy.lang import Builder
      from kivy.uix.boxlayout import BoxLayout
      from kivy.properties import ListProperty
      Builder.load_string('''
      <TestGUI>:
          canvas.before:
              Color:
                  rgba: (1, 0, 0, 1)
              Rectangle:
                  size: self.temp_size
      ''')
      
      
      class TestGUI(BoxLayout):
          temp_size = ListProperty([0, 0])
      
          def __init__(self, **kwargs):
              super(TestGUI, self).__init__(**kwargs)
              print(self.size)
              self.temp_size = [0.5 * x for x in self.size]
      
      
      class TestApp(App):
          def build(self):
              return TestGUI()
      
      
      if __name__ == '__main__':
          TestApp().run()