如何使2个矩形选择器在相同的时间和相同的区域中移动

时间:2019-05-16 10:00:29

标签: wxpython python-3.6 matplotlib-widget

我需要定义两个同时在同一区域移动的矩形选择器,当我同时在另一区域移动时,我该怎么做呢?

这是一个简单的代码,在2个面板中有2个图和2个矩形

有可能使两个矩形同时移动,因为我在网络或matplotlib中找不到相应的例子

我将wxpython 4用于python3.6

import wx
from numpy import arange, sin, pi,cos
import numpy as np
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.widgets import RectangleSelector
from matplotlib.figure import Figure



class MainFrame(wx.Frame):
    def __init__(self, parent ):
        wx.Panel.__init__(self, parent,name="Main", size = (600,800))
        Top = PanelTop(self)
        Bottom = PanelBottom(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(Top, 1, wx.EXPAND)
        sizer.Add(Bottom, 1, wx.EXPAND)
        self.SetSizer(sizer)


class PanelTop(wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self,parent,size = (300,300))
        self.SetBackgroundColour('white')
        self.figure = Figure(figsize = (4,5))
        self.axes = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self,-1,self.figure)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)


        t = arange(0.5, 3.0, 0.01)
        s = cos(2 * pi * t)
        self.axes.plot(t, s)
        self.RS = RectangleSelector(self.axes,self.line_select_callback,
                                       drawtype='box', useblit=False,
                                       button=[1, 3],minspanx=1, minspany=1,
                                       spancoords='pixels',
                                       interactive=True, rectprops = dict(facecolor='None',edgecolor='red',alpha=5,fill=False))
        self.RS.to_draw.set_visible(True)
        self.RS.extents = (1,0,0,1)



    def line_select_callback(self, eclick, erelease):
         x1, y1 = eclick.xdata, eclick.ydata
         x2, y2 = erelease.xdata, erelease.ydata


class PanelBottom(wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self, parent, size = (300,300))
        self.SetBackgroundColour('grey77')
        self.figure = Figure(figsize = (4,5))
        self.axes = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self,-1,self.figure)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)

        t = arange(0.0, 3.0, 0.01)
        s = sin(2 * pi * t)
        self.axes.plot(t, s)
        self.RS = RectangleSelector(self.axes,self.line_select_callback,
                                       drawtype='box', useblit=False,
                                       button=[1, 3],minspanx=1, minspany=1,
                                       spancoords='pixels',
                                       interactive=True, rectprops = dict(facecolor='None',edgecolor='red',alpha=5,fill=False))
        self.RS.to_draw.set_visible(True)
        self.RS.extents = (1,0,0,1)



    def line_select_callback(self, eclick, erelease):
         x1, y1 = eclick.xdata, eclick.ydata
         x2, y2 = erelease.xdata, erelease.ydata



app = wx.App()
frame = MainFrame(None).Show()
app.MainLoop()

先谢谢您

1 个答案:

答案 0 :(得分:1)

我不知道这是否应该这样做,但这是一种方法。
我在适当的地方注释了代码。
该方法只是将第一个矩形的坐标拖入第二个矩形,然后将其重新绘制。
将第二个矩形设为“不活动”,因为如果它不是第一个and的从属,则它将成为第一个import wx from numpy import arange, sin, pi,cos import numpy as np from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas from matplotlib.widgets import RectangleSelector from matplotlib.figure import Figure class MainFrame(wx.Frame): def __init__(self, parent ): wx.Panel.__init__(self, parent,name="Main", size = (600,800)) self.Top = PanelTop(self) self.Bottom = PanelBottom(self) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.Top, 1, wx.EXPAND) sizer.Add(self.Bottom, 1, wx.EXPAND) self.SetSizer(sizer) class PanelTop(wx.Panel): def __init__(self,parent): wx.Panel.__init__(self,parent,size = (300,300)) self.SetBackgroundColour('white') self.figure = Figure(figsize = (4,5)) self.axes = self.figure.add_subplot(111) self.canvas = FigureCanvas(self,-1,self.figure) self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW) self.SetSizer(self.sizer) t = arange(0.5, 3.0, 0.01) s = cos(2 * pi * t) self.axes.plot(t, s) self.RS = RectangleSelector(self.axes,self.line_select_callback, drawtype='box', useblit=False, button=[1, 3],minspanx=1, minspany=1, spancoords='pixels', interactive=True, rectprops = dict(facecolor='None',edgecolor='red',alpha=5,fill=False)) self.RS.to_draw.set_visible(True) self.RS.extents = (1,0,0,1) def line_select_callback(self, eclick, erelease): x1, y1 = eclick.xdata, eclick.ydata x2, y2 = erelease.xdata, erelease.ydata rect = self.RS.artists[0] # Rectangle artist slave_rect = self.Parent.Bottom.RS.artists[0] # Rectangle artist slave_canvas = self.Parent.Bottom.canvas # Force new positional values into slave rectangle slave_rect.set_x(x1) slave_rect.set_y(y1) slave_rect.set_width(x2-x1) slave_rect.set_height(y2-y1) slave_rect.update(dict(facecolor='None',edgecolor='red',alpha=5,fill=False)) #Force visible in case slave rectangle has been clicked on slave_rect.set_visible(True) #Redraw slave rectangle slave_canvas.draw() class PanelBottom(wx.Panel): def __init__(self,parent): wx.Panel.__init__(self, parent, size = (300,300)) self.SetBackgroundColour('grey77') self.figure = Figure(figsize = (4,5)) self.axes = self.figure.add_subplot(111) self.canvas = FigureCanvas(self,-1,self.figure) self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW) self.SetSizer(self.sizer) t = arange(0.0, 3.0, 0.01) s = sin(2 * pi * t) self.axes.plot(t, s) self.RS = RectangleSelector(self.axes,self.line_select_callback, drawtype='box', useblit=False, button=[1, 3],minspanx=1, minspany=1, spancoords='pixels', interactive=False, rectprops = dict(facecolor='None',edgecolor='red',alpha=5,fill=False)) self.RS.to_draw.set_visible(True) self.RS.extents = (1,0,0,1) def line_select_callback(self, eclick, erelease): x1, y1 = eclick.xdata, eclick.ydata x2, y2 = erelease.xdata, erelease.ydata app = wx.App() frame = MainFrame(None).Show() app.MainLoop() 的从属,则拐角和中间的控制点将无法随该矩形一起移动。这使我相信,实现相同结果的方法可能不太可靠。

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.