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