Kivy Treeview Позиции Проблемы - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь создать макет с двумя разделами, которые имеют надписи над каждым и вид внизу (TreeView слева и окно, показывающее подробности справа, например, «нажмите на этот узел и посмотрите детали»),У меня есть размеры и расположение меток, но когда я добавляю TreeView, вместо того, чтобы помещаться под меткой, он переворачивает обе метки, независимо от их положения.

Вот текущий результат: enter image description here

Мой main.py файл -

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.treeview import TreeView, TreeViewLabel


class MainScreen(BoxLayout):

    def __init__(self, **kwargs):
        super(MainScreen, self).__init__(**kwargs)

        bridge_view = TreeView(root_options=dict(text='Clients'),
                               hide_root=False, indent_level=4,
                               pos_hint={"x": 0, "y": 0},
                               size_hint=(0.1, 0.5))

        clients = {'client1': 'Connection A',
                   'client2': 'Connection B'}

        for client in clients.keys():
            node = bridge_view.add_node(TreeViewLabel(text=client))
            bridge_name = clients[client]
            bridge = bridge_view.add_node(TreeViewLabel(text=bridge_name), node)

        self.add_widget(bridge_view)



class ConnectionApp(App):

    def build(self):
        self.title = 'My Support App'
        return MainScreen()

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

Это мой файл kv -

<Label>:
    font_size: 30


<MainScreen>:

    Label:
        text: "Connections"
        size_hint: 0.1, 0.5
        pos_hint: {"left": 0.2, "top": 1.2}
        color: 1,0,1,1
        outline_color: 1,0,1,1


    Label:
        text: "Modules"
        size_hint: 0.1, 0.5
        pos_hint: {"right": 0.2, "top": 1.2}

Еще одна вещь, которая кажется мне странной, заключалась в том, как мне пришлось использовать pos_hint, чтобы заставить интервал между метками работать.Насколько я понимаю, эти значения должны быть в масштабе 0-1. учебное пособие Я прочитал столько, сколько указано -

Pos_hint дает подсказку в позиции, которая измеряется относительно между 0 и 1, где 1 «полностью» что-то и 0"не" ли это что-то.

Кто-нибудь знает, почему потребовалось использовать значение больше 1 для "top", чтобы получить эти метки сверху?Я предполагаю, что это может быть намек на то, почему мой макет не отображается правильно.

1 Ответ

0 голосов
/ 08 июня 2018

TreeView под Labels

Решение состоит в том, чтобы использовать GridLayout как дочерний элемент BoxLayout (корневой виджет, MainScreen), Labels и TreeViews как дочерний элемент GridLayout.Добавлен ObjectProperty container, чтобы подключить его к виджету GridLayout (заполнитель для виджета TreeView), созданному в файле kv.Пожалуйста, к примеру для подробностей.

Пример - TreeView под метками

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.treeview import TreeView, TreeViewLabel
from kivy.properties import ObjectProperty
from kivy.lang import Builder

Builder.load_string('''
#:kivy 1.10.0

<Label>:
    font_size: 30


<MainScreen>:
    container: tree_view
    orientation: 'vertical'

    GridLayout:
        cols: 2
        size_hint: 0.5, 0.1

        Label:
            canvas.before:
                Color:
                    rgba: 1, 0, 0, 1    # red
                Rectangle:
                    size: self.size
                    pos: self.pos
            text: "Connections"
            color: 1,0,1,1
            outline_color: 1,0,1,1


        Label:
            canvas.before:
                Color:
                    rgba: 0, 0, 1, 1    # blue
                Rectangle:
                    size: self.size
                    pos: self.pos
            text: "Modules"

    GridLayout:
        cols: 1
        id: tree_view
''')


class MainScreen(BoxLayout):
    container = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(MainScreen, self).__init__(**kwargs)

        bridge_view = TreeView(root_options=dict(text='Clients'),
                               hide_root=False, indent_level=4,
                               pos_hint={"x": 0, "y": 0},
                               size_hint=(0.1, 0.5))

        clients = {'client1': 'Connection A',
                   'client2': 'Connection B'}

        for client in clients.keys():
            node = bridge_view.add_node(TreeViewLabel(text=client))
            bridge_name = clients[client]
            bridge = bridge_view.add_node(TreeViewLabel(text=bridge_name), node)

        self.container.add_widget(bridge_view)


class DemoApp(App):
    def build(self):
        return MainScreen()


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

Вывод - TreeView под метками

Img01 - TreeView under Labels

pos_hint: {'top': 1}

Причина, по которой вы должны использовать значение больше 1 для top, поскольку высота виджета Label равна 0,5 (size_hint: 0.1, 0.5).Решение использовать pos_hint: {'top': 1} состоит в том, чтобы уменьшить size_hint_y, как показано во фрагментах.

В моем примере цвет холста Label был добавлен для визуализации / демонстрации.

Snippets

Label:
    ...
    size_hint: 0.1, 0.1
    pos_hint: {"top": 1}

Пример - pos_hint

kv file

#:kivy 1.10.0

<Label>:
    font_size: 30


<MainScreen>:

    Label:
        canvas.before:
            Color:
                rgba: 1, 0, 0, 1    # red
            Rectangle:
                size: self.size
                pos: self.pos
        text: "Connections"
        size_hint: 0.1, 0.1
        pos_hint: {"left": 0.2, "top": 1}
        color: 1,0,1,1
        outline_color: 1,0,1,1


    Label:
        canvas.before:
            Color:
                rgba: 0, 0, 1, 1    # blue
            Rectangle:
                size: self.size
                pos: self.pos
        text: "Modules"
        size_hint: 0.1, 0.1
        pos_hint: {"right": 0.2, "top": 1}

Вывод - pos_hint

Img01 - pos_hint

...