【问题标题】:Kivy remove_widget removes all children widgets from the screenKivy remove_widget 从屏幕上删除所有子小部件
【发布时间】:2016-10-05 03:01:27
【问题描述】:

我想在下面的示例中从我的RootWidgetremove 子小部件,但是单击 RootButton 会删除两个子小部件(红色和绿色)。然而,在 shell 中打印的 self.children 列表中仍然存在第二个孩子,但在 RootWidget 上看不到。这里有什么问题?

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()

【问题讨论】:

    标签: python-2.7 kivy


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多