0

有一点问题。所以我正在尝试创建自己的小部件,并且我成功了,只是将其大小和位置设置为正确(与其父级相同)。

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。我不知道为什么它不起作用。我试图从 Layout 而不是 Widget 继承,但仍然没有。有什么建议吗?谢谢!

4

1 回答 1

1

好吧,我想通了,原来我忘了设置适当的属性。所以我现在使用 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)
于 2015-06-06T13:48:47.153 回答