首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Kivy ObjectProperty绑定到子小部件似乎不能在根小部件之外工作

将Kivy ObjectProperty绑定到子小部件似乎不能在根小部件之外工作
EN

Stack Overflow用户
提问于 2018-02-24 14:17:57
回答 3查看 1.2K关注 0票数 1

试着遵循这个指南:https://kivy.org/docs/guide/lang.html#accessing-widgets-defined-inside-kv-lang-in-your-python-code

我试图使用id定义访问一个小部件。这在根小部件中工作得很好,但在根小部件之外似乎不起作用。举个例子,下面是代表我的问题的最起码的代码:

GUI.kv文件:

代码语言:javascript
复制
<PlotBox@BoxLayout>:
graph2:graph2_id
BoxLayout:
    id:graph2_id

<RootWidget@BoxLayout>:
    graph:graph_id
    BoxLayout:
        id:graph_id
    PlotBox:

python文件:

代码语言:javascript
复制
#kivy imports
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.properties import ObjectProperty

class PlotBox(BoxLayout):
    graph2 = ObjectProperty(None)
    def __init__(self,**kwargs):
        super(PlotBox,self).__init__(**kwargs)
        self.graph2.add_widget(Button(text="This doesn't work"))

class RootWidget(BoxLayout):
    graph = ObjectProperty(None)
    def __init__(self,**kwargs):
        super(RootWidget,self).__init__(**kwargs)
        self.graph.add_widget(Button(text='This works'))

class GUIApp(App):
    def build(self):
        self.root = RootWidget()
        return self.root

if __name__ == "__main__":
    GUIApp().run()

我知道错误:

代码语言:javascript
复制
AttributeError: 'NoneType' object has no attribute 'add_widget'

在RootWidget上,即使我不使用图=ObjectProperty(无),它也能工作。在我的另一个小部件上,似乎没有创建id。

EN

Stack Overflow用户

回答已采纳

发布于 2018-02-24 16:32:52

根据文档

@字符用于将类名与要子类的类分隔开来。..。

根据得出的结论,在类似于python的.kv中进行继承是一种等效的方法,因此您应该只选择其中一种方式。这将使PlotBox从.py中永远不会被调用。

另一个错误,根据文档,我不知道是否是您的错误,但.kv必须是gui.kv,小写。

执行父构造函数后不直接加载子构造函数,因此将其添加到构造函数中可能会产生问题,在kivy中的一个建议和一个非常常见的做法是使用Clock

以上所述,我已在下列守则中实施:

gui.kv

代码语言:javascript
复制
<PlotBox>:
    graph2:graph2_id
    BoxLayout:
        id:graph2_id

<RootWidget>:
    graph:graph_id
    BoxLayout:
        id:graph_id
    PlotBox:

main.py

代码语言:javascript
复制
#kivy imports
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.properties import ObjectProperty
from kivy.clock import Clock

class PlotBox(BoxLayout):
    graph2 = ObjectProperty(None)
    def __init__(self,**kwargs):
        super(PlotBox,self).__init__(**kwargs)
        Clock.schedule_once(lambda dt: self.graph2.add_widget(Button(text="This now works")))

class RootWidget(BoxLayout):
    graph = ObjectProperty(None)
    def __init__(self,**kwargs):
        super(RootWidget,self).__init__(**kwargs)
        self.graph.add_widget(Button(text='This works'))

class GUIApp(App):
    def build(self):
        root = RootWidget()
        return root

if __name__ == "__main__":
    GUIApp().run()

输出:

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48963808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档