Kivy - 创建新的小部件并设置其位置和大小

Kivy - Create new widget and set its position and size

有点问题。所以我正在尝试创建我自己的小部件,我已经成功了,除了设置它的大小和位置正确(与它的parrent相同)。

class Story(App):
    def build(self):    
        return MyWidgets().init()

该应用程序将 GridLayout 作为容器,我想将 StoryWidget 传递到其中

class MyWidgets(object):

    def init(self):
        root = GridLayout(cols=2,rows=1)
        root.add_widget(StoryWidget())
        root.add_widget(Button())
        return root

故事小工具是这样的:

class StoryWidget(Widget):
    def __init__(self,**kwargs):
        super(StoryWidget, self).__init__(**kwargs)
        topLayout=BoxLayout(orientation = "vertical")
        topLayout.add_widget(Button(text="first"))
        topLayout.add_widget(Button(text="second"))
        self.add_widget(topLayout)

如果我尝试为它添加背景颜色,效果很好:

        with self.canvas.before:
            Color(.9,.9,1)  
            self.Backgroud = Rectangle(pos=self.pos,size=self.size)

        self.bind(pos=self.repaint,size=self.repaint)
        self.bind(pos=self.resize,size=self.resize)

    def repaint(self,*args):
        self.Backgroud.pos = self.pos
        self.Backgroud.size = self.size

root(Gridlayout) 的整个第一列被正确地重绘为白色, 但 Widget 位于默认位置 (0,0) 和默认大小 (100,100)。 据我所知,这是因为 Widget 无法处理这些事情。布局应该以某种方式自动完成。可以看出,StoryWidget 的根部件是布局。我不知道为什么它不起作用。我试图从 Layout 而不是 Widget 继承,但仍然没有。有什么建议吗?谢谢!

好的,我想通了,原来是忘记设置合适的属性了。所以我现在使用 Gridlayout 而不是 BoxLayout,在这种情况下它需要 cols 和 rows 所以它现在应该是这样的:

class StoryWidget(GridLayout):
    def __init__(self,**kwargs):
        self.cols=1
        self.rows=1
        super(StoryWidget, self).__init__(**kwargs)
        topLayout=BoxLayout(orientation = "vertical")
        topLayout.add_widget(Button(text="first"))
        topLayout.add_widget(Button(text="second"))
        self.add_widget(topLayout)

    with self.canvas.before:
        Color(.9,.9,1)  
        self.Backgroud = Rectangle(pos=self.pos,size=self.size)

    self.bind(pos=self.repaint,size=self.repaint)
    self.bind(pos=self.resize,size=self.resize)