试着遵循这个指南:https://kivy.org/docs/guide/lang.html#accessing-widgets-defined-inside-kv-lang-in-your-python-code
我试图使用id定义访问一个小部件。这在根小部件中工作得很好,但在根小部件之外似乎不起作用。举个例子,下面是代表我的问题的最起码的代码:
GUI.kv文件:
<PlotBox@BoxLayout>:
graph2:graph2_id
BoxLayout:
id:graph2_id
<RootWidget@BoxLayout>:
graph:graph_id
BoxLayout:
id:graph_id
PlotBox:python文件:
#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()我知道错误:
AttributeError: 'NoneType' object has no attribute 'add_widget'在RootWidget上,即使我不使用图=ObjectProperty(无),它也能工作。在我的另一个小部件上,似乎没有创建id。
发布于 2018-02-24 16:32:52
根据文档
@字符用于将类名与要子类的类分隔开来。..。
根据得出的结论,在类似于python的.kv中进行继承是一种等效的方法,因此您应该只选择其中一种方式。这将使PlotBox从.py中永远不会被调用。
另一个错误,根据文档,我不知道是否是您的错误,但.kv必须是gui.kv,小写。
执行父构造函数后不直接加载子构造函数,因此将其添加到构造函数中可能会产生问题,在kivy中的一个建议和一个非常常见的做法是使用Clock。
以上所述,我已在下列守则中实施:
gui.kv
<PlotBox>:
graph2:graph2_id
BoxLayout:
id:graph2_id
<RootWidget>:
graph:graph_id
BoxLayout:
id:graph_id
PlotBox:main.py
#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()输出:

https://stackoverflow.com/questions/48963808
复制相似问题