如何使用Python为Kivy BoxLayout提供背景?

时间:2015-11-30 09:48:01

标签: python background widget kivy

也对其他非Button小部件感兴趣,比如GridLayout或Label。我主要对BorderImages很感兴趣,但当然欢迎谈到常规图像的答案。

我发现了许多使用Builder和KV文件的例子,但我对纯粹用Python做这件事感兴趣。这是我现在正在尝试的内容:

    ab = BoxLayout(orientation='horizontal',
                   height=self.widgetHeight,
                   size_hint_y=None)
    with ab.canvas.before:
        BorderImage(
            width=self.width,
            height=self.widgetHeight,
            pos=(0,0),
            border=(15, 15, 15, 15),
            source='button-up.png')

这不起作用,但也不会产生错误。

编辑:收到Inclement和Totem的评论之后,非常感谢你们这些文件,但我担心我已经看过这些文件了。我将分享一些关于我在遵循这些文档时所做的事情的更多细节:

def redrawAB(self,*args,**kwargs):
    self.bg_rect.size = self.size
    self.bg_rect.pos = self.pos
def myActionBar(self):
    ab = BoxLayout(orientation='horizontal', 
        height=self.widgetHeight,
        size_hint_y=None)
    with ab.canvas:
        ab.bg_rect = BorderImage(width=self.width,
            height=self.widgetHeight,
            pos=(0,0), border=(15, 15, 15, 15),
            source='button.png')
    ab.bind(pos=self.redrawAB, size=self.redrawAB)
    return ab

虽然我不认为这是相关细节,但在代码的其他地方,我们会这样做:

 widget.add_widget(self.myActionBar())

有了上述内容,应用程序将在启动时崩溃:

  AttributeError: 'InterfaceManager' object has no attribute 'bg_rect'

" InterfaceManager"这些东西的父窗口小部件。所以我想某种方式我需要让redrawAB()知道ab.bg_rect对象,而且我不确定如何让ab.bind()传递对象的引用?

这是另一种不起作用的尝试。我没有错误,但我没有使用界面小部件的可用对象(我只是在屏幕上得到一个空白区域应该去):

class MyActionBar(BoxLayout):
    def __init__(self, **kwargs):
        super(BoxLayout, self).__init__(**kwargs)

        self.height=kwargs['height']
        self.orientation='horizontal'
        self.size_hint_y=None

        with self.canvas:
            self.bg_rect = BorderImage(border=(15, 15, 15, 15), source='button.png')
        self.bind(pos=self.redrawAB, size=self.redrawAB)

    def redrawAB(self,*args,**kwargs):
        self.bg_rect.size = self.size
        self.bg_rect.pos = self.pos

#...in another class comes the following...

    parent_boxlayout.add_widget(MyActionBar(height=128))

1 个答案:

答案 0 :(得分:2)

我正在回答我自己的问题,因为我找到了解决办法。

首先是一个接一个地创建一个背景图像和BoxLayout的AnchorLayout,如下所示:

if

更传统,更痛苦的方法:不要在BoxLayout上放置背景(目标是将其他小部件放在它前面),只需将图像分解成块并将每个块放入Box中的BoxLayout中(或图像,如果你不需要按钮行为),如下所示:

a = AnchorLayout(anchor_x='center', anchor_y='center')
i = Image(source='thing.png')
a.add_widget(i)
b = BoxLayout(orientation='horizontal')
a.add_widget(b)