Как изменить цвет эллипса при нажатии кнопки на Kivy? - PullRequest
1 голос
/ 06 января 2020

Я застрял на том, как динамически изменять цвет некоторых элементов эллипса; Я положил все сгенерированные точки в список. Затем я хочу изменить их цвет:

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

from random import random
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.graphics import Color, Ellipse, Line

points = []

class MyPaintWidget(Widget):
    def __init__(self, **kwargs):
            self.size= [50,50]
            self.pos = [100,50]
            self.r = 0
            super(MyPaintWidget, self).__init__(**kwargs)

    def on_touch_down(self, touch):
        color = (self.r, 1, 1)
        with self.canvas:
            Color(*color, mode='hsv')
            d = 30.
            pts = Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d))
            points.append(pts)

class MyPaintApp(App):

    def build(self):
        parent = Widget()
        self.painter = MyPaintWidget()
        clearbtn = Button(text='Change Color')
        clearbtn.bind(on_release=self.change_color)
        parent.add_widget(self.painter)
        parent.add_widget(clearbtn)
        return parent

    def change_color(self, obj):
        print(len(points))
        points[0].r = 0.2 <= Error !

1 Ответ

1 голос
/ 07 января 2020

Ваш on_touch_down() метод добавляет графические инструкции на холст с каждым прикосновением. Чтобы изменить цвет всех Ellipses, вам необходимо изменить каждую из этих Color команд. Это может быть сделано, но более простой подход состоит в том, чтобы просто очистить холст и добавить новые графические инструкции, чтобы перерисовать все Ellipses новым цветом. Вот модифицированная версия вашего кода, которая делает это:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.graphics import Color, Ellipse


class MyPaintWidget(Widget):
    def __init__(self, **kwargs):
        super(MyPaintWidget, self).__init__(**kwargs)
        self.size= [50,50]
        self.pos = [100,50]
        self.d = 30
        self.r = 0          # the hue
        self.ellipses = []  # a list of points for the Ellipses

    def redraw(self):
        # method to clear the canvas and redraw all the Ellipses with new hue
        self.canvas.clear()
        with self.canvas:
            Color(self.r, 1, 1, mode='hsv')
            for pt in self.ellipses:
                Ellipse(pos=pt, size=(self.d,self.d))

    def on_touch_down(self, touch):
        # just add a new position to the list and redraw
        self.ellipses.append((touch.x - self.d / 2, touch.y - self.d / 2))
        self.redraw()


class MyPaintApp(App):
    def build(self):
        parent = Widget()
        self.painter = MyPaintWidget()
        clearbtn = Button(text='Change Color')
        clearbtn.bind(on_release=self.change_color)
        parent.add_widget(self.painter)
        parent.add_widget(clearbtn)
        return parent

    def change_color(self, obj):
        print(len(self.painter.ellipses))
        self.painter.r = 0.2  # change the hue
        self.painter.redraw() # and redraw


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