Как наложить 2 макета в Kivy (Python)? - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь создать приложение с фоновой сеткой и верхним слоем интерактивных элементов, у меня возникают проблемы с наложением второго слоя через python, поэтому, как видно из названия, есть способ наложения двух или более макетов в Kivy в?

Вот что я ищу

overlay 2 layouts kivy

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Решение

Установите opacity первого слоя / макета на 0,5

Класс виджетов »Непрозрачность

Непрозрачность

Непрозрачность виджета и всех его дочерних элементов.

Атрибут opacity контролирует прозрачность виджета и его дети. Будьте осторожны, это кумулятивный атрибут: значение умножается на текущую глобальную непрозрачность, и результат применяется к текущий цвет контекста.

...

Непрозрачность

равна NumericProperty и по умолчанию равна 1,0.

Kivy Graphics Line »точки

баллов: список

Список точек в формате (x1, y1, x2, y2…)

Свойство для получения / настройки точек линии

Внимание

Это всегда реконструирует всю графику из новых точек список. Это может быть очень дорого CPU.

Kivy Graphics Line »круг

круг

Используйте это свойство, чтобы построить круг, не вычисляя точки. Вы можете только установить это свойство, но не получить его.

Аргумент должен быть кортежем (center_x, center_y, radius, angle_start, angle_end, сегменты):

  • center_x и center_y представляют центр круга
  • радиус представляет радиус круга
  • (необязательно) angle_start и angle_end в градусах. Значением по умолчанию является 0 и 360.
  • (опционально) сегменты - это точность эллипса. Значение по умолчанию рассчитывается из диапазона между углами.

Обратите внимание, что вам решать, закрывать круг или нет.

Пример

main.py - без кв

from kivy.base import runTouchApp
from kivy.core.window import Window
from kivy.uix.screenmanager import Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Color, Line
from kivy.metrics import dp

Window.clearcolor = (1, 1, 1, 1)


class Overlay2Layouts(Screen):

    def __init__(self, **kwargs):
        super(Overlay2Layouts, self).__init__(**kwargs)
        self.size = Window.size

        layout1 = BoxLayout(opacity=0.5)
        with layout1.canvas:
            Color(1, 0, 0, 1)   # red colour
            Line(points=[self.center_x, self.height / 4, self.center_x, self.height * 3/4], width=dp(2))
            Line(points=[self.width * 3/ 4, self.center_y, self.width /4, self.center_y], width=dp(2))

        layout2 = BoxLayout()
        with layout2.canvas:
            Color(0, 0, 0, 1)   # black colour
            Line(circle=[self.center_x, self.center_y, 190], width=dp(2))

        self.add_widget(layout1)
        self.add_widget(layout2)


if __name__ == "__main__":
    runTouchApp(Overlay2Layouts())

main.py - с использованием kv и Python

from kivy.lang import Builder
from kivy.base import runTouchApp
from kivy.core.window import Window

Window.clearcolor = (1, 1, 1, 1)

runTouchApp(Builder.load_string('''
#:kivy 1.11.0

Screen:
    BoxLayout:
        opacity: 0.5
        canvas.before:
            Color:
                rgba: 1, 0, 0, 1
            Line:
                width: dp(2.)
                points: [self.center_x, self.height / 4, self.center_x, self.height * 3/4]
            Line:
                width: dp(2.)
                points: [root.width * 3/ 4, self.center_y, root.width /4, self.center_y]
    BoxLayout:
        canvas.before:
            Color:
                rgba: 1, 0, 0, 1
            Line:
                width: dp(2.)
                circle: (root.center_x, root.center_y, 190)

'''))

выход

Overlay 2 layouts

0 голосов
/ 13 марта 2019

Чтобы дополнить ответ в python, наложения не изменились, когда окно изменило размер, так что это мое решение:

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.graphics import Color, Line, Ellipse, Rectangle
from kivy.metrics import dp


class RootWidget(BoxLayout):

    def __init__(self, *args, **kwargs):
        BoxLayout.__init__(self, *args, **kwargs)
        self.bind(pos=self.draw)
        self.bind(size=self.draw)
        self.layout1 = BoxLayout(opacity=0.3)
        self.layout2 = BoxLayout()
        self.add_widget(self.layout1)
        self.add_widget(self.layout2)

    def draw(self, *args):
        with self.canvas.before:
            Color(1,1,.5,1)
            self.bg = Rectangle(pos=self.pos, size=self.size)
        self.layout1.canvas.clear()
        with self.layout1.canvas:
            Color(1, 0, 0, 1)   # red colour
            Line(points=[self.center_x, self.height / 4, self.center_x, self.height * 3/4], width=dp(2))
            Line(points=[self.width * 3/ 4, self.center_y, self.width /4, self.center_y], width=dp(2))
        self.layout2.canvas.clear()
        with self.layout2.canvas:
            Color(0, 0, 0, 1)   # black colour
            Line(circle=[self.center_x, self.center_y, 190], width=dp(2))


class Overlays_3(App):
    title = "Overlays_3"

    def build(self):
        return RootWidget()


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


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