ScrollView kivy

问题描述 投票:0回答:1

我有Python代码:

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代码:

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小部件不起作用?

我如何纠正这两点?

[请帮助我。

python kivy scrollview
1个回答
0
投票

您的图标按钮不起作用,因为您在ScrollView中添加的on_enter()的默认size_hint为(1,1),因此会填充整个Screen3(即使[ C0]是透明的)。 ScrollView会抓住鼠标的点击,因此图标按钮从不会看到鼠标的点击。

[以类似的方式,ScrollView(bl_main)也具有默认的BoxLayout,因此它的高度将是size_hint的高度,并且它将尝试将20 ScrollView装入该Buttons ]。每个height都获得其高度的份额,这是不够的,因此它们重叠。

解决方法是在Button中构建ScrollViewBoxLayout以利用自动绑定并设置其大小。这是执行此操作的代码版本:

kv

注意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_height的使用。有关此原因,请参考BoxLayout

我也已注释掉您对ScrollView documentation的使用,因为它是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.