Динамически меняющиеся цвета прямоугольников - PullRequest
0 голосов
/ 26 марта 2019

В приведенном ниже примере на холсте FloatLayout нарисованы два прямоугольника.

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

Так что в этом демонстрационном примере я просто хочу изменить цвет прямоугольника под мышью.

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.graphics import Color, Rectangle

KV = """
FloatLayout
    size_hint: None, None
    size: 512, 512
    on_touch_down: app.test(*args[1].pos)
"""


class MyApp(App):

    color = ListProperty((1,1,1,1))

    def build(self):
        self.root = Builder.load_string(KV)

        self.init_rects()

    def init_rects(self):
        with self.root.canvas:
            x,y = self.root.pos
            w,h = self.root.size

            Color(rgba=(1,1,1,1))
            self.r1 = Rectangle(pos = (x,y), size= (w/2,h))
            Color(rgba=(1,0,0,1))
            self.r2 = Rectangle(pos = (w/2,y), size= (w/2,h))

    def test(self, x,y):
        if x< self.root.center_x:
            print ('I need to color this rectangle (self.r1) to red')
        else:
            print ('I need to color this rectangle (self.r2) to white')

MyApp().run()

В этом примере я храню прямоугольники как self.r1 и self.r2 (потому чтоЯ думаю, что в дальнейшем мне нужно будет изменить их pos или размер)

Проблема в том, что я не нашел пример того, как изменить только один цвет прямоугольника, а не изменить другие цвета.

У меня есть глупое решение (ниже) - каждый раз создавать новый прямоугольник.Но я уверен, что это плохое решение, когда будет много прямоугольников

    def test(self, touch_x, touch_y):
        with self.root.canvas:

            x,y = self.root.pos
            w,h = self.root.size

            if touch_x< self.root.center_x:
                Color(rgba=(1,0,0,1))
                self.r1 = Rectangle(pos = (x,y), size= (w/2,h))
            else:
                Color(rgba=(1,1,1,1))
                self.r2 = Rectangle(pos = (w/2,y), size= (w/2,h))

Грубо говоря, я пропускаю что-то вроде Rectangle(rgba=...)

Что может быть решением в этом случае

1 Ответ

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

Вы можете изменить Color вместо попытки изменить Rectangle.Вот модификация вашего кода, которая демонстрирует это:

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.graphics import Color, Rectangle

KV = """
FloatLayout
    size_hint: None, None
    size: 512, 512
    on_touch_down: app.test(*args[1].pos)
"""


class MyApp(App):

    color = ListProperty((1,1,1,1))

    def build(self):
        self.root = Builder.load_string(KV)

        self.init_rects()

    def init_rects(self):
        with self.root.canvas:
            x,y = self.root.pos
            w,h = self.root.size

            self.c1 = Color(rgba=(1,1,1,1))
            Rectangle(pos = (x,y), size= (w/2,h))
            self.c2 = Color(rgba=(1,0,0,1))
            Rectangle(pos = (w/2,y), size= (w/2,h))

    def test(self, x,y):
        if x< self.root.center_x:
            print ('I need to color this rectangle (self.r1) to red')
            self.c1.rgba = (1,0,0,1)
        else:
            print ('I need to color this rectangle (self.r2) to white')
            self.c2.rgba = (1,1,1,1)

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