KIVY python - 布局中的滚动视图
Posted
技术标签:
【中文标题】KIVY python - 布局中的滚动视图【英文标题】:KIVY python - scroll view in a layout 【发布时间】:2018-03-26 17:53:32 【问题描述】:我有一个简单的应用程序,我想在其中插入几个按钮的滚动视图。 所以有基本代码,我想要网格布局内的滚动视图。 PS:我有这个错误:菜单对象没有属性'view'
我想获得什么:
debug.py:
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.button import Button
class AppScreenManager(ScreenManager):
def __init__(self, **kwargs):
super(AppScreenManager, self).__init__(**kwargs)
class Menu(Screen):
def __init__(self, **kwargs):
super(Menu, self).__init__(**kwargs)
base = ["element ".format(i) for i in range(40)]
for element in base:
self.view.add_widget(Button(text=element, size=(40,40), size_hint=(1, None), background_color=(0.5, 0.5, 0.5, 1), color=(1,1,1,1)))
Builder.load_file("debug.kv")
class MyAppli(App):
def build(self):
return AppScreenManager()
if __name__ == '__main__':
MyAppli().run()
debug.kv:
#:kivy 1.9.1
<AppScreenManager>:
Menu:
<Menu>:
BoxLayout:
orientation: 'vertical'
BoxLayout:
size: (64, 64)
size_hint: (1, None)
Button:
text: "Menu"
color: (1,1,1,1)
background_color: (.3, .3, .3, 1)
GridLayout: # here i want a scrollview
id: view
cols: 1
【问题讨论】:
【参考方案1】:Kivy Language
请注意,最外面的小部件将 kv 规则应用于其所有内部 在应用任何其他规则之前的小部件。这意味着如果一个内部 小部件包含 id,这些 id 在内部期间可能不可用 小部件的 init 函数。
ScrollView » Managing the Content Size and Position
默认情况下,size_hint 为 (1, 1),因此内容大小将完全适合您的 ScrollView(您将无法滚动)。您必须至少停用子项的 size_hint 指令(x 或 y)之一才能启用滚动。当 ScrollView 小于最小尺寸时,将 size_hint_min 设置为不为 None 也会启用该尺寸的滚动。
要在 Y 轴/垂直方向上滚动 GridLayout,请设置孩子的 宽度为 ScrollView (size_hint_x=1),并设置 size_hint_y 属性为无:
使用Clock.schedule_once 调用一个新方法,create_scrollview。确保高度可以滚动layout.bind(minimum_height=layout.setter('height'))
。详情请参考以下示例。
示例
debug.py
>from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window
from kivy.properties import ObjectProperty
from kivy.clock import Clock
class AppScreenManager(ScreenManager):
def __init__(self, **kwargs):
super(AppScreenManager, self).__init__(**kwargs)
class Menu(Screen):
view = ObjectProperty(None)
def __init__(self, **kwargs):
super(Menu, self).__init__(**kwargs)
Clock.schedule_once(self.create_scrollview)
def create_scrollview(self, dt):
base = ["element ".format(i) for i in range(40)]
layout = GridLayout(cols=1, spacing=10, size_hint_y=None)
layout.bind(minimum_height=layout.setter("height"))
for element in base:
layout.add_widget(Button(text=element, size=(50, 50), size_hint=(1, None),
background_color=(0.5, 0.5, 0.5, 1), color=(1, 1, 1, 1)))
scrollview = ScrollView(size_hint=(1, None), size=(Window.width, Window.height))
scrollview.add_widget(layout)
self.view.add_widget(scrollview)
Builder.load_file("debug.kv")
class MyAppli(App):
def build(self):
return AppScreenManager()
if __name__ == '__main__':
MyAppli().run()
debug.kv
#:kivy 1.10.0
<AppScreenManager>:
Menu:
<Menu>:
view: view
BoxLayout:
orientation: 'vertical'
BoxLayout:
size: (64, 64)
size_hint: (1, None)
Button:
text: "Menu"
color: (1, 1, 1, 1)
background_color: (.3, .3, .3, 1)
ScrollView:
id: view
输出
【讨论】:
【参考方案2】:ScrollView:
size: self.size
GridLayout: # here i want a scrollview
id: view
cols: 1
size_hint_y: None
height: self.minimum_height
Button:
text:
size_hint_y: None
做这样的事情并在网格布局中添加所需的按钮...我是 Kivy 的新手,所以请多多包涵。
【讨论】:
这段代码仍然会报错“ self.view.add_widget(Button(text=element, size=(50, 50), size_hint=(1, None), AttributeError: 'Menu' object没有属性“视图””以上是关于KIVY python - 布局中的滚动视图的主要内容,如果未能解决你的问题,请参考以下文章