【问题标题】:How to correctly remove a widget in Kivy if not added dynamically如果未动态添加,如何正确删除 Kivy 中的小部件
【发布时间】:2019-11-18 11:19:58
【问题描述】:

我看到有很多与我类似的案例的答案:如果我在代码中使用“.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()

【问题讨论】:

    标签: python user-interface widget kivy


    【解决方案1】:

    您有 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')
    # ...

    【讨论】:

    • 哦,我没有注意到 id 不是字符串的事实!非常感谢!
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多