也对其他非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))
答案 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)