Изменение наложения круга с помощью кнопки Python Chaco - PullRequest
0 голосов
/ 05 декабря 2018

Итак, у меня есть этот интерфейс, где на изображении есть два наложения круга.Эти круги расположены рядом с двумя кнопками A и B. По умолчанию это круги красного цвета.Когда пользователь нажимает на кнопку, круг просто меняет цвет на зеленый.Я нашел код, использующий Chaco в Python, здесь, которым я манипулировал для своего собственного проекта, однако для простоты я могу использовать код, который я начал с того, что ищу ранее здесь.

import sys
import numpy as np
from traits.api import HasTraits, Instance
from traits.api import Bool, Tuple, Float
from traitsui.api import View, Item
from enable.api import Component, ComponentEditor
from chaco.api import Plot, ArrayPlotData
from chaco.api import AbstractOverlay, BaseTool

class CircleTool(AbstractOverlay,BaseTool):

    _select_on = Bool(False)
    _select_center = Tuple((0,0))
    _select_radius = Float(0)

    def __init__(self,component=None,**kwargs):
        AbstractOverlay.__init__(self,component=component,**kwargs)
        BaseTool.__init__(self,component=component,**kwargs)

    def center_selection(self,event):
        '''
        set selection flag to True; save circle center; CircleTool to the
        overlays list of component (plot); discard event.
        '''
        # self._select_on = True
        self._select_center = (event.x,event.y)
        self.component.overlays.append(self)
        event.handled = True
        xc, yc = self._select_center
        xp, yp = (event.x,event.y)
        self._select_radius = float(np.sqrt((xc-xp)**2 + (yc-yp)**2))
        self.component.request_redraw()

    def overlay(self,component,gc,view_bounds=None,mode='normal'):

        gc.set_line_width(2)
        gc.set_stroke_color((0,0,0))
        gc.clip_to_rect(component.x, component.y, component.width, component.height)
        gc.arc(self._select_center[0],self._select_center[1],self._select_radius,0,2*np.pi)
        gc.stroke_path()


class CircleOverlay(AbstractOverlay):
    '''
    basic test overlay: red circle at (200,300) with radius 50.
    '''
    def overlay(self,component,gc,view_bounds=False,mode='normal'):
        gc.set_stroke_color((1,0,0))
        gc.set_line_width(2)
        gc.arc(200,300,50,0,2*np.pi)
        gc.stroke_path()


class PlotExample(HasTraits):
    plot = Instance(Component)
    traits_view = View(Item('plot',editor=ComponentEditor()),
                       width=500,height=500,resizable=True,
                       title='TEST-CIRCLE-TOOL')

    def __init__(self,*args,**kwargs):
        super(PlotExample,self).__init__(*args,**kwargs)
        # create plot
        x = np.linspace(0,2*np.pi,100)
        y = np.sin(x)
        plotData = ArrayPlotData(x=x,y=y)
        plot = Plot(plotData)
        plot.plot(('x','y'),type='line')

        # append circle tool
        circleTool = CircleTool(component=plot)
        plot.tools.append(circleTool)

        # append circle overlay
        circleOverlay = CircleOverlay(component=plot)
        plot.overlays.append(circleOverlay)

        # save plot for later
        self.plot = plot

if __name__ == '__main__':
    plotExample = PlotExample()
    plotExample.configure_traits()

Из другогофайл, пользователь будет нажимать кнопку QPush с надписью изменить цвет наложения на зеленый, но я не смог найти ничего, что делает это.В любом случае, я бы смог это сделать?Я думал о создании нового класса оверлея, но не уверен, что это лучший способ сделать это.

...