无法删除 Kivy 中的小部件

cannot remove widget in Kivy

我无法使用带有 kivy python 的屏幕删除小部件,我不知道为什么它什么也没做 该代码假设在第一个屏幕上删除带有 id:name 的文本输入,但它什么也没做,也没有错误消息。 这是在 python 3.7.4 上测试的所有代码,在 window.

上测试的 kivy 1.11.1

module_media_player.py

import kivy

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.core.audio import SoundLoader
from kivy.uix.videoplayer import VideoPlayer
from kivy.uix.screenmanager import ScreenManager,Screen



class Player(Screen):
    def press(self):
        self.ids.name.text = 'nice'
    def remove(self):
        self.remove_widget(self.ids.name)
class MediaPlayer(Screen):
    pass
class WindowManager(ScreenManager):
    pass

kv = Builder.load_file('my.kv')
class GoodApp(App):
    def build(self):
        return kv


if __name__ == '__main__':
    GoodApp().run()

my.kv

WindowManager:
    Player:
    MediaPlayer:

<Player>:
    name:"player"

    BoxLayout:
        orientation:"vertical"
        size:root.width,root.height
        cols:2

        TextInput:
            id:name
            multiline:False
            text:"first"
            font_size:12
            size_hint_y:0.3
        Button:
            text:"click me"
            on_press:root.remove()
        Button:
            text:"next window"
            font_size:14
            size_hint_y:0.7
            on_release:
                app.root.current = "mediaplayer"
                root.manager.transition.direction = "left"

<MediaPlayer>:
    name:"mediaplayer"
    BoxLayout:
        orientation:"vertical"
        size:root.width,root.height

        Label:
            text:"second"
            font_size:12

        Button:
            text:"previous window"
            font_size:14
            on_release:
                app.root.current = "player"
                root.manager.transition.direction = "right"

您的代码:

def remove(self):
    self.remove_widget(self.ids.name)

正在尝试从 Player Screen 中删除 TextInput,但 Textinput 不是 Player 的子项。它实际上是 BoxLayout 的子项。您可以通过修改 remove() 方法来解决此问题:

def remove(self):
    textinput = self.ids.name
    textinput.parent.remove_widget(textinput)  # remove widget from its parent