首页 > 解决方案 > 无法在 Kivy 中删除小部件

问题描述

我无法使用带有 kivy python 的屏幕删除小部件,我不知道为什么它只是不做任何代码假设在第一个屏幕上删除带有 id:name 的 textinput 但它只是不做任何事情并且没有错误消息。这是在 python 3.7.4、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()

我的.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"

标签: pythonkivykivy-language

解决方案


你的代码:

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

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

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

推荐阅读