Hi,

It is a very tough problem to solve, and it is likely to be a wxPython
bug.  Oh, what if you run the Menu.py wx_demo?  Or MessageDialog.py?
The testing in http://wiki.nmr-relax.com/Installation_test#wxPython_test
only checks a tiny fraction of all wxPython functionality used in
relax so it may not show the problem.  It could be that one of the
PNGs in wxPython, for example those used in the message dialogs, are
corrupted (according to the PNG people nowadays).  It could be that
one of the standard Mac OS X icons distributed with the operating
system is giving the iCCP warning too.

Regards,

Edward



On 4 December 2013 11:49, Troels Emtekær Linnet <tlin...@nmr-relax.com> wrote:
> Hi Edward.
>
> The code change did not make a difference.
>
> The wxPython demo runs fine:
> http://wiki.nmr-relax.com/Installation_test#wxPython_test
>
> I see the smiley face fine.
> In the terminal there are still the fonts issue, but not the iCCP warning.
>
> Hm, I guess i will see what happens if I start using the GUI with
> relax on real data applications.
> Anyway, I will probably run a lot more scripting than GUI.
>
> And I will wait to see if there comes a fix for wxPython for Mavericks.
>
> Best
> Troels
>
>
> 2013/12/4 Edward d'Auvergne <edw...@nmr-relax.com>:
>> Hi,
>>
>> There are literally thousands of places where the wx.CallAfter() call
>> could be used.  This may not even fix the problem.  Does the error go
>> away if you make the change?  On a different note, do you see those
>> wxPython iCCP and font issues if you run the wx_demo?  If so, then
>> there is no point searching for these errors in relax, for there are
>> none.  It will be a wxPython issue.  My feeling is that everything you
>> see is due to problems with wxPython, as my tests on multiple
>> operating system, both 32 and 64-bit show nothing.  The crash in the
>> test suite might be fixable from within relax however.
>>
>> Regards,
>>
>> Edward
>>
>>
>> On 4 December 2013 11:26, Troels Emtekær Linnet <tlin...@nmr-relax.com> 
>> wrote:
>>> Hm.
>>>
>>> It seems that many people have problems with wxPython 2.9 on Mavericks.
>>> I have tried installing wxPython 2.8, but that would not work on my system.
>>>
>>> The GUI will show up when starting relax.
>>> Complaining about: "iCCP: known incorrect sRGB profile".
>>> And terminal will show:
>>>
>>> "
>>> 2013-12-03 22:56:31.956 Python[1180:d0b] CoreText performance note: Client
>>> called CTFontCreateWithName() using name ".Lucida Grande UI" and got font 
>>> with
>>> PostScript name ".LucidaGrandeUI". For best performance, only use PostScript
>>> names when calling this API.
>>> 2013-12-03 22:56:31.956 Python[1180:d0b] CoreText performance note: Set a
>>> breakpoint on CTFontLogSuboptimalRequest to debug.
>>> 2013-12-03 22:56:37.521 Python[1180:d0b] CoreText performance note: Client
>>> called CTFontCreateWithName() using name ".Lucida Grande UI" and got font 
>>> with
>>> PostScript name ".LucidaGrandeUI". For best performance, only use PostScript
>>> names when calling this API.
>>> "
>>>
>>> This problem has been reported before:
>>> http://successfulsoftware.net/2013/10/23/fixing-qt-4-for-mac-os-x-10-9-mavericks/
>>> https://bugreports.qt-project.org/browse/QTBUG-32789
>>> http://wxpython-users.1045709.n5.nabble.com/another-possible-issue-with-new-Mac-OS-Mavericks-td5719024.html
>>>
>>>
>>> In the relax GUI:
>>>
>>> The Unit test will perform fine.
>>> The GUI test will crash relax.
>>> The system test will run for a long time, and crash at some point.
>>> (After 30 dots ?)
>>> It is hard to see at which points it crashes.
>>>
>>> The system test performed in terminal goes fine.
>>>
>>>
>>> -------
>>> I found one instance of "AppendText" in line 1048.
>>> Should I try to alter it ?
>>>
>>> from:
>>> self.AppendText(string_list[i])
>>>
>>> to:
>>> wx.CallAfter(self.textArea.AppendText, string_list[i])
>>> or
>>> wx.CallAfter(self.AppendText, string_list[i])
>>>
>>>
>>> -------
>>>
>>>
>>>
>>>
>>> [tlinnet@haddock relax_trunk]$ grep -r "AppendText" ./gui
>>> Binary file ./gui/controller.pyc matches
>>> ./gui/controller.py:            self.AppendText(string_list[i])
>>>
>>>
>>> [tlinnet@haddock relax_trunk]$ grep -r "wx.CallAfter(" ./gui
>>> ./gui/spin_viewer/frame.py:                wx.CallAfter(item.Enable, enable)
>>> ./gui/spin_viewer/frame.py:        wx.CallAfter(self.bar.EnableTool,
>>> self.spin_loader_id, enable)
>>> ./gui/spin_viewer/frame.py:        wx.CallAfter(self.pipe_name.Enable, 
>>> enable)
>>> ./gui/spin_viewer/frame.py:        wx.CallAfter(self.refresh_safe)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.toolbar.EnableTool,
>>> self.TB_FILE_NEW, enable)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.toolbar.EnableTool,
>>> self.TB_FILE_CLOSE, enable)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.toolbar.EnableTool,
>>> self.TB_FILE_CLOSE_ALL, enable)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.toolbar.EnableTool,
>>> self.TB_FILE_OPEN, enable)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.toolbar.EnableTool,
>>> self.TB_FILE_SAVE, enable)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.toolbar.EnableTool,
>>> self.TB_FILE_SAVE_AS, enable)
>>> ./gui/relax_gui.py:
>>> wx.CallAfter(self.controller.main_gauge.SetValue, 100)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.show_results_viewer_safe,
>>> warn=True)
>>> ./gui/relax_gui.py:                wx.CallAfter(dlg.ShowModal)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.show_results_viewer_safe,
>>> warn=False)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.status_bar.SetStatusText,
>>> "(C) 2001-2013 the relax development team", 0)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.status_bar.SetStatusText,
>>> "Current data pipe:", 1)
>>> ./gui/relax_gui.py:        wx.CallAfter(self.status_bar.SetStatusText, 
>>> pipe, 2)
>>> ./gui/icons.py:        wx.CallAfter(self.gui.exit_gui)
>>> ./gui/results_viewer.py:        wx.CallAfter(self.pipe_name.Enable, enable)
>>> ./gui/results_viewer.py:        wx.CallAfter(self.button_open.Enable, 
>>> enable)
>>> ./gui/results_viewer.py:        wx.CallAfter(self.refresh_safe)
>>> ./gui/results_viewer.py:        wx.CallAfter(self.Raise)
>>> ./gui/analyses/auto_noe.py:
>>> wx.CallAfter(self.field_nmr_frq.Enable, enable)
>>> ./gui/analyses/auto_noe.py:
>>> wx.CallAfter(self.field_results_dir.Enable, enable)
>>> ./gui/analyses/auto_noe.py:
>>> wx.CallAfter(self.spin_systems.Enable, enable)
>>> ./gui/analyses/auto_noe.py:
>>> wx.CallAfter(self.peak_intensity.Enable, enable)
>>> ./gui/analyses/auto_noe.py:
>>> wx.CallAfter(self.button_exec_relax.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.field_results_dir.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.field_pre_run_dir.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.spin_systems.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.field_cluster.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.button_isotope.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.button_r1.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.button_chemical_shift.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.button_interatom_define.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.peak_intensity.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.model_field.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.button_exec_relax.Enable, enable)
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.field_cluster.SetValue, "free spins")
>>> ./gui/analyses/auto_relax_disp.py:
>>> wx.CallAfter(self.field_cluster.SetValue, text)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.field_results_dir.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.spin_systems.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.relax_data.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.button_dipole_pair.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.button_csa.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.button_isotope_heteronuc.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.button_isotope_proton.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.local_tm_model_field.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.mf_model_field.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.grid_inc.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.mc_sim_num.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.max_iter.Enable, enable)
>>> ./gui/analyses/auto_model_free.py:        wx.CallAfter(self.mode.Enable, 
>>> enable)
>>> ./gui/analyses/auto_model_free.py:
>>> wx.CallAfter(self.button_exec_relax.Enable, enable)
>>> ./gui/analyses/auto_rx_base.py:
>>> wx.CallAfter(self.field_nmr_frq.Enable, enable)
>>> ./gui/analyses/auto_rx_base.py:
>>> wx.CallAfter(self.field_results_dir.Enable, enable)
>>> ./gui/analyses/auto_rx_base.py:
>>> wx.CallAfter(self.spin_systems.Enable, enable)
>>> ./gui/analyses/auto_rx_base.py:
>>> wx.CallAfter(self.peak_intensity.Enable, enable)
>>> ./gui/analyses/auto_rx_base.py:
>>> wx.CallAfter(self.grid_inc.Enable, enable)
>>> ./gui/analyses/auto_rx_base.py:
>>> wx.CallAfter(self.mc_sim_num.Enable, enable)
>>> ./gui/analyses/auto_rx_base.py:
>>> wx.CallAfter(self.button_exec_relax.Enable, enable)
>>> ./gui/analyses/__init__.py:
>>> wx.CallAfter(self.notebook.SetSelection, self._current)
>>> ./gui/analyses/__init__.py:
>>> wx.CallAfter(status.observers.gui_analysis.notify)
>>> ./gui/analyses/base.py:
>>> wx.CallAfter(self.spin_systems.SetValue,
>>> str_to_gui(self.spin_count()))
>>> ./gui/uf_objects.py:            wx.CallAfter(app.gui.controller.Raise)
>>> ./gui/relax_prompt.py:        wx.CallAfter(self.prompt.Enable, enable)
>>> ./gui/controller.py:        wx.CallAfter(self.main_gauge.Pulse)
>>> ./gui/controller.py:            wx.CallAfter(self.mc_gauge_rx.SetValue, 0)
>>> ./gui/controller.py:            wx.CallAfter(self.mc_gauge_mf.SetValue, 0)
>>> ./gui/controller.py:            
>>> wx.CallAfter(self.progress_gauge_mf.SetValue, 0)
>>> ./gui/controller.py:        wx.CallAfter(self.main_gauge.SetValue, 0)
>>> ./gui/controller.py:        wx.CallAfter(self.cdp.SetValue, 
>>> str_to_gui(pipe))
>>> ./gui/controller.py:        wx.CallAfter(self.name.SetValue, 
>>> str_to_gui(name))
>>> ./gui/controller.py:                wx.CallAfter(self.panel_rx.Show)
>>> ./gui/controller.py:            wx.CallAfter(self.update_rx)
>>> ./gui/controller.py:                wx.CallAfter(self.panel_rx.Hide)
>>> ./gui/controller.py:                wx.CallAfter(self.panel_mf.Show)
>>> ./gui/controller.py:            wx.CallAfter(self.update_mf)
>>> ./gui/controller.py:                wx.CallAfter(self.panel_mf.Hide)
>>> ./gui/controller.py:        wx.CallAfter(self.update_gauge)
>>> ./gui/controller.py:        wx.CallAfter(self.main_panel.Layout)
>>> ./gui/controller.py:                wx.CallAfter(self.timer.Start, 100)
>>> ./gui/controller.py:                wx.CallAfter(self.mc_gauge_rx.SetValue, 
>>> 100)
>>> ./gui/controller.py:                wx.CallAfter(self.mc_gauge_mf.SetValue, 
>>> 100)
>>> ./gui/controller.py:
>>> wx.CallAfter(self.progress_gauge_mf.SetValue, 100)
>>> ./gui/controller.py:            wx.CallAfter(self.main_gauge.SetValue, 100)
>>> ./gui/controller.py:            wx.CallAfter(self.main_gauge.SetValue, 0)
>>> ./gui/controller.py:                wx.CallAfter(self.mc_gauge_rx.SetValue, 
>>> 0)
>>> ./gui/controller.py:                wx.CallAfter(self.mc_gauge_mf.SetValue, 
>>> 0)
>>> ./gui/controller.py:
>>> wx.CallAfter(self.progress_gauge_mf.SetValue, 0)
>>> ./gui/controller.py:            wx.CallAfter(self.main_gauge.SetValue, 0)
>>> ./gui/controller.py:            wx.CallAfter(self.mc_gauge_mf.SetValue, 100)
>>> ./gui/controller.py:
>>> wx.CallAfter(self.progress_gauge_mf.SetValue, 100)
>>> ./gui/controller.py:            wx.CallAfter(self.main_gauge.SetValue, 100)
>>> ./gui/controller.py:            wx.CallAfter(self.mc_gauge_mf.SetValue, 0)
>>> ./gui/controller.py:            
>>> wx.CallAfter(self.progress_gauge_mf.SetValue, 0)
>>> ./gui/controller.py:            wx.CallAfter(self.main_gauge.SetValue, 0)
>>> ./gui/controller.py:
>>> wx.CallAfter(self.global_model_mf.SetValue,
>>> str_to_gui(status.auto_analysis[key].diff_model))
>>> ./gui/controller.py:
>>> wx.CallAfter(self.progress_gauge_mf.SetValue, percent)
>>> ./gui/controller.py:
>>> wx.CallAfter(self.progress_gauge_mf.SetValue, 0)
>>> ./gui/controller.py:
>>> wx.CallAfter(self.progress_gauge_mf.SetValue, percent)
>>> ./gui/controller.py:            wx.CallAfter(self.mc_gauge_mf.SetValue, 
>>> percent)
>>> ./gui/controller.py:            wx.CallAfter(self.mc_gauge_rx.SetValue, 0)
>>> ./gui/controller.py:            wx.CallAfter(self.main_gauge.SetValue, 0)
>>> ./gui/controller.py:            wx.CallAfter(self.mc_gauge_rx.SetValue, 
>>> percent)
>>> ./gui/controller.py:        wx.CallAfter(self.control.write)
>>> ./gui/controller.py:        wx.CallAfter(self.control.write)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_bundle.Enable, 
>>> False)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_create.Enable, 
>>> False)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_copy.Enable, 
>>> False)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_delete.Enable, 
>>> False)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_hybrid.Enable, 
>>> False)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_switch.Enable, 
>>> False)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_bundle.Enable, 
>>> True)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_create.Enable, 
>>> True)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_copy.Enable, True)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_delete.Enable, 
>>> True)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_hybrid.Enable, 
>>> True)
>>> ./gui/pipe_editor.py:            wx.CallAfter(self.button_switch.Enable, 
>>> True)
>>> ./gui/pipe_editor.py:        wx.CallAfter(self.Raise)
>>> ./gui/pipe_editor.py:        wx.CallAfter(self.update_grid_safe)
>>> ./gui/interpreter.py:                    wx.CallAfter(gui_raise,
>>> instance, raise_flag=False)
>>> ./gui/components/base_list.py:        wx.CallAfter(self.build_element_safe)
>>>
>>> 2013/12/4 Edward d'Auvergne <edw...@nmr-relax.com>:
>>>> Hi,
>>>>
>>>> It could be related to the first link.  These issues are difficult to
>>>> track down and find, as a GUI must naturally run multi-threaded and
>>>> multi-threaded debugging is a nightmare.  The problem is likely to be
>>>> fixed by wrapping a call to a wxPython method or function within a
>>>> wx.CallAfter() call.  Grep the sources to see how often we have used
>>>> this construct already.  This seems to only be triggered on your
>>>> system as I do not see it on Mac OS X 10.6, 10.7 and 10.8, Windows
>>>> 2000, Vista and 7, or Linux (Mandriva 2008.1 32-bit, Mageia 1 64-bit,
>>>> Mageia 3 64-bit, SUSE 64-bit, etc.).  It may be related to wxPython
>>>> 2.9.5.0.
>>>>
>>>> This does not mean that it is not a bug in the relax GUI sources, just
>>>> that it has never been uncovered before.  One trick is to find a way
>>>> of reliably and quickly reproducing the error, maybe by running a
>>>> single GUI test, and then to use the print statements to find exactly
>>>> where the error occurred.  Then return statements or massive code
>>>> deletion can be used to exit a function early.  If the bug is gone
>>>> after that, you know the error was in the part that was deleted.  Then
>>>> this can be repeated until the bad function call can be found.  The
>>>> error could also be in the GUI test itself.  Here wx.Yield() calls are
>>>> often needed to prevent racing, as the test runs the GUI code much,
>>>> much faster than what a user sitting at a computer could ever do.
>>>>
>>>> Regards,
>>>>
>>>> Edward
>>>>
>>>>
>>>>
>>>> On 3 December 2013 22:23, Troels E. Linnet
>>>> <no-reply.invalid-addr...@gna.org> wrote:
>>>>> URL:
>>>>>   <http://gna.org/bugs/?21324>
>>>>>
>>>>>                  Summary: GUI error on mac OS X Maverics 10.9
>>>>>                  Project: relax
>>>>>             Submitted by: tlinnet
>>>>>             Submitted on: Tue 03 Dec 2013 09:23:31 PM GMT
>>>>>                 Category: None
>>>>>                 Severity: 3 - Normal
>>>>>                 Priority: 3 - Low
>>>>>                   Status: None
>>>>>                  Privacy: Public
>>>>>              Assigned to: None
>>>>>          Originator Name:
>>>>>         Originator Email:
>>>>>              Open/Closed: Open
>>>>>          Discussion Lock: Any
>>>>>                  Release: Repository: trunk
>>>>>         Operating System: Mac OS X (Intel)
>>>>>
>>>>>     _______________________________________________________
>>>>>
>>>>> Details:
>>>>>
>>>>> I have tried to use:
>>>>> wxPython2.9-osx-2.9.5.0-cocoa-py2.7.dmg
>>>>> and
>>>>> brew install wxmac
>>>>>
>>>>> to get the same GUI errors.
>>>>>
>>>>> Log attached.
>>>>>
>>>>> *** Terminating app due to uncaught exception 'NSRangeException', reason: 
>>>>> '***
>>>>> -[__NSArrayM objectAtIndex:]: index 18446744073709551615 beyond bounds for
>>>>> empty array'
>>>>>
>>>>> Could it be related to this post?
>>>>> http://stackoverflow.com/questions/17246160/textctrl-providing-an-out-of-bound-exception-in-wxpython
>>>>>
>>>>> http://stackoverflow.com/questions/13085683/xcode-terminating-app-due-to-uncaught-exception-nsrangeexception
>>>>>
>>>>> http://stackoverflow.com/questions/4289894/terminating-app-due-to-uncaught-exception-nsrangeexception-reason
>>>>>
>>>>> I will now try with:
>>>>> wxPython2.9-osx-2.9.5.0-carbon-py2.7.dmg
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>     _______________________________________________________
>>>>>
>>>>> File Attachments:
>>>>>
>>>>>
>>>>> -------------------------------------------------------
>>>>> Date: Tue 03 Dec 2013 09:23:31 PM GMT  Name: gui_error.log  Size: 70kB   
>>>>> By:
>>>>> tlinnet
>>>>>
>>>>> <http://gna.org/bugs/download.php?file_id=19415>
>>>>>
>>>>>     _______________________________________________________
>>>>>
>>>>> Reply to this item at:
>>>>>
>>>>>   <http://gna.org/bugs/?21324>
>>>>>
>>>>> _______________________________________________
>>>>>   Message sent via/by Gna!
>>>>>   http://gna.org/
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> relax (http://www.nmr-relax.com)
>>>>>
>>>>> This is the relax-devel mailing list
>>>>> relax-devel@gna.org
>>>>>
>>>>> To unsubscribe from this list, get a password
>>>>> reminder, or change your subscription options,
>>>>> visit the list information page at
>>>>> https://mail.gna.org/listinfo/relax-devel

_______________________________________________
relax (http://www.nmr-relax.com)

This is the relax-devel mailing list
relax-devel@gna.org

To unsubscribe from this list, get a password
reminder, or change your subscription options,
visit the list information page at
https://mail.gna.org/listinfo/relax-devel

Reply via email to