如何使Kivy中的水平滚动视图位于屏幕的中心?

时间:2019-12-19 17:32:50

标签: python python-3.x kivy

我正在尝试在Kivy(Python)中制作水平滚动视图,该视图将显示可滚动浏览的图像(目前为按钮)。我已经能够弄清楚如何进行水平滚动查看,但是似乎无法弄清楚在屏幕上居中的错误。这是我到目前为止的内容:

import kivy
kivy.require('1.8.0')

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

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.rows = 1
        self.spacing=50
        self.size_hint=(None, .5)
        self.bind(minimum_width=self.setter('width'))

class ScrollViewApp(App):
    def build(self):
        scroll = ScrollView( size_hint=(1,1), do_scroll_x=True, do_scroll_y=False )
        grid = MyGrid()
        for i in range(60):
            grid.add_widget(Button(text='#00' + str(i),size=(100,100), size_hint=(1,1)))
        scroll.add_widget(grid)
        return scroll

if __name__ == '__main__':
    ScrollViewApp().run()

我仔细阅读了文档,认为与pos_hint有关:https://kivy.org/doc/stable/api-kivy.uix.widget.html?highlight=pos_hint#kivy.uix.widget.Widget.pos_hint

我尝试添加:

self.pos={'center_y':1}

在MyGrid()类中,但是没有任何更改。不管我在center_y之后加上什么值,网格中包含的ScrollView仍然显示在屏幕顶部,而不是居中放置在中间。我也尝试过使用

来调整ScrollViewApp()类中的内容
scroll.pos={'center_y':1}

也是。我似乎无法弄清楚我在做什么错。有人对我在这里不了解的内容有任何想法吗?我觉得我离我很近!!!

编辑:

我试图使按钮居中,但也可以通过拖动按钮周围的黑色空间来滚动。在下面的图片中,您可以看到按钮下方有一堆黑色空间。我可以单击一个按钮或此黑色空间,然后水平滚动。我只需要在按钮居中的情况下发生这种情况!

enter image description here

1 个答案:

答案 0 :(得分:3)

布局按照您的指示进行。
您有一个ScrollView作为根窗口小部件,并在其中放入了Grid的{​​{1}}。

它占用父窗口小部件高度的一半,即整个窗口的高度。
使size_hint_y = 0.5居中的一种方法是在其上方和下方放置一些分隔符,但这是不可能的,因为Grid仅接受一个小部件作为内容。

所以,一种解决方法是。

  • ScrollView具有Grid的全高
  • ScrollView添加到另一个布局(例如ScrollView)内
  • 最后,添加两个小部件以将BoxLayout强制居中。
ScrollView

另一种方法是。

  • class MyGrid(GridLayout): def __init__(self, **kwargs): super(MyGrid, self).__init__(**kwargs) self.rows = 1 self.spacing = 50 self.size_hint = (None, 1) self.bind(minimum_width=self.setter('width')) class ScrollViewApp(App): def build(self): base = BoxLayout(orientation="vertical", size_hint=(1, 1)) base.add_widget(Widget(size_hint_y=.3)) scroll = ScrollView(size_hint=(1, .4), do_scroll_x=True, do_scroll_y=False) grid = MyGrid() for i in range(60): grid.add_widget( Button(text='#00' + str(i), size=(100, 100), size_hint=(1, 1))) scroll.add_widget(grid) base.add_widget(scroll) base.add_widget(Widget(size_hint_y=.3)) return base if __name__ == '__main__': ScrollViewApp().run() 放在ScrollView
  • 并使用FloatLayout
  • 对其进行定位
pos_hint

编辑:

好。更新问题后,这是一种居中并使用黑条滚动的方法:

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.rows = 1
        # self.spacing = 50
        self.size_hint = (None, 1)
        self.bind(minimum_width=self.setter('width'))


class ScrollViewApp(App):
    def build(self):
        base = FloatLayout(size_hint=(1, 1))
        scroll = ScrollView(size_hint=(1, .4), do_scroll_x=True, do_scroll_y=False,
                            pos_hint={"center_y": .5})
        grid = MyGrid()
        for i in range(60):
            grid.add_widget(
                Button(text='#00' + str(i), width=100, size_hint=(None, 1)))
        scroll.add_widget(grid)
        base.add_widget(scroll)
        return base


if __name__ == '__main__':
    ScrollViewApp().run()

它使用Builder.load_string(""" <BaseWidget>: ScrollView: do_scroll_y: False BoxLayout: orientation: "vertical" size_hint_x: None width: self.minimum_width Widget: size_hint_y: .3 GridLayout: id: grid rows: 1 size_hint_y: .4 size_hint_x: None width: self.minimum_width Widget: size_hint_y: .3 """) class BaseWidget(FloatLayout): pass class ScrollViewApp(App): def build(self): base = BaseWidget() for i in range(60): base.ids.grid.add_widget(Button(text='#00' + str(i), width=100, size_hint_x=None)) return base if __name__ == '__main__': ScrollViewApp().run() 来创建布局,因为我觉得它更容易理解。
对于“仅Python”代码,您可以使用以下代码:

kv_lng