Виджеты повторяются / дублируются в файле KV - PullRequest
0 голосов
/ 03 июля 2018

У меня есть пользовательский интерфейс, разработанный на языке KV, следующим образом:

<MainLayout>:
BoxLayout:
    orientation:"horizontal"
    BoxLayout:
        orientation:"vertical"
        Button:
            size_hint:(1,.9)
            text:"1"
        Button:
            size_hint:(1,.1)
            text:"2"

Вот сопровождающий py файл:

from kivy import Config
from kivy.app import App, Builder
from kivy.uix.boxlayout import BoxLayout

with open('gui.kv', 'r') as kv:
    Builder.load_string(kv.read())


class MainLayout(BoxLayout):
    def __init__(self, **kwargs):
        super(MainLayout, self).__init__(**kwargs)

class GuiApp(App):
    Config.set('graphics', 'resizable', '0')
    Config.set('graphics', 'width', '1600')
    Config.set('graphics', 'height', '1000')

    def build(self):
        self.title = "TestGUI"
        return MainLayout()

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

Я хочу асимметричный макет, где главное окно имеет два столбца, а левый столбец имеет два виджета (верхняя и нижняя половины), а правый столбец аналогичен. Каждый из виджетов в каждом столбце должен быть асимметричным по высоте.

По какой-то причине, приведенный выше дизайн продолжает «повторять» мою левую и правую половинки, нет «пустого» пространства. Я хотел два BoxLayout, по одному на каждый столбец. Мой <MainLayout> тоже BoxLayout. Я пытался сделать это GridLayout с cols:2, но я получаю аналогичные результаты.

Это мой вывод: Current output

Так, tl; dr, левая колонка точно верна, но она повторяется и для правой половины. Как я могу это изменить?

1 Ответ

0 голосов
/ 03 июля 2018

Проблема - два корневых виджета

Вы получаете повтор столбца, потому что есть два корневых виджета. Один из Builder.load_string(kv.read()) и другой из class GuiApp(), то есть Builder и именное соглашение соответственно.

Решение

Удалить следующее:

with open('gui.kv', 'r') as kv:
    Builder.load_string(kv.read())

Поскольку <MainLayout> является BoxLayout, вам не нужен другой BoxLayout. Пожалуйста, обратитесь к примеру для деталей.

Примечание

Как загрузить КВ

Существует два способа загрузки Kv-кода в ваше приложение:

По условному названию:

Kivy ищет файл Kv с тем же именем, что и ваш класс приложения в строчные, минус «приложение», если оно оканчивается на «приложение», например:

MyApp -> my.kv

Если этот файл определяет Root Widget, он будет прикреплен к приложению. корневой атрибут и используется в качестве основы дерева виджетов приложения.

By Builder Вы можете указать Kivy напрямую загружать строку или файл. Если эта строка или файл определяет корневой виджет, он будет возвращен метод:

Builder.load_file('path/to/file.kv')

или

Builder.load_string(kv_string)

Пример

test.kv

#:kivy 1.10.0

<MainLayout>:
    orientation:"horizontal"

    BoxLayout:
        orientation:"vertical"
        Button:
            size_hint:(1,.9)
            text:"1"
        Button:
            size_hint:(1,.1)
            text:"2"

    BoxLayout:
        orientation:"vertical"
        Button:
            size_hint:(1,.9)
            text:"3"
        Button:
            size_hint:(1,.1)
            text:"4"

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout


class MainLayout(BoxLayout):
    pass


class TestApp(App):

    def build(self):
        return MainLayout()


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

выход

Img01

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...