处理Kivy中的ScrollViews

时间:2016-05-19 14:18:11

标签: python python-3.x kivy

我想在我的Kivy应用程序中围绕ScrollView绘制边框。问题是ScrollView的内容重叠了边框,因为我在窗口小部件中绘制它 所以我想知道其中一个是否是一个可能的解决方案:

  • 如何在小部件的边界外绘制?
    当我试图将一个画布元素的一部分移动到小部件之外时,它只是切断了那个部分,这并不奇怪。也许我可以在这个之外制作另一个小部件并借鉴它?
  • 如何限制ScrollView的内容?那么,我可以更改滚动边界吗?我的意思是我不希望孩子们超越小部件中的某个点以使他们不触摸边框

以下是一些用于演示此问题的测试代码。这是一个稍微修改过的官方例子。滚动时按钮与绿色边框重叠,这是我不想要的:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.uix.gridlayout import GridLayout

Builder.load_string('''
<ScrollView>:
    canvas:
        Color:
            rgba: 1, 1, 1, 1
        Rectangle:
            pos: self.pos
            size: self.size
        Color:
            rgba: 0, 1, 0, 1
        Line:
            points: self.x, self.y + self.height,\
            self.x + self.width, self.y + self.height,\
            self.x + self.width, self.y, self.x, self.y,\
            self.x, self.y + self.height
            width: 1.2
''')

class TestApp(App):                
    def build(self):
        layout = GridLayout(cols=1, padding=10, spacing=10,
                            size_hint=(None, None), width=500)
        layout.bind(minimum_height=layout.setter('height'))
        for i in range(30):
            btn = Button(text=str(i), size=(480, 40),
                         size_hint=(None, None))
            layout.add_widget(btn)

        root = ScrollView(size_hint=(None, None), size=(500, 320),
                          pos_hint={'center_x': .5, 'center_y': .5}, do_scroll_x=False)
        root.add_widget(layout)
        return root

TestApp().run()

1 个答案:

答案 0 :(得分:1)

  

如何在小部件的边界外绘制?   当我试图将一个画布元素的一部分移动到小部件之外时,它只是切断了那个部分,这并不奇怪。也许我可以在这个之外制作另一个小部件并借鉴它?

你真的不明白你的意思。 canvas没有界限,除非你使用Stencil。当您尝试在ScrollView之外绘制时,窗口小部件空间中的内容将被隐藏,因为它最初使用Stencil以便隐藏不必要的内容,您可以滚动浏览它,如您所见{ {3}}

现在关于那个重叠。在第二个canvas.after之前Color在绘制小部件后绘制它。与canvas.before类似,后者用于背景。

canvas:
    Color:
        rgba: 1, 1, 1, 1
    Rectangle:
        pos: self.pos
        size: self.size
canvas.after:
    ...

基本canvas是在小部件的“相同”时间内绘制的,因此无论您做什么,以后绘制的项目都将位于顶部。 after将在使用该顺序再次绘制之后进行绘制,并且before在完成甚至绘制小部件之前执行相同的操作。

  

如何限制ScrollView的内容?那么,我可以更改滚动边界吗?我的意思是,我不希望孩子们超越小部件中的某个点,使他们不触摸边框

使用固定大小的布局来处理它的孩子的位置,例如FloatLayout pos_hintBoxLayout取决于您的需要,因此会将小部件推入虚构的矩形,基本上是[0,0]到[宽度,高度]即大小你的布局(如果你正确使用它)。