【发布时间】:2018-02-24 14:17:57
【问题描述】:
尝试遵循本指南: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 上,即使我不使用 graph = ObjectProperty(None),它也可以工作。 在我的另一个小部件上,好像没有创建 id。
【问题讨论】:
-
这里有一个问题,您是否试图影响 PlotBox 的 CLASS 以便所有未来的 PlotBox 都将添加一个 Button 或只是根小部件上的 PlotBox 的一个实例?
-
@AlexAndDraw 只是根小部件上 PlotBox 的一个实例。我最初有另一个带有另一个小部件的 PlotBox 实例,但现在没有了。我添加的小部件实际上是一个“FigureCanvasKivyAgg”(来自 matplotlib garden 模块),我认为不能通过 kv 添加,但我在示例中使用了 Button,因为它更清晰,最终结果相同。
标签: python kivy kivy-language