Kivy 添加控件错误

1 投票
1 回答
1755 浏览
提问于 2025-04-17 22:01

我的问题是,当我想运行上面的例子时,它不工作。发生的情况是,弹出窗口第一次出现时显示“test”,然后当我再次点击按钮时,它会显示错误:

File "/home/river/android-sdk/workplace/python-forandroid/build/pythoninstall/lib/python2.7/site-packages/kivy/uix/layout.py", line 76, in add_widget
File "/home/river/android-sdk/workplace/python-for-android/build/python-install/lib/python2.7/site-packages/kivy/uix/widget.py", line 314, in add_widget
kivy.uix.widget.WidgetException: Cannot add <kivy.uix.boxlayout.BoxLayout object at 0x60a25a78>, it already has a parent <kivy.uix.boxlayout.BoxLayout object at 0x60e2bae8>

我觉得原因是我每次点击后需要移除这个小部件。(我不知道怎么做)

 import kivy
 import kivy.uix.label
 import kivy.app
 import kivy.lang.builder
 textshow = BoxLayout()
 def answer(answer):
      text = Label(text=str(answer))
      textshow.add_widget(text)
 Builder.load_string('''
 <main>:
     Button: 
         on_release: root.show()
 ''')
 class main(BoxLayout):
      def show(self):
           answer("test")
           popup = Popup(content=textshow)
           popup.open()
 class apprun(App):
     def build(self):
         return main()
 apprun().run()

如果你回答这个问题,请给出完整的代码。

补充说明:这是一个示例脚本,我的真实脚本有两个类,Screen1和textshow = BoxLayout()类。

Inclements的回答有效,但每次点击按钮都会生成另一个textshow!请帮帮我!

1 个回答

3

一个简单的解决办法是把弹出窗口存起来,每次都用同一个。比如,你可以在你的 build 方法里写 self.popup = Popup(content=textshow),然后把你的 show 方法改成 App.get_running_app().popup.open()。这样每次打开的都是你保存的那个弹出窗口,就不会出现问题了。

撰写回答