Kivy Scatter z-index

1

Я пытаюсь сделать приложение kivy для моделирования простой экосистемы, с видом интерактивной карты, которую можно масштабировать и позиционировать путем перетаскивания пользователем. Мой первый подход к достижению этого - использовать виджет Kivy Scatter, который, похоже, удовлетворяет этим требованиям. Здесь мой код (чтобы он был простым, просто gui с кнопками и картой справа, с большим красным прямоугольником):

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.graphics import Rectangle, Color

class GUI(BoxLayout):

    board = ObjectProperty(None)

    def draw(self):
        with self.board.canvas:
            Color(1,0,0)
            Rectangle(pos=(0,0),size=(300,300))

class TestApp(App):

    def build(self):
        gui = GUI()
        gui.draw()
        return gui

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

и мой.kv файл:

#:kivy 1.0.9


<GUI>:
    board: scatter_board
    orientation: 'horizontal'
    spacing: 30
    padding: 30
    BoxLayout:
        size_hint: 0.25, 1
        orientation: 'vertical'
        Button:
            text: 'Start/Resume'
        Button:
            text: 'Stop'
    Scatter:
        id: scatter_board
        size_hint: 0.75,1

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

  • установить разброс 'auto_bring_to_front' на False
  • используя свойство "index" как родителя, так и родителя BoxLayout для управления z-index.

Поэтому в основном я хочу, чтобы "карта" не затеняла кнопку, а оставалась ниже нее. Можно ли добиться этого эффекта с помощью Scatter? Или это неправильный вариант использования разброса, и я должен изменить подход? Если да, знаете ли вы какие-либо схожие и, возможно, простые способы?

Теги:
kivy
user-interface

1 ответ

0

для достижения желаемого результата вам необходимо использовать FloatLayout в вашем файле kv.

<GUI>:
    BoxLayout:
        Scatter:
            Board:
                canvas:
                    Rectangle:
                        size: (100,300)
    BoxLayout:
        orientation :"vertical"
        Button:
            text: "gi"
        Button:
            text: "gi"

добавьте это в основной файл

class GUI(BoxLayout):
    board = ObjectProperty(None)

    # def draw(self):
    #     with self.board.canvas:
    #         Color(1,0,0)
    #         Rectangle(pos=(0,0),size=(300,300))

class Board(Widget):
    pass

class TestApp(App):
    def build(self):
        gui = GUI()
        # gui.draw()
        return gui

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

не забывайте импортировать FloatLayout, Изображение 174551

  • 0
    Извините, я не совсем понимаю, откуда появляется FloatLayout, так как его нет в коде, не могли бы вы объяснить это?
  • 0
    я удалил его, так что я думаю, что здесь нет ничего общего, я изначально использовал его в позиционировании виджетов
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню