Kivy GridLayout 访问行和列返回无。
Posted
技术标签:
【中文标题】Kivy GridLayout 访问行和列返回无。【英文标题】:Kivy GridLayout accessing rows and cols returns None. 【发布时间】:2016-09-01 02:58:23 【问题描述】:我有以下代码:
class MyGridLayout(GridLayout):
def __init__(self, **kwargs):
super(MyGridLayout, self).__init__(**kwargs)
class Board(Widget):
my_layout = ObjectProperty(None)
def __init__(self, **kwargs):
super(Board, self).__init__(**kwargs)
def on_my_layout(self, instance, value):
print self.my_layout.cols
class MyApp(App):
def build(self):
return Board()
if __name__ == '__main__':
MyApp().run()
这是我的 kv 文件:
<Board>:
my_layout: my_layout
MyGridLayout:
id: my_layout
cols: 10
rows: 10
关于方法on_my_layout
我想打印我的MyGridLayout 实例有多少列。但是,它总是返回给我 None。如果我想访问行,它也返回 None 。为了访问MyGridLayout
的行和列的正确值,我必须对我的python 代码或我的kivy 语言进行哪些更改?它必须返回rows = 10
和cols = 10
。
【问题讨论】:
【参考方案1】:<Board>:
my_layout: my_layt ## This
MyGridLayout:
id: my_layt
cols: 10
rows: 10
它不起作用,因为您将不存在的小部件分配给ObjectProperty
,因此分配给YourObjectProperty.cols==None
。你基本上需要这样做:
<Board>:
MyGridLayout:
id: my_layt
cols: 10
rows: 10
my_layout: my_layt ## This
这将在 kv 中引发错误。但是,如果您在__init__()
中执行此操作,那么您的小部件已经在那里并且正在工作,它会毫无问题地打印它。 id 和 variable 不要使用相同的名称,否则可能根本不起作用。
class Board(Widget):
my_layout = ObjectProperty(None)
def __init__(self, **kwargs):
super(Board, self).__init__(**kwargs)
self.my_layout = self.ids.my_layt
【讨论】:
谢谢,它解决了我的问题。你能告诉我为什么方法on_my_layout
比 __init__
被首先调用吗?
@Caaarlos 不是方法,分配是第一位的。当您将 .py 中的 my_layout
更改为 ObjectProperty
时,将调用该方法,因此当您在 .kv 中为其分配某些内容时,它将运行您的 on_my_layout
并打印一些内容。这就是为什么您需要等到小部件初始化,然后将一个已初始化(存在)的小部件分配给一个变量,该变量将调用您的函数。我的回答中的第一个代码:my_layout: my_layt
时没有小部件。
谢谢,现在我知道我的代码发生了什么!以上是关于Kivy GridLayout 访问行和列返回无。的主要内容,如果未能解决你的问题,请参考以下文章
Kivy:为啥 ScrollView 不能在 GridLayout 中工作?