如何清除 kivy 中的小部件?

Posted

技术标签:

【中文标题】如何清除 kivy 中的小部件?【英文标题】:How can I clear widget in kivy? 【发布时间】:2021-11-29 06:57:39 【问题描述】:

我正在制作一个选择应用程序。我正在使用微调器进行多项选择。在微调器选择之后,我想添加 3 个与微调器选择相关的不同按钮。在微调器的每个选择中,这些旧按钮都会替换为新按钮。

到目前为止,我可以在每次选择后添加不同的按钮。但是,按钮不断添加。每次选择微调器后,我都需要先清除旧按钮。

我的包含按钮的类是“ModelSpecifications”。

长话短说,clear_widgets() 有问题。它无法到达“ModelSpecifications”。

这是我的 main.py;

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.spinner import Spinner
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.properties import ObjectProperty, StringProperty, BooleanProperty
from kivy.properties import ListProperty
from collections import OrderedDict

data1=["mother","father","son"]
data2=["uncle","aunt","grandfather"]
data3=["jack","mike","simon"]
data4=["1898","1975","1985","1885"]

class MainWidget(Widget):

    an0=tuple(list(OrderedDict.fromkeys(data1)))
    cal5= ObjectProperty()

    def btn10(self,text):

    #----------here is the part I want to clear the buttons first:

        #ModelSpecifications.clear_widgets(ModelSpecifications)

        # or

        #self.ids["anss"].clear_widgets()

        # after that I will add new buttons:
    
        self.cal5 =ModelSpecifications()


        a=data2
        b=data3
        c=data4

        mi=[]
        n=0

        while n < len(a):
            aba=(str(a[n])+"\n"+str(b[n])+"\n"+str(c[n]))
            mi.append(aba)
            n+=1

        for i in mi:
            self.b1=Button(text=str(i),size_hint=(1,None),)
            self.cal5.add_widget(self.b1)
        self.ids.scd.add_widget(self.cal5, index=3) #here id.scd is the class that ModelSpecifications class is added. And it works fine.

class SecondPage(ScrollView):
    pass

class ModelSpecifications(BoxLayout): #this is the class I want add after my spinner selection 
    pass

class Calculation(GridLayout):
    pass   

class MyApp(App):
    pass

MyApp().run()

这是我的.kv;

MainWidget:
<MainWidget>:
    ScreenManager:
        id: scmanager
        size: root.width, root.height
        Screen:
            id: scndpage
            name: "second"
            SecondPage:
                Calculation:
                    id:scd            
                    cols:1 
                    height: self.minimum_height 
                    row_default_height: "70dp"
                    size_hint_y: None
                    spacing:"10dp"
                    canvas.before:
                        Rectangle:
                            pos: self.pos
                            size: self.size
                    BoxLayout:

                        size_hint: 1, None
                        height: "50dp"
                        
                        pading:"10dp"
                        spacing:"10dp"
                        orientation: "vertical"
                        BoxLayout:
                            orientation: "horizontal"
                            Label:
                                text:"Name:"
                                color: 0,0,0,1
                            TextInput:
                                text:"---"
                                color: 0,0,0,1
                            Label:
                                text:"Surname:"
                                color: 0,0,0,1
                            TextInput:
                                text:"-----"
                                color: 0,0,0,1
                    BoxLayout:
                        id:scdd
                        size_hint: 1, 1
                        height: "100dp"
                        orientation: "vertical"
                        BoxLayout:
                            size_hint: 1, None
                            height: "50dp"
                            orientation: "horizontal"
                            Label:
                                text: " Sellection:"
                                color: 0,0,0,1
                            Spinner:
                                text: 'Home'
                                values: root.an0
                                on_text: app.root.btn10(self.text)                                       
                    
                    Button:
                        text:" Calculate"

                    Button:
                        text:"Sellect"
                    
                    Button:
                        text:"Back"

    
<ModelSpecifications>:      
    id:anss                 #HERE IS MY CLASS THAT I WANT TO CLEAR AND ADD AFTER EVERY SPINNER SELECTION
    pading:"10dp"
    spacing:"10dp"
    size_hint: 1, None
    height: "100dp"
    orientation: "horizontal"

当您运行此代码时,请在微调器中选择一些东西。您会在每个选择中看到,应用程序不断添加更多按钮;

【问题讨论】:

【参考方案1】:

在您的 btn10() 方法中,只需添加:

    if self.cal5:
        self.cal5.parent.remove_widget(self.cal5)

行前:

    self.cal5 = ModelSpecifications()

【讨论】:

非常感谢约翰。这很有帮助。

以上是关于如何清除 kivy 中的小部件?的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 如何访问子小部件中的小部件

如何删除 kivy 中的小部件?

如果未动态添加,如何正确删除Kivy中的小部件

清除小部件 kivy

Kivy中的动态网格,每个网格元素包含多个小部件

如何引用似乎超出范围的小部件 - 改编的 kivy/examples/demo/images