2016-06-26 7 views
0

Ich habe Probleme ein Widget zu entfernen mit remove_widget in Kivy ich entweder Typeerror erhalten: ‚Label‘ Objekt hat kein Attribut ‚getitem‘ Fehler oder es funktioniert einfach nicht entfernen das Label, das erstellt wurde.remove_widget in Kivy nicht entfernt Widget

Ich glaube, ich bin nicht richtig auf das Widget beziehen gemacht, aber nicht sicher, wie man ...

Builder.load_string(""" 


<MenuScreen>: 
    FloatLayout: 
     #cols: 2 
     #rows: 2 
     size: 800,480 

     Button: 
      id: resetmash 
      text: "Reset" 
      font_size: 30 
      size_hint: None, None 
      background_color: 1,0.88,0.882,1 
      size: 100,100 
      pos: 1450,800 
      on_press: root.resetmash() 
     Button: 
      id: btn_0 
      text: "+" 
      size_hint: None, None 
      size: 100,100 
      pos: 550,700 
      on_press: root.listmashsteps() 


""") 


class MenuScreen(Screen): 



    def resetmash(self): 
     self.remove_widget(Label()) 

    def listmashsteps(self, *largs): 
     self.add_widget(Label(text="Step")) 


    def __init__(self, **kwargs): 
     super(MenuScreen, self).__init__(**kwargs) 



sm = ScreenManager() 
menu_screen = MenuScreen(name='menu') 
sm.add_widget(menu_screen) 

class TestApp(App): 

    def build(self): 
     return sm 


if __name__ == '__main__': 
    TestApp().run() 
+0

nicht sicher, was Sie versuchen, hier zu erreichen. – jligeza

+0

Wenn ich auf eine Schaltfläche klicke, wird ein Label erstellt, dann klicke ich auf ein anderes botton, um das Label zu entfernen. – fastmhc

+0

Erstellen Sie dann ein Box- (oder Raster-) Layout für diese Labels. Wenn Sie also Labels entfernen möchten, rufen Sie einfach remove_children() auf. 'Auf dieser Kiste. – jligeza

Antwort

1
self.remove_widget(Label()) 

Dies macht keinen Sinn - Sie, dass Etikett nur instanziiert, so dass es isn wurde dem Widget nicht hinzugefügt, sodass Sie es nicht entfernen können.

speichern Anstatt einen Verweis auf das Etikett, wenn Sie es hinzufügen, so etwas wie:

self.label = Label(text='Step') 
self.add_widget(self.label) 

Dann später:

self.remove_widget(self.label) 
+0

nur um zu folgen. wenn ich mehrere Label-Widgets in einer Schleife mache wie def listmashsteps (self, * largs): für Schritt im Bereich (0,4): self.label = Label (text = "Step" + step) dann das self .remove_widget (self.label) entfernt nur das zuletzt erstellte Label. Gibt es eine Möglichkeit, alle Etiketten, die zuvor erstellt wurden, zu entfernen. Es scheint, dass Labels erstellt nicht indiziert sind, so kann ich nicht selbst. Remove_widget (self.label [0]) – fastmhc

+0

Schauen Sie, was der Code tatsächlich tut - es setzt 'self.label', um auf die Instanz des' Label' zu zeigen das du erstellt hast. Wenn Sie Verweise auf mehr als ein Etikett speichern möchten, müssen Sie den Code entsprechend ändern, z. 'self.labels = []' und 'self.labels.append (Label (text = '...'))', dann können Sie später die Labels in self.labels ändern. – inclement

+0

Nochmals vielen Dank für die Antwort. Ich bekomme den Fehler 'AttributeError: 'list' Objekt hat kein Attribut 'bind'' nach – fastmhc