Kivy \\ Как привязать пуговицу к нижней части коробки - PullRequest
0 голосов
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()

Необходимо сделать так, чтобы кнопки появлялись снизу, а не посередине, учитывая вид прокрутки.Я просто не могу заставить его сделать это.

Screenshot

1 Ответ

0 голосов
/ 21 мая 2018

Имейте в виду, что BoxLayouts переопределяет изменения в позиционировании, поскольку они автоматически позиционируют своих дочерних элементов.Это делает их достаточно самодостаточными, но немного упрямыми для работы.

Как вы сказали, если есть только пара кнопок, она придерживается середины.Представление прокрутки работает, но, поскольку оно является дочерним элементом для boxlayout, оно может растягиваться только до уровня, указанного в boxlayout, который является нижней половиной окна.Кроме того, поскольку расположение кнопок для кнопок добавляет дочерние элементы сверху вниз, именно поэтому ваши кнопки отображаются посередине.На самом деле, это добавляет кнопки в верхнюю часть нижней половины окна.

Вы указали раскладки, где раскладки не нужны.Одна вещь, которую вы могли бы хотеть, это расположить ваше представление прокрутки по желанию, в зависимости от количества кнопок в просмотре прокрутки.Для этого потребуется оператор 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()

Результаты:

Одна кнопка

,

Три кнопки

,

Двадцать кнопок

Надеюсь, это то, что выищу!

...