首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ScrollView kivy

ScrollView kivy
EN

Stack Overflow用户
提问于 2020-05-10 16:33:54
回答 1查看 239关注 0票数 0

我有Python代码:

代码语言:javascript
复制
class Screen3(Screen):
    def __init__(self, **kwargs):
        self.scv = ScrollView()
        self.bl_main = BoxLayout()
        self.bl_main.padding = [20, 20, 20, 20]
        self.bl_main.spacing = 50
        self.bl_main.orientation = 'vertical'
        super(Screen, self).__init__(**kwargs)

    def on_enter(self, *args):
        for i in [f'Button {i+1}' for i in range(20)]:
            b = Button()
            b.size_hint = None, None
            b.size = 350, 350
            b.text = i
            anch = AnchorLayout()
            anch.anchor_x = 'right'
            anch.add_widget(b)
            self.bl_main.add_widget(anch)
        self.scv.add_widget(self.bl_main)
        self.add_widget(self.scv)

我有kivy代码:

代码语言:javascript
复制
Screen3:
    name: 'screen3'
    BoxLayout:
        orientation: vertical
        AnchorLayout:
            anchor_x: 'center'
            anchor_y: 'top'
            MDToolbar:
                title: "History"
                left_action_items: [['menu', lambda x: nav_drawer.set_state()], ['skip-backward', lambda x: app.change_screen('main screen', screen_manager)]]
                elevation: 12

在这里你可以看到我的应用程序。

https://pasteboard.co/J7KTdeR.jpg

  1. 为什么我不能点击我的图标按钮?
  2. 为什么我的垫片和间隔不考虑,为什么ScrollView小部件不能工作?

我该如何纠正这两点?

求你帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-11 02:05:21

图标按钮无法工作,因为您在ScrollView中添加的on_enter()的默认size_hint为(1,1),因此填充了整个Screen3 (即使ScrollView的部分是透明的)。ScrollView正在抓取鼠标点击,所以图标按钮从来没有看到鼠标点击。

以类似的方式,BoxLayout (bl_main)也具有默认的size_hint,因此它的高度将是ScrollView的高度,并且它将尝试适应height中的20 Buttons。每个Button都得到自己的部分高度,这是不够的,所以他们重叠。

修复方法是在ScrollViewBoxLayout中构建kv,以利用自动绑定的优势,并设置它们的大小。下面是您的代码的一个版本,可以这样做:

代码语言:javascript
复制
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.app import MDApp


class Screen3(Screen):
    def on_enter(self, *args):
        for i in [f'Button {i+1}' for i in range(20)]:
            b = Button()
            b.size_hint = None, None
            b.size = 350, 350
            b.text = i
            # anch = AnchorLayout()
            # anch.anchor_x = 'right'
            # anch.add_widget(b)
            # self.ids.bl_main.add_widget(anch)
            self.ids.bl_main.add_widget(b)


kv = '''
Screen3:
    name: 'screen3'
    BoxLayout:
        orientation: 'vertical'
        size_hint_y: None
        height: toolbar.height
        pos_hint: {'center_x':0.5, 'top':1}
        # AnchorLayout:
        #     anchor_x: 'center'
        #     anchor_y: 'top'
        MDToolbar:
            id: toolbar
            title: "History"
            left_action_items: [['menu', lambda x: nav_drawer.set_state()], ['skip-backward', lambda x: app.change_screen('main screen', screen_manager)]]
            elevation: 12
    ScrollView:
        size_hint: (None, None)
        height: root.height - toolbar.height
        width: 390  # Button width plus BoxLayout padding
        pos_hint: {'right':1}
        BoxLayout:
            id: bl_main
            orientation: 'vertical'
            size_hint_y: None
            height: self.minimum_height
            padding: [20, 20, 20, 20]
            spacing: 50
'''


class TestApp(MDApp):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(Builder.load_string(kv))
        return sm


TestApp().run()

请注意大小、位置的设置以及height: self.minimum_heightBoxLayout的使用。这背后的原因请参考ScrollView文档

我还评论了您对AnchorLayout的使用,因为它是多余的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61715319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档