Киви: разброс внутри разброс - PullRequest
0 голосов
/ 18 мая 2018

Вопрос: Как поместить один Scatter в другой Scatter?

У меня возникли проблемы с координатами Киви.В принципе я хотел бы иметь Scatter в Scatter.Они должны быть ужасными (перемещение первого рассеяния перемещает все, перемещение второго рассеяния перемещает второе рассеивание внутри первого рассеяния).

Конкретная установка

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

  2. Затем я хотел бы нарисоватьсетка в верхней части карты, которая может быть перемещена сама по себе (разброс 2).

  3. Затем я добавляю некоторую точку на разброс 2.

  4. Относительные позиции должны быть сохранены при изменении масштаба окна.

Ожидаемое поведение

Когда я беру разброс 2, его можно перемещать, а точки (3.) остаются относительно разброса 2. Когда я беру разброс 1, он должен перемещать все разброс2 и точки остаются на карте (разброс 1).

Базовый пример кода

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

kv = """
<MyRoot>:
    orientation: 'vertical'
    ActionBar:
        ActionView:
            ActionPrevious:
                title: ''
                with_previous: True
            ActionOverflow:
                ActionButton:
                    text: 'Preferences'
                    on_press: app.open_settings()
    Scatter:
        canvas:
            Color:
                rgb: .2, .2, .3
            Rectangle:
                pos: self.pos
                size: self.size
        Scatter:

            canvas:
                Color:
                    rgb: .8, .2, .3
                Rectangle:
                    pos: self.pos
                    size: self.size
            Widget:
                pos: 200, 200
                canvas:
                    Color:
                        rgb: .1, .7, .3
                    Ellipse:
                        pos: 30,50
                        size: 10, 10
"""
Builder.load_string(kv)


class MyApp(App):
    def build(self):
        return MyRoot()


class MyRoot(BoxLayout):
    pass


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

Также вот изображение того, что происходит.Я хотел бы, чтобы зеленая точка была зафиксирована на красном разбросе, а красный разброс находился внутри фиолетового: enter image description here

Подход

Полагаю, мне нужнопреобразовывать координаты на каждом шаге и перезаписывать функции on_touch_..., возможно, используя self.parent.to_parent(*touch.pos), но, к сожалению, мне не удается соединить все вместе.

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 19 мая 2018
Rectangle:
    size: self.size

Это относительный макет, поэтому нам нужно: pos: 0,0, а не pos: self.pos.

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