Итак, у меня есть этот интерфейс, где на изображении есть два наложения круга.Эти круги расположены рядом с двумя кнопками 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 с надписью изменить цвет наложения на зеленый, но я не смог найти ничего, что делает это.В любом случае, я бы смог это сделать?Я думал о создании нового класса оверлея, но не уверен, что это лучший способ сделать это.