# Buggy code
def setup_and_check(self, data, title="", readonly=False, xlabels=None, ylabels=None):
    """
    Setup ArrayEditor:
    return False if data is not supported, True otherwise
    """
    self.data = data
    self.data.flags.writeable = True
    is_record_array = data.dtype.names is not None
    is_masked_array = isinstance(data, np.ma.MaskedArray)

    if data.ndim > 3:
        self.error(_("Arrays with more than 3 dimensions are not supported"))
        return False
    if xlabels is not None and len(xlabels) != self.data.shape[1]:
        self.error(_("The 'xlabels' argument length do no match array column number"))
        return False
    if ylabels is not None and len(ylabels) != self.data.shape[0]:
        self.error(_("The 'ylabels' argument length do no match array row number"))
        return False
    if not is_record_array:
        dtn = data.dtype.name
        if (
            dtn not in SUPPORTED_FORMATS
            and not dtn.startswith("str")
            and not dtn.startswith("unicode")
        ):
            arr = _("%s arrays") % data.dtype.name
            self.error(_("%s are currently not supported") % arr)
            return False

    self.layout = QGridLayout()
    self.setLayout(self.layout)
    self.setWindowIcon(ima.icon("arredit"))
    if title:
        title = to_text_string(title) + " - " + _("NumPy array")
    else:
        title = _("Array editor")
    if readonly:
        title += " (" + _("read only") + ")"
    self.setWindowTitle(title)
    self.resize(600, 500)

    # Stack widget
    self.stack = QStackedWidget(self)
    if is_record_array:
        for name in data.dtype.names:
            self.stack.addWidget(
                ArrayEditorWidget(self, data[name], readonly, xlabels, ylabels)
            )
    elif is_masked_array:
        self.stack.addWidget(ArrayEditorWidget(self, data, readonly, xlabels, ylabels))
        self.stack.addWidget(
            ArrayEditorWidget(self, data.data, readonly, xlabels, ylabels)
        )
        self.stack.addWidget(
            ArrayEditorWidget(self, data.mask, readonly, xlabels, ylabels)
        )
    elif data.ndim == 3:
        pass
    else:
        self.stack.addWidget(ArrayEditorWidget(self, data, readonly, xlabels, ylabels))
    self.arraywidget = self.stack.currentWidget()
    if self.arraywidget:
        self.arraywidget.model.dataChanged.connect(self.save_and_close_enable)
    self.stack.currentChanged.connect(self.current_widget_changed)
    self.layout.addWidget(self.stack, 1, 0)

    # Buttons configuration
    btn_layout = QHBoxLayout()
    if is_record_array or is_masked_array or data.ndim == 3:
        if is_record_array:
            btn_layout.addWidget(QLabel(_("Record array fields:")))
            names = []
            for name in data.dtype.names:
                field = data.dtype.fields[name]
                text = name
                if len(field) >= 3:
                    title = field[2]
                    if not is_text_string(title):
                        title = repr(title)
                    text += " - " + title
                names.append(text)
        else:
            names = [_("Masked data"), _("Data"), _("Mask")]
        if data.ndim == 3:
            # QSpinBox
            self.index_spin = QSpinBox(self, keyboardTracking=False)
            self.index_spin.valueChanged.connect(self.change_active_widget)
            # QComboBox
            names = [str(i) for i in range(3)]
            ra_combo = QComboBox(self)
            ra_combo.addItems(names)
            ra_combo.currentIndexChanged.connect(self.current_dim_changed)
            # Adding the widgets to layout
            label = QLabel(_("Axis:"))
            btn_layout.addWidget(label)
            btn_layout.addWidget(ra_combo)
            self.shape_label = QLabel()
            btn_layout.addWidget(self.shape_label)
            label = QLabel(_("Index:"))
            btn_layout.addWidget(label)
            btn_layout.addWidget(self.index_spin)
            self.slicing_label = QLabel()
            btn_layout.addWidget(self.slicing_label)
            # set the widget to display when launched
            self.current_dim_changed(self.last_dim)
        else:
            ra_combo = QComboBox(self)
            ra_combo.currentIndexChanged.connect(self.stack.setCurrentIndex)
            ra_combo.addItems(names)
            btn_layout.addWidget(ra_combo)
        if is_masked_array:
            label = QLabel(_("<u>Warning</u>: changes are applied separately"))
            label.setToolTip(
                _(
                    "For performance reasons, changes applied "
                    "to masked array won't be reflected in "
                    "array's data (and vice-versa)."
                )
            )
            btn_layout.addWidget(label)

    btn_layout.addStretch()

    if not readonly:
        self.btn_save_and_close = QPushButton(_("Save and Close"))
        self.btn_save_and_close.setDisabled(True)
        self.btn_save_and_close.clicked.connect(self.accept)
        btn_layout.addWidget(self.btn_save_and_close)

    self.btn_close = QPushButton(_("Close"))
    self.btn_close.setAutoDefault(True)
    self.btn_close.setDefault(True)
    self.btn_close.clicked.connect(self.reject)
    btn_layout.addWidget(self.btn_close)
    self.layout.addLayout(btn_layout, 2, 0)

    self.setMinimumSize(400, 300)

    # Make the dialog act as a window
    self.setWindowFlags(Qt.Window)

    return True


# Traceback (ValueError)
File "C:\Users\CZ3QFP\miniconda2\envs\gmrpg_dev\lib\site-packages\spyder\widgets\variableexplorer\collectionseditor.py", line 482, in createEditor
if not editor.setup_and_check(value, title=key, readonly=readonly):
File "C:\Users\CZ3QFP\miniconda2\envs\gmrpg_dev\lib\site-packages\spyder\widgets\variableexplorer\arrayeditor.py", line 620, in setup_and_check
self.data.flags.writeable = True
ValueError: cannot set WRITEABLE flag to True of this array

# Fixed code
def setup_and_check(self, data, title="", readonly=False, xlabels=None, ylabels=None):
    """
    Setup ArrayEditor:
    return False if data is not supported, True otherwise
    """
    self.data = data
    readonly = readonly or not self.data.flags.writeable
    is_record_array = data.dtype.names is not None
    is_masked_array = isinstance(data, np.ma.MaskedArray)

    if data.ndim > 3:
        self.error(_("Arrays with more than 3 dimensions are not supported"))
        return False
    if xlabels is not None and len(xlabels) != self.data.shape[1]:
        self.error(_("The 'xlabels' argument length do no match array column number"))
        return False
    if ylabels is not None and len(ylabels) != self.data.shape[0]:
        self.error(_("The 'ylabels' argument length do no match array row number"))
        return False
    if not is_record_array:
        dtn = data.dtype.name
        if (
            dtn not in SUPPORTED_FORMATS
            and not dtn.startswith("str")
            and not dtn.startswith("unicode")
        ):
            arr = _("%s arrays") % data.dtype.name
            self.error(_("%s are currently not supported") % arr)
            return False

    self.layout = QGridLayout()
    self.setLayout(self.layout)
    self.setWindowIcon(ima.icon("arredit"))
    if title:
        title = to_text_string(title) + " - " + _("NumPy array")
    else:
        title = _("Array editor")
    if readonly:
        title += " (" + _("read only") + ")"
    self.setWindowTitle(title)
    self.resize(600, 500)

    # Stack widget
    self.stack = QStackedWidget(self)
    if is_record_array:
        for name in data.dtype.names:
            self.stack.addWidget(
                ArrayEditorWidget(self, data[name], readonly, xlabels, ylabels)
            )
    elif is_masked_array:
        self.stack.addWidget(ArrayEditorWidget(self, data, readonly, xlabels, ylabels))
        self.stack.addWidget(
            ArrayEditorWidget(self, data.data, readonly, xlabels, ylabels)
        )
        self.stack.addWidget(
            ArrayEditorWidget(self, data.mask, readonly, xlabels, ylabels)
        )
    elif data.ndim == 3:
        pass
    else:
        self.stack.addWidget(ArrayEditorWidget(self, data, readonly, xlabels, ylabels))
    self.arraywidget = self.stack.currentWidget()
    if self.arraywidget:
        self.arraywidget.model.dataChanged.connect(self.save_and_close_enable)
    self.stack.currentChanged.connect(self.current_widget_changed)
    self.layout.addWidget(self.stack, 1, 0)

    # Buttons configuration
    btn_layout = QHBoxLayout()
    if is_record_array or is_masked_array or data.ndim == 3:
        if is_record_array:
            btn_layout.addWidget(QLabel(_("Record array fields:")))
            names = []
            for name in data.dtype.names:
                field = data.dtype.fields[name]
                text = name
                if len(field) >= 3:
                    title = field[2]
                    if not is_text_string(title):
                        title = repr(title)
                    text += " - " + title
                names.append(text)
        else:
            names = [_("Masked data"), _("Data"), _("Mask")]
        if data.ndim == 3:
            # QSpinBox
            self.index_spin = QSpinBox(self, keyboardTracking=False)
            self.index_spin.valueChanged.connect(self.change_active_widget)
            # QComboBox
            names = [str(i) for i in range(3)]
            ra_combo = QComboBox(self)
            ra_combo.addItems(names)
            ra_combo.currentIndexChanged.connect(self.current_dim_changed)
            # Adding the widgets to layout
            label = QLabel(_("Axis:"))
            btn_layout.addWidget(label)
            btn_layout.addWidget(ra_combo)
            self.shape_label = QLabel()
            btn_layout.addWidget(self.shape_label)
            label = QLabel(_("Index:"))
            btn_layout.addWidget(label)
            btn_layout.addWidget(self.index_spin)
            self.slicing_label = QLabel()
            btn_layout.addWidget(self.slicing_label)
            # set the widget to display when launched
            self.current_dim_changed(self.last_dim)
        else:
            ra_combo = QComboBox(self)
            ra_combo.currentIndexChanged.connect(self.stack.setCurrentIndex)
            ra_combo.addItems(names)
            btn_layout.addWidget(ra_combo)
        if is_masked_array:
            label = QLabel(_("<u>Warning</u>: changes are applied separately"))
            label.setToolTip(
                _(
                    "For performance reasons, changes applied "
                    "to masked array won't be reflected in "
                    "array's data (and vice-versa)."
                )
            )
            btn_layout.addWidget(label)

    btn_layout.addStretch()

    if not readonly:
        self.btn_save_and_close = QPushButton(_("Save and Close"))
        self.btn_save_and_close.setDisabled(True)
        self.btn_save_and_close.clicked.connect(self.accept)
        btn_layout.addWidget(self.btn_save_and_close)

    self.btn_close = QPushButton(_("Close"))
    self.btn_close.setAutoDefault(True)
    self.btn_close.setDefault(True)
    self.btn_close.clicked.connect(self.reject)
    btn_layout.addWidget(self.btn_close)
    self.layout.addLayout(btn_layout, 2, 0)

    self.setMinimumSize(400, 300)

    # Make the dialog act as a window
    self.setWindowFlags(Qt.Window)

    return True