J'essaie de créer une application avec une grille d'arrière-plan et une couche supérieure d'éléments interactifs, j'ai du mal à superposer la deuxième couche via python, donc comme le titre le dit, y a-t-il un moyen de superposer 2 ou plusieurs dispositions dans Kivy en?

Voici ce que je recherche

overlay 2 layouts kivy

1
Keno 11 mars 2019 à 22:26

2 réponses

Meilleure réponse

Solution

Définissez le opacity du premier calque / mise en page sur 0,5

Classe de widgets » opacité

opacité

Opacité du widget et de tous ses enfants.

L'attribut opacity contrôle l'opacité du widget et de ses enfants. Attention, c'est un attribut cumulatif : la valeur est multipliée par l'opacité globale courante et le résultat est appliqué à la couleur de contexte courante.

...

l'opacité est une NumericProperty et est par défaut à 1.0 .

Kivy Graphics Line » points

points : liste

Liste des points au format (x1, y1, x2, y2…)

Propriété pour obtenir/définir les points de la ligne

Avertissement

Cela reconstruira toujours l'ensemble des graphiques à partir de la nouvelle liste de points. Cela peut coûter très cher au processeur.

Kivy Graphics Line » cercle

cercle

Utilisez cette propriété pour construire un cercle, sans calculer les points. Vous pouvez uniquement définir cette propriété, pas l'obtenir.

L'argument doit être un tuple de (center_x, center_y, radius, angle_start, angle_end, segments) :

  • center_x et center_y représentent le centre du cercle
  • rayon représente le rayon du cercle
  • (facultatif) angle_start et angle_end sont en degrés. La valeur par défaut est 0 et 360.
  • (facultatif) segments est la précision de l'ellipse. La valeur par défaut est calculée à partir de la plage entre les angles.

Notez que c'est à vous de fermer le cercle ou non.

Exemple

Main.py - sans kv

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 - en utilisant kv et 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)

'''))

Production

Overlay 2 layouts

2
ikolim 12 mars 2019 à 18:33

Pour compléter la réponse en python, les superpositions n'ont pas été redimensionnées lorsque la fenêtre a changé de taille, voici donc ma solution:

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()


0
Keno 13 mars 2019 à 07:21