如果未动态添加,如何正确删除Kivy中的小部件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果未动态添加,如何正确删除Kivy中的小部件相关的知识,希望对你有一定的参考价值。

[对于类似我的情况,我有很多答案:如果我使用“ .add_widget()”函数在代码中添加了一个小部件,以后我可以使用“ .remove_widget()”函数删除该小部件。

我的情况有些不同:我正在尝试删除配置文件中添加的屏幕中的按钮(该按钮没有单独的kv文件,因为我仍在进行一些研究以充分理解其下的机理。 Kivy)。

我正在尝试删除“ MenuScreen”屏幕中ID为“ setBtn”的按钮。我尝试了几种方法来做到这一点,但没有人为我工作。

我什至不确定是否有解决方案可以删除尚未动态添加到父窗口小部件的窗口小部件...

我将代码留给您,如果有人可以帮助我,我将非常感激。

谢谢。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

# Create both screens. Please note the root.manager.current: this is how
# you can control the ScreenManager from kv. Each screen has by default a
# property manager that gives you the instance of the ScreenManager used.
Builder.load_string("""
<MenuScreen>:
    BoxLayout:
        Button:
            id: 'setBtn'
            text: 'Goto settings'
            on_press: root.manager.current = 'settings'
        Button:
            text: 'Quit'
            on_press: root.remove_settings()
<SettingsScreen>:
    BoxLayout:
        Button:
            text: 'My settings button'
        Button:
            text: 'Back to menu'
            on_press: root.manager.current = 'menu' 
""")

# Declare both screens
class MenuScreen(Screen):
    def remove_settings(self):
        sm.remove_widget(settings)
        self.remove_widget(self.ids.setBtn)
        print 'Screen "settings" removed succesfully'

class SettingsScreen(Screen):
    pass 

# Create the screen manager
sm = ScreenManager()
menu = MenuScreen(name='menu')
settings=SettingsScreen(name='settings')
sm.add_widget(menu)
sm.add_widget(settings)

class TestApp(App):

    def build(self):
        return sm

    def exit(self):
        self.exit()

if __name__ == '__main__':
    TestApp().run()
答案

您有2个错误:

  • ID不是字符串。

  • 如果要删除小部件,则必须通过您的父级使用它,在这种情况下,如果要删除“ setBtn”,则必须使用BoxLayout。

考虑到上述,解决方法是:

# ...
Builder.load_string(
    """
&ltMenuScreen>:
    BoxLayout:
        id: box_layout
        Button:
            id: setBtn
            text: 'Goto settings'
            on_press: root.manager.current = 'settings'
        Button:
            text: 'Quit'
            on_press: root.remove_settings()
&ltSettingsScreen>:
    BoxLayout:
        Button:
            text: 'My settings button'
        Button:
            text: 'Back to menu'
            on_press: root.manager.current = 'menu' 
"""
)

# Declare both screens
class MenuScreen(Screen):
    def remove_settings(self):
        self.ids.box_layout.remove_widget(self.ids.setBtn)
        print('Screen "settings" removed succesfully')
# ...

以上是关于如果未动态添加,如何正确删除Kivy中的小部件的主要内容,如果未能解决你的问题,请参考以下文章

Kivy中的动态网格,每个网格元素包含多个小部件

如何清除 kivy 中的小部件?

Kivy 如何访问子小部件中的小部件

如何引用似乎超出范围的小部件 - 改编的 kivy/examples/demo/images

如何使用On_Press更改动态创建的小部件的BG颜色并使用Pickle保存? (与Kivy的Python)

如何禁用 Kivy 中的小部件?