Repository: spyder-ide/spyder

Issue:
Error when attempting to close a split panel in the editor window
## Description

**What steps will reproduce the problem?**

1.   In the editor, I have used 'split vertically' to have source on the top and bottom.  The split screen works fine.
2.   On the bottom (second panel), I click on the gears icon to close to the panel and I get a popup error message suggesting to submit to github.
3. 

**What is the expected output? What do you see instead?**
I expect to get a pop-up menu with the option to close the panel.  What I see instead is an error window suggesting to submit the bug to github.  The outcome is that I can't close the split panel unless I restart Spyder.

**Please provide any additional information below**

  File "/usr/local/lib/python3.5/dist-packages/spyder/widgets/editor.py", line 1236, in __setup_menu
    add_actions(self.menu, list(actions)+self.__get_split_actions())
  File "/usr/local/lib/python3.5/dist-packages/spyder/utils/qthelpers.py", line 309, in add_actions
    action = action.no_icon_action
  File "/usr/local/lib/python3.5/dist-packages/spyder/utils/qthelpers.py", line 443, in __getattribute__
    attr = super(SpyderAction, self).__getattribute__(name)
  File "/usr/local/lib/python3.5/dist-packages/spyder/utils/qthelpers.py", line 462, in no_icon_action
    return self._action_no_icon
  File "/usr/local/lib/python3.5/dist-packages/spyder/utils/qthelpers.py", line 445, in __getattribute__
    if hasattr(attr, '__call__') and name not in ['triggered', 'toggled',
RuntimeError: wrapped C/C++ object of type SpyderAction has been deleted


## Version and main components

* Spyder Version: 3.2.0 
* Python Version: 3.5.2
* Qt Versions: 4.8.7, PyQt4 (API v2) 4.11.4 on Linux

## Dependencies
```
pyflakes >=0.6.0 :  1.5.0 (OK)
pycodestyle >=2.3:  2.3.1 (OK)
pygments >=2.0   :  2.2.0 (OK)
pandas >=0.13.1  :  0.20.1 (OK)
numpy >=1.7      :  1.12.1 (OK)
sphinx >=0.6.6   :  1.6.3 (OK)
rope >=0.9.4     :  0.10.5 (OK)
jedi >=0.9.0     :  0.10.2 (OK)
psutil >=0.3     :  5.2.2 (OK)
nbconvert >=4.0  :  5.2.1 (OK)
sympy >=0.7.3    :  None (NOK)
cython >=0.21    :  None (NOK)
qtconsole >=4.2.0:  4.3.0 (OK)
IPython >=4.0    :  6.1.0 (OK)
pylint >=0.25    :  1.7.2 (OK)

```



Discussion:
Thanks for reporting. We'll try to fix this as soon as possible.

@andfoy, please try to fix this error for 3.2.1. It shouldn't be that hard :-)
@csabella I can't reproduce this one, does it always happens?
@andfoy  Yes, I think it always happens.  Before I upgraded to 3.2.0, it hadn't happened at all.  If I close Spyder and reopen it, then I'm able to close the panel without an issue.  Just to clarify, I get the error when clicking on the gears for the _new_ panel, not for the existing panel.  I've also clicked on 'New Window' and get the same error on the gears menu on the new window.

I don't know if this is helpful, but when I say 'gears', I'm referring to the icon that's at the top right of the editor window.  Clicking on it gives a menu of 'Go to line', 'Set console working directory', 'Show in external file explorer', 'File switcher', 'Find symbols in files', etc.

Thanks!
By the way, what is your Operating System?
I cannot reproduce this one on Linux with Qt 5.5, 5.6, 5.7 and 5.8
Ubuntu 16.04.  In the dump, it reported this:  Qt Versions: 4.8.7, PyQt4 (API v2) 4.11.4 on Linux.  Should I try to update Qt?  If so, how would I do that?
You can upgrade using ``apt``: ``apt install qt5-default``. Or you can install Qt wheels directly from PyPi using pip: ``pip install -U pyqt5``
It happens to me when splitting it horizontally, and trying to click in the new split options (gear icon)
Yes! Finally I could reproduce it
It seems that catching the RuntimeError does the trick

Resolving patch:
diff --git a/spyder/utils/qthelpers.py b/spyder/utils/qthelpers.py
--- a/spyder/utils/qthelpers.py
+++ b/spyder/utils/qthelpers.py
@@ -306,7 +306,10 @@ def add_actions(target, actions, insert_before=None):
         elif isinstance(action, QAction):
             if isinstance(action, SpyderAction):
                 if isinstance(target, QMenu) or not isinstance(target, QToolBar):
-                    action = action.no_icon_action
+                    try:
+                        action = action.no_icon_action
+                    except RuntimeError:
+                        continue
             if insert_before is None:
                 target.addAction(action)
             else:
diff --git a/spyder/widgets/editor.py b/spyder/widgets/editor.py
--- a/spyder/widgets/editor.py
+++ b/spyder/widgets/editor.py
@@ -1233,7 +1233,7 @@ def __setup_menu(self):
         else:
             actions = (self.new_action, self.open_action)
             self.setFocus() # --> Editor.__get_focus_editortabwidget
-        add_actions(self.menu, list(actions)+self.__get_split_actions())
+        add_actions(self.menu, list(actions) + self.__get_split_actions())
         self.close_action.setEnabled(self.is_closable)
 
 
@@ -2293,9 +2293,13 @@ def get_layout_settings(self):
         """Return layout state"""
         splitsettings = []
         for editorstack, orientation in self.iter_editorstacks():
-            clines = [finfo.editor.get_cursor_line_number()
-                      for finfo in editorstack.data]
-            cfname = editorstack.get_current_filename()
+            clines = []
+            cfname = ''
+            orientation = False
+            if hasattr(editorstack, 'data'):
+                clines = [finfo.editor.get_cursor_line_number()
+                          for finfo in editorstack.data]
+                cfname = editorstack.get_current_filename()
             splitsettings.append((orientation == Qt.Vertical, cfname, clines))
         return dict(hexstate=qbytearray_to_str(self.saveState()),
                     sizes=self.sizes(), splitsettings=splitsettings)


Test patch: