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 = 10cols = 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 中工作?

Kivy:BoxLayout 与 GridLayout

如何访问选择查询的行和列[关闭]

Kivy:GridLayout 中的按钮有间隙

如何使用 kv 文件刷新 Kivy 中的 GridLayout

分配并返回一个二维数组指针,其中行和列是运行时参数