如何在python kivy中删除小部件

问题描述

我想通过单击“角质模式”按钮删除“bl”小部件,但它最初不在屏幕上。如何通过单击按钮来删除小部件?

from kivy.app import App
from kivy.uix.Boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.config import Config
from kivy.core.window import Window
from kivy.uix.image import Image
from kivy.uix.widget import Widget

class ScraperApp(App,FloatLayout):
    def PhotGif(self):
        wentil = Image(source='img.gif',size_hint = (.5,.5),anim_loop = 99999)
        photo = AnchorLayout(anchor_x='center',anchor_y='top',padding = [0,75,0])
        photo.add_widget(wentil)
        return photo

    def build(self):
        
        bl = BoxLayout(orientation='horizontal',padding = [50,100,50,150],spacing = 5)
        bl.add_widget( Button(text = '1',on_press = self.first,font_size = 20,size_hint = (.3,.1)))
        bl.add_widget( Button(text = '2',on_press = self.second,.1)))
        #bl.add_widget( Button(text = 'Wallpaper mode',on_press = self.wallpaper,.1)))
        wid = FloatLayout()
        wid.add_widget(ScraperApp().PhotGif())
        wid.add_widget(bl)
        return wid

    def first(self,instance):
        print('Horny mode')
        instance.text = 'кнопка нажата'
        ScraperApp().build().remove_widget(bl)
        stop()

    def stop():
        ScraperApp().build().remove_widget(bl)

    def second(self,instance):
        print('Soft mode')
        instance.text = 'кнопка нажата'

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

你能帮我做一下,当你点击任何按钮时,删除按钮的小部件吗?

解决方法

首先,保存对要删除的小部件的引用:

def build(self):
    self.bl = BoxLayout(orientation='horizontal',padding=[50,100,50,150],spacing=5)
    self.bl.add_widget(Button(text='1',on_press=self.first,font_size=20,size_hint=(.3,.1)))
    self.bl.add_widget(Button(text='2',on_press=self.second,.1)))
    # self.bl.add_widget( Button(text = 'Wallpaper mode',on_press = self.wallpaper,font_size = 20,size_hint = (.3,.1)))
    wid = FloatLayout()
    wid.add_widget(ScraperApp().PhotGif())
    wid.add_widget(self.bl)
    return wid

然后修改first()方法将其移除:

def first(self,instance):
    print('Horny mode')
    instance.text = 'кнопка нажата'
    self.root.remove_widget(self.bl)
    self.stop()

注意代码:

ScraperApp().build().remove_widget(bl)

创建 ScaperApp 的新实例并尝试从该实例中删除 bl。除了其他问题,您对该新实例所做的任何操作都不会影响当前正在运行的实例。