gpt4 book ai didi

python - 如果没有动态添加,如何正确删除 Kivy 中的小部件

转载 作者:行者123 更新时间:2023-12-01 06:53:12 25 4
gpt4 key购买 nike

我看到与我类似的情况有很多答案:如果我使用“.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(
"""
<MenuScreen>:
BoxLayout:
<b>id: box_layout</b>
Button:
<b>id: setBtn</b>
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):
<b>self.ids.box_layout.remove_widget(self.ids.setBtn)</b>
print('Screen "settings" removed succesfully')
# ...

关于python - 如果没有动态添加,如何正确删除 Kivy 中的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58913431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com