我正在尝试在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}
也是。我似乎无法弄清楚我在做什么错。有人对我在这里不了解的内容有任何想法吗?我觉得我离我很近!!!
编辑:
我试图使按钮居中,但也可以通过拖动按钮周围的黑色空间来滚动。在下面的图片中,您可以看到按钮下方有一堆黑色空间。我可以单击一个按钮或此黑色空间,然后水平滚动。我只需要在按钮居中的情况下发生这种情况!
答案 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