add_widget 和 remove_widget 用于 kivy 中的 class

add_widget and remove_widget for a class in kivy

我是 Kivy 的新手,很抱歉在 post..

中问了 2 个问题

首先,为什么remove_widget()不起作用?它说 AttributeError: 'MyCard' object has no attribute 'remove_card' 但我试图将它们放在其他 class 中,但它仍然不起作用。

其次,为什么我的小部件仍然具有“焦点行为”并且我的按钮仍然可以点击,即使我放了一张颜色几乎没有透明的卡片

这是我的 main.py 文件

class MyCard(Screen):
    pass

class HomeScreen(Screen):
    def add_card(self):
        self.add_widget(MyCard())
    def remove_card(self):
        self.remove_widget(MyCard(name='cardd'))

class AVCard(Screen):
    pass

class ScreenApp(MDApp):
    def build(self):
        def build(self):
    sm = ScreenManager(transition=FadeTransition(duration=0.2))
    sm.add_widget(HomeScreen(name='home'))
    sm.add_widget(AVCard(name='av'))
    return sm

这是我的 home.kv 文件(AVCard class 有自己的 .kv 文件)

<HomeScreen>:
    name: 'home'
    MDIconButton:
        on_release: root.add_card()
        ...

<MyCard>:
    name: 'cardd'
    MDCard: #-> I put this card is to not allow user click on widgets behind it but it does not work
        md_bg_color: 0, 0, 0, .3
        ...
    MDCard: #-> Thís card is like a window which includes small widgets in it
        ...
        Screen:
            MDIconButton: #-> The close button
                icon: "close-circle"
                ...
                on_release:
                    root.remove_card()

非常感谢。

在您的 kv 中,root.remove_card() 试图引用 rootremove_card() 方法。在本例中 root 指的是它出现的规则的根,即 MyCard。这就是您看到错误消息的原因,remove_card() 不在 MyCard 对象中。解决方法是使用对包含 remove_card() 方法的正确对象的引用,如下所示:

<MyCard>:
    MDCard: #-> I put this card is to not allow user click on widgets behind it but it does not work
        md_bg_color: 0, 0, 0, .3
    MDCard: #-> Thís card is like a window which includes small widgets in it
        Screen:
            MDIconButton: #-> The close button
                icon: "close-circle"
                on_release:
                    app.root.get_screen('home').remove_card(root)

注意 app.root.get_screen('home').remove_card(root) 的使用,它获取对 HomeScreen 对象的引用(假设使用的 namehome),并调用其 remove_card() 方法以 rootMyCard 实例)作为参数。

那么,在HomeScreenclass中,remove_card()方法可以是:

def remove_card(self, card):
    self.remove_widget(card)