【问题标题】:KIVY python - scroll view in a layoutKIVY python - 布局中的滚动视图
【发布时间】: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

【问题讨论】:

    标签: scrollview kivy


    【解决方案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没有属性“视图””
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多