2016-10-04 68 views
0

remove子ウィジェットを下の例で私のRootWidgetから削除しますが、RootButtonをクリックすると両方の子ウィジェット(REDとGREENの両方)が削除されます。しかし、シェル内にself.childrenのリストが印刷されていても、2番目の子は残りますが、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() 
関連する問題