2016-10-04 4 views
0

Я хочу, чтобы remove дочерние элементы из моего RootWidget в приведенном ниже примере, но при нажатии на RootButton удаляются оба дочерних виджета (как RED, так и GREEN). Однако в списке self.children, напечатанном в оболочке, остается еще один оставшийся ребенок, но не видеть в RootWidget. Что здесь не так?Kivy remove_widget удаляет все дочерние виджеты с экрана

from kivy.app import App 
from kivy.uix.button import Button 
from kivy.uix.boxlayout import BoxLayout 

RED = (1, 0, 0, 1) 
GREEN = (0, 1, 0, 1) 

class RootWidget(Button): 

    def __init__(self, *args, **kwargs): 
     super(RootWidget, self).__init__(*args, **kwargs) 
     self.add_widget(Button(background_color = RED), 0) 
     self.add_widget(Button(background_color = GREEN), 1) 
     self.bind(on_press = self.btn_call_back) 

    def btn_call_back(self, v): 
     try: 
      print "_" * 60 
      print self.children 
      print "+" * 60 
      self.remove_widget(self.children[0]) 
      print self.children 
      print "_" * 60 
     except IndexError: 
      print "no children any more!" 




class TutorApp(App): 

    def build(self): 
     return RootWidget() 


if __name__ == "__main__": 
    TutorApp().run() 

ответ

1

Не знаете, в чем конкретная причина такого поведения. Возможно, когда вы нажмете свою кнопку, и она заменит ее фон с background_normal на background_down, это каким-то образом переопределит фон его детей. Это не имеет значения, потому что на самом деле вы не должны добавлять виджеты в экземпляр Button. Используйте Widget или какой-то класс макета, чтобы упорядочить свои виджеты.

from kivy.app import App 
from kivy.uix.button import Button 
from kivy.uix.widget import Widget 
from kivy.uix.boxlayout import BoxLayout 
from kivy.lang import Builder 

Builder.load_string(''' 
<Widget>: 
    canvas.before: 
     Color: 
      rgb: 0, 0, 1 
     Rectangle: 
      size: self.size 
      pos: self.pos 
''') 

RED = (1, 0, 0, 1) 
GREEN = (0, 1, 0, 1) 

class RootWidget(Widget): 

    def __init__(self, *args, **kwargs): 
     super(RootWidget, self).__init__(*args, **kwargs) 
     self.add_widget(Button(background_color = RED), 0) 
     self.add_widget(Button(background_color = GREEN), 1) 
     self.bind(on_touch_down = self.btn_call_back) 


    def btn_call_back(self, *args): 
     try: 
      print "_" * 60 
      print self.children 
      print "+" * 60 
      self.remove_widget(self.children[0]) 
      print self.children 
      print "_" * 60 
     except IndexError: 
      print "no children any more!" 


class TutorApp(App): 
    def build(self): 
     return RootWidget() 


if __name__ == "__main__": 
    TutorApp().run() 
Смежные вопросы