Встраивание GridLayout в RelativeLayout - PullRequest
1 голос
/ 30 января 2020

Я борюсь с Kivy, чтобы заставить его правильно отображать кнопки. Я хочу создать сетку кнопок, созданных в для l oop и отображать их в сетке внутри RelativeLayout. Это приводит к тому, что кнопки складываются одна над другой. Пожалуйста, смотрите ниже:

Main.py:

import kivy
from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
from kivy.lang.builder import Builder
from kivy.uix.button import Button

Builder.load_file('TopMenu.kv')
Builder.load_file('BottomMenu.kv')
Builder.load_file('Center.kv')
Builder.load_file('Left.kv')

class mainHolder(AnchorLayout):
    pass

class MainApp(App):
    def build(self):
        self.title = "NAZWA APLIKACJI"
        #return Label(text = "Hello, world")
        return mainHolder()


if __name__ == '__main__':
    MainApp().run()

Main.kv

<MainHolder>:
    anchor_x: 'left'
    anchor_y: 'top'
    BoxLayout:
        orientation: 'vertical'
        #anchor_x: 'left'
        #anchor_y: 'top'

        TopMenu:
            id: _top_menu
            #size_hint: 1, 0.1
            #height: 0, 1
            canvas.before:
                Color:
                    rgba:0.5, 0.5, 0.5, 0.5
                Rectangle:
                    pos: self.pos
                    size: self.size
        Center:
        BottomMenu:

center.kv:

<Center@GridLayout>:
    cols: 2
    size_hint: 1, 1
    Left:
    Label:
        text: 'prawa'

Слева. py:

from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.button import Button

class Left(RelativeLayout):
    def __init__(self, **kwargs):
        super(RelativeLayout, self).__init__(**kwargs)
        print("Left is alive!")

        for i in range(0, 11):
            print("Adding button: " + str(i))
            but = Button(text="X" + str(i))
            self.add_widget(but)

и, наконец, left.kv:

#:import Left Left
<Left>:
    size_hint: 1.3, 1
    pos_hint: 1, 1

Этот подход создает следующее: StackBtns Я пытался изменить RelativeLayout на GridLayout , но затем кнопки выглядят примерно одинаково, с той разницей, что они находятся в самом нижнем левом углу, поэтому я думаю, что RelativeLayout - хороший способ начать располагать их в нужном месте.

Итак, я добавил вручную GridLayout внутри Left.kv, как показано ниже:

<Left>:
    size_hint: 1.3, 1
    pos_hint: 1, 1

    GridLayout:
        cols: 4
        Button:
            text: "t2"
        Button:
            text: "t2"
        Button:
            text: "t2"
        Button:
            text: "test"

И это прекрасно работает. Следуя этому, я создал другой класс, на этот раз GridLayout, но это не сработало вообще - извините, у меня больше нет кода, я удалил его, так как он был бесплодным. Кроме того, добавление GridLayout, как показано выше, не приводит к тому, что add_widget () добавляет его в нужное место. Ребята, вы можете мне помочь? Я серьезно расстроен этим, и Google не дает никакого разумного ответа. Я предполагаю, что это может быть неправильный подход с самого начала разработки этого приложения, но, честно говоря, я понятия не имею, каким может быть «хороший» момент.


Джон Андерсон, спасибо! Это работает как шарм. Я был так близко, но так далеко, я бы никогда этого не нашел. Ура! : -)

1 Ответ

2 голосов
/ 30 января 2020

Я думаю, что использование GridLayout - разумный подход. Я немного изменил ваш Left класс, чтобы сделать это:

from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button

class Left(GridLayout):
    def __init__(self, **kwargs):
        # corrected the call to super
        super(Left, self).__init__(**kwargs)

        print("Left is alive!")

        # set the number of columns in this grid
        self.cols = 5

        for i in range(0, 11):
            print("Adding button: " + str(i))
            but = Button(text="X" + str(i))
            self.add_widget(but)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...