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)
有点问题。所以我正在尝试创建我自己的小部件,我已经成功了,除了设置它的大小和位置正确(与它的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)