Kivy \\ 如何将按钮绑定到 boxlayout 的底部

Posted

技术标签:

【中文标题】Kivy \\\\ 如何将按钮绑定到 boxlayout 的底部【英文标题】:Kivy \\ How to tie a button to the bottom of the boxlayoutKivy \\ 如何将按钮绑定到 boxlayout 的底部 【发布时间】:2018-10-29 18:25:03 【问题描述】:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.uix.scrollview import ScrollView
from kivy.effects.scroll import ScrollEffect
from kivy.uix.widget import Widget
from kivy.uix.button import Button


class BSGameMain(BoxLayout):
    blmain = BoxLayout(orientation = 'vertical') # MainBoxLayout init

    scrlFBtns = ScrollView(effect_cls = 'ScrollEffect')

    blbtns = BoxLayout(
        orientation = 'vertical',
        size_hint_y = None
        ) # BoxLayout for buttons

    blbtns.bind(minimum_height = blbtns.setter('height'))
    scrlFBtns.add_widget(blbtns)

    for i in range (2):
        blbtns.add_widget(Button(
            text='asd',
            size_hint_y = None,
            height = 40
            ))

    lblmain = Label(text = 'asd')
    blmain.add_widget(lblmain)
    blmain.add_widget(scrlFBtns)


class BSApp(App):
    def build(self):
        game = BSGameMain()
        return game.blmain

if __name__ == "__main__":
    BSApp().run()

考虑到滚动视图,有必要使按钮从下方出现,而不是从中间出现。我就是不能让他这么做。

【问题讨论】:

【参考方案1】:

请记住,BoxLayouts 会覆盖对定位的修改,因为它们会自动定位其子项。这使他们非常自给自足,但与他们一起工作有点固执。

就像你说的,如果只有几个按钮,它会粘在中间。滚动视图有效,但由于它是 boxlayout 的子项,它只能拉伸到 boxlayout 所说的范围,即窗口的下半部分。此外,由于按钮的 boxlayout 自上而下添加子元素,这就是按钮出现在中间的原因。实际上,它是在窗口的下半部分的顶部添加按钮。

您已指定不需要 boxlayouts 的 boxlayouts。您可能想要的一件事是随意放置滚动视图,具体取决于滚动视图中按钮的数量。这将需要一个 if 语句和一个整数。

我的改变:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.uix.scrollview import ScrollView
from kivy.effects.scroll import ScrollEffect
from kivy.uix.widget import Widget
from kivy.uix.button import Button

class BSGameMain(): #No longer a boxlayout.
    scroll_height = 0;
    blmain = Widget() #No longer a boxlayout. Fills the window.

    blbtns = BoxLayout(
        orientation = 'vertical',
        size_hint = (1, None),
        ) # BoxLayout for buttons

    blbtns.bind(minimum_height = blbtns.setter('height'))

    for i in range (20):     #number of buttons printed
        blbtns.add_widget(Button(
            text='asd',
            size_hint_y = None,
            height = 40
            ))
        if (scroll_height < (Window.height / 2)):
            scroll_height = scroll_height + 40      #This measures how much space we need for the scrollview. Make sure it matches button height!

    scrlFBtns = ScrollView(effect_cls = 'ScrollEffect', pos = (0, 0), size = (Window.width, scroll_height)) 
    #The pos of 0,0 ensures scrlFBtns stays at the bottom. Place at negative coordinates if you want it to extend off-screen.
    scrlFBtns.add_widget(blbtns)
    lblmain = Label(text = 'asd', halign = 'center', y = (Window.height * 0.75), width = Window.width, color = (1,1,1,1))

    blmain.add_widget(lblmain)
    blmain.add_widget(scrlFBtns)

class BSApp(App):
    def build(self):
        game = BSGameMain()
        return game.blmain

if __name__ == "__main__":
    BSApp().run()

结果:

一个按钮

,

三个按钮

,

二十个按钮

希望这符合您的要求!

【讨论】:

以上是关于Kivy \\ 如何将按钮绑定到 boxlayout 的底部的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 kivy 按钮的绑定函数

将函数绑定到kivy中的按钮

将按钮绑定到从 Kivy 到 python 的回调

如何在 Python/Kivy 中实现 ScrollView

Kivy - 如何在激活时将功能绑定到复选框

在 Kivy 中使用切换按钮绑定函数