def run_gui(): debug = ("--debug" in sys.argv) remote_process, remote_connection = start_remote_process(debug) import matplotlib # We want matplotlib to use our backend matplotlib.use('module://cytoflowgui.matplotlib_backend') # getting real tired of the matplotlib deprecation warnings import warnings warnings.filterwarnings('ignore', '.*is deprecated and replaced with.*') from traits.api import push_exception_handler def QtMsgHandler(msg_type, msg_string): # Convert Qt msg type to logging level log_level = [ logging.DEBUG, logging.WARN, logging.ERROR, logging.FATAL ][int(msg_type)] logging.log(log_level, 'Qt message: ' + msg_string.decode('utf-8')) ## monkey-patch envisage for a py3k bug. this is fixed in envisage HEAD, ## so check for version import envisage if envisage.__version__ == '4.6.0': import pickle from envisage.ui.tasks.tasks_application import TasksApplication, TasksApplicationState logger = logging.getLogger(__name__) logger.info("Monkey-patching envisage 4.6.0") def _envisage_load_state(self): """ Loads saved application state, if possible. """ state = TasksApplicationState() filename = os.path.join(self.state_location, 'application_memento') if os.path.exists(filename): # Attempt to unpickle the saved application state. try: with open(filename, 'rb') as f: restored_state = pickle.load(f) if state.version == restored_state.version: state = restored_state else: logger.warn('Discarding outdated application layout') except: # If anything goes wrong, log the error and continue. logger.exception('Restoring application layout from %s', filename) self._state = state def _envisage_save_state(self): """ Saves the application state. """ # Grab the current window layouts. window_layouts = [w.get_window_layout() for w in self.windows] self._state.previous_window_layouts = window_layouts # Attempt to pickle the application state. filename = os.path.join(self.state_location, 'application_memento') try: with open(filename, 'wb') as f: pickle.dump(self._state, f) except: # If anything goes wrong, log the error and continue. logger.exception('Saving application layout') TasksApplication._load_state = _envisage_load_state TasksApplication._save_state = _envisage_save_state from envisage.core_plugin import CorePlugin from envisage.ui.tasks.tasks_plugin import TasksPlugin from pyface.image_resource import ImageResource from cytoflowgui.flow_task import FlowTaskPlugin from cytoflowgui.cytoflow_application import CytoflowApplication from cytoflowgui.op_plugins import ( ImportPlugin, ThresholdPlugin, RangePlugin, QuadPlugin, Range2DPlugin, PolygonPlugin, BinningPlugin, GaussianMixture1DPlugin, GaussianMixture2DPlugin, BleedthroughLinearPlugin, #BleedthroughPiecewisePlugin, BeadCalibrationPlugin, AutofluorescencePlugin, ColorTranslationPlugin, TasbePlugin, ChannelStatisticPlugin, TransformStatisticPlugin, RatioPlugin) from cytoflowgui.view_plugins import ( HistogramPlugin, Histogram2DPlugin, ScatterplotPlugin, BarChartPlugin, Stats1DPlugin, Kde1DPlugin, #Kde2DPlugin, ViolinPlotPlugin, TablePlugin, Stats2DPlugin) # assert(multiprocessing.get_start_method() == "spawn") from cytoflow.utility.custom_traits import Removed, Deprecated Removed.gui = True Deprecated.gui = True from pyface.qt import qt_api cmd_line = " ".join(sys.argv) if qt_api == "pyside": print("Cytoflow uses PyQT; but it is trying to use PySide instead.") print(" - Make sure PyQT is installed.") print( " - If both are installed, and you don't need both, uninstall PySide." ) print(" - If you must have both installed, select PyQT by setting the") print(" environment variable QT_API to \"pyqt\"") print(" * eg, on Linux, type on the command line:") print(" QT_API=\"pyqt\" " + cmd_line) print(" * on Windows, try: ") print(" setx QT_API \"pyqt\"") sys.exit(1) from pyface.qt.QtCore import qInstallMsgHandler qInstallMsgHandler(QtMsgHandler) # if we're frozen, add _MEIPASS to the pyface search path for icons etc if getattr(sys, 'frozen', False): from pyface.resource_manager import resource_manager resource_manager.extra_paths.append(sys._MEIPASS) # @UndefinedVariable # install a global (gui) error handler for traits notifications push_exception_handler(handler=log_notification_handler, reraise_exceptions=debug, main=True) sys.excepthook = log_excepthook plugins = [ CorePlugin(), TasksPlugin(), FlowTaskPlugin(debug=debug, remote_connection=remote_connection) ] # reverse of the order on the toolbar view_plugins = [ TablePlugin(), Stats2DPlugin(), Stats1DPlugin(), BarChartPlugin(), ViolinPlotPlugin(), # Kde2DPlugin(), # disabled until we can make it faster Kde1DPlugin(), Histogram2DPlugin(), ScatterplotPlugin(), HistogramPlugin() ] plugins.extend(view_plugins) op_plugins = [ RatioPlugin(), TransformStatisticPlugin(), ChannelStatisticPlugin(), TasbePlugin(), ColorTranslationPlugin(), AutofluorescencePlugin(), BeadCalibrationPlugin(), # BleedthroughPiecewisePlugin(), BleedthroughLinearPlugin(), GaussianMixture2DPlugin(), GaussianMixture1DPlugin(), BinningPlugin(), PolygonPlugin(), QuadPlugin(), Range2DPlugin(), RangePlugin(), ThresholdPlugin(), ImportPlugin() ] plugins.extend(op_plugins) # these two lines stop pkg_resources from trying to load resources # from the __main__ module, which is frozen (and thus not loadable.) icon = ImageResource('icon') icon.search_path = [] app = CytoflowApplication(id='edu.mit.synbio.cytoflow', plugins=plugins, icon=icon, debug=debug) app.run() remote_process.join() logging.shutdown()
def run_gui(): import os, sys try: # if we're running as a one-click from a MacOS app, # we need to reset the working directory os.chdir(sys._MEIPASS) except: # if we're not running as a one-click, fail gracefully pass # take care of the 3 places in the cytoflow module that # need different behavior in a GUI import cytoflow cytoflow.RUNNING_IN_GUI = True # this is ridiculous, but here's the situation. Qt5 now uses Chromium # as their web renderer. Chromium needs OpenGL. if you don't # initialize OpoenGL here, things crash on some platforms. # so now i guess we depend on opengl too. from OpenGL import GL # @UnresolvedImport @UnusedImport # check that we're using the right Qt API from pyface.qt import qt_api cmd_line = " ".join(sys.argv) if qt_api == "pyside": print("Cytoflow uses PyQT; but it is trying to use PySide instead.") print(" - Make sure PyQT is installed.") print( " - If both are installed, and you don't need both, uninstall PySide." ) print(" - If you must have both installed, select PyQT by setting the") print(" environment variable QT_API to \"pyqt5\"") print(" * eg, on Linux, type on the command line:") print(" QT_API=\"pyqt5\" " + cmd_line) print(" * on Windows, try: ") print(" setx QT_API \"pyqt5\"") sys.exit(1) # parse args parser = argparse.ArgumentParser(description='Cytoflow GUI') parser.add_argument("--debug", action='store_true') parser.add_argument("filename", nargs='?', default="") args = parser.parse_args() # start the remote process remote_process, remote_connection, queue_listener = start_remote_process() # getting real tired of the matplotlib deprecation warnings import warnings warnings.filterwarnings('ignore', '.*is deprecated and replaced with.*') # if we're frozen, add _MEIPASS to the pyface search path for icons etc if getattr(sys, 'frozen', False): from pyface.resource_manager import resource_manager resource_manager.extra_paths.append(sys._MEIPASS) # @UndefinedVariable # these three lines stop pkg_resources from trying to load resources # from the __main__ module, which is frozen (and thus not loadable.) from pyface.image_resource import ImageResource icon = ImageResource('icon') icon.search_path = [] # monkey patch the resource manager to use SVGs for icons import pyface.resource.resource_manager pyface.resource.resource_manager.ResourceManager.IMAGE_EXTENSIONS.append( '.svg') # monkey patch checklist editor to stop lowercasing import traitsui.qt4.check_list_editor # @UnusedImport traitsui.qt4.check_list_editor.capitalize = lambda s: s # define and install a message handler for Qt errors from traits.api import push_exception_handler def QtMsgHandler(msg_type, msg_context, msg_string): # Convert Qt msg type to logging level log_level = [ logging.DEBUG, logging.WARN, logging.ERROR, logging.FATAL ][int(msg_type)] logging.log(log_level, 'Qt message: ' + msg_string) from pyface.qt.QtCore import qInstallMessageHandler # @UnresolvedImport qInstallMessageHandler(QtMsgHandler) # install a global (gui) error handler for traits notifications push_exception_handler(handler=log_notification_handler, reraise_exceptions=False, main=True) sys.excepthook = log_excepthook # Import, then load, the envisage plugins from envisage.core_plugin import CorePlugin from envisage.ui.tasks.tasks_plugin import TasksPlugin from cytoflowgui.flow_task import FlowTaskPlugin from cytoflowgui.tasbe_task import TASBETaskPlugin from cytoflowgui.export_task import ExportFigurePlugin from cytoflowgui.cytoflow_application import CytoflowApplication from cytoflowgui.op_plugins import ( ImportPlugin, ThresholdPlugin, RangePlugin, QuadPlugin, Range2DPlugin, PolygonPlugin, BinningPlugin, GaussianMixture1DPlugin, GaussianMixture2DPlugin, BleedthroughLinearPlugin, BeadCalibrationPlugin, AutofluorescencePlugin, ColorTranslationPlugin, TasbePlugin, ChannelStatisticPlugin, TransformStatisticPlugin, RatioPlugin, DensityGatePlugin, FlowPeaksPlugin, KMeansPlugin, PCAPlugin) from cytoflowgui.view_plugins import ( HistogramPlugin, Histogram2DPlugin, ScatterplotPlugin, BarChartPlugin, Stats1DPlugin, Kde1DPlugin, Kde2DPlugin, ViolinPlotPlugin, TablePlugin, Stats2DPlugin, DensityPlugin, ParallelCoordinatesPlugin, RadvizPlugin) plugins = [ CorePlugin(), TasksPlugin(), FlowTaskPlugin(), TASBETaskPlugin(), ExportFigurePlugin() ] # ordered as we want them to show up in the toolbar view_plugins = [ HistogramPlugin(), ScatterplotPlugin(), Histogram2DPlugin(), DensityPlugin(), Kde1DPlugin(), Kde2DPlugin(), RadvizPlugin(), ParallelCoordinatesPlugin(), ViolinPlotPlugin(), BarChartPlugin(), Stats1DPlugin(), Stats2DPlugin(), TablePlugin() ] plugins.extend(view_plugins) op_plugins = [ ImportPlugin(), ThresholdPlugin(), RangePlugin(), QuadPlugin(), Range2DPlugin(), PolygonPlugin(), RatioPlugin(), ChannelStatisticPlugin(), TransformStatisticPlugin(), BinningPlugin(), GaussianMixture1DPlugin(), GaussianMixture2DPlugin(), DensityGatePlugin(), KMeansPlugin(), FlowPeaksPlugin(), PCAPlugin(), AutofluorescencePlugin(), BleedthroughLinearPlugin(), BeadCalibrationPlugin(), ColorTranslationPlugin(), TasbePlugin() ] plugins.extend(op_plugins) # start the app app = CytoflowApplication(id='edu.mit.synbio.cytoflow', plugins=plugins, icon=icon, remote_process=remote_process, remote_connection=remote_connection, filename=args.filename, debug=args.debug) from pyface.qt import QtGui QtGui.QApplication.instance().setStyle( QtGui.QStyleFactory.create('Fusion')) app.run() remote_process.join() queue_listener.stop() logging.shutdown()
def run_gui(): debug = ("--debug" in sys.argv) remote_process, remote_connection = start_remote_process() # We want matplotlib to use our backend .... in both the GUI and the # remote process import matplotlib matplotlib.use('module://cytoflowgui.matplotlib_backend') # getting real tired of the matplotlib deprecation warnings import warnings warnings.filterwarnings('ignore', '.*is deprecated and replaced with.*') from traits.api import push_exception_handler def QtMsgHandler(msg_type, msg_string): # Convert Qt msg type to logging level log_level = [ logging.DEBUG, logging.WARN, logging.ERROR, logging.FATAL ][int(msg_type)] logging.log(log_level, 'Qt message: ' + msg_string.decode('utf-8')) from envisage.core_plugin import CorePlugin from envisage.ui.tasks.tasks_plugin import TasksPlugin from pyface.image_resource import ImageResource from cytoflowgui.flow_task import FlowTaskPlugin from cytoflowgui.tasbe_task import TASBETaskPlugin from cytoflowgui.export_task import ExportFigurePlugin from cytoflowgui.cytoflow_application import CytoflowApplication from cytoflowgui.op_plugins import ( ImportPlugin, ThresholdPlugin, RangePlugin, QuadPlugin, Range2DPlugin, PolygonPlugin, BinningPlugin, GaussianMixture1DPlugin, GaussianMixture2DPlugin, BleedthroughLinearPlugin, BleedthroughPiecewisePlugin, BeadCalibrationPlugin, AutofluorescencePlugin, ColorTranslationPlugin, TasbePlugin, ChannelStatisticPlugin, TransformStatisticPlugin, RatioPlugin, DensityGatePlugin, FlowPeaksPlugin, KMeansPlugin, PCAPlugin) from cytoflowgui.view_plugins import ( HistogramPlugin, Histogram2DPlugin, ScatterplotPlugin, BarChartPlugin, Stats1DPlugin, Kde1DPlugin, Kde2DPlugin, ViolinPlotPlugin, TablePlugin, Stats2DPlugin, DensityPlugin, ParallelCoordinatesPlugin, RadvizPlugin) from cytoflow.utility.custom_traits import Removed, Deprecated Removed.gui = True Deprecated.gui = True from pyface.qt import qt_api cmd_line = " ".join(sys.argv) if qt_api == "pyside": print("Cytoflow uses PyQT; but it is trying to use PySide instead.") print(" - Make sure PyQT is installed.") print( " - If both are installed, and you don't need both, uninstall PySide." ) print(" - If you must have both installed, select PyQT by setting the") print(" environment variable QT_API to \"pyqt\"") print(" * eg, on Linux, type on the command line:") print(" QT_API=\"pyqt\" " + cmd_line) print(" * on Windows, try: ") print(" setx QT_API \"pyqt\"") sys.exit(1) from pyface.qt.QtCore import qInstallMsgHandler # @UnresolvedImport qInstallMsgHandler(QtMsgHandler) # if we're frozen, add _MEIPASS to the pyface search path for icons etc if getattr(sys, 'frozen', False): from pyface.resource_manager import resource_manager resource_manager.extra_paths.append(sys._MEIPASS) # @UndefinedVariable # install a global (gui) error handler for traits notifications push_exception_handler(handler=log_notification_handler, reraise_exceptions=False, main=True) sys.excepthook = log_excepthook plugins = [ CorePlugin(), TasksPlugin(), FlowTaskPlugin(), TASBETaskPlugin(), ExportFigurePlugin() ] # reverse of the order on the toolbar view_plugins = [ TablePlugin(), Stats2DPlugin(), Stats1DPlugin(), BarChartPlugin(), ViolinPlotPlugin(), Kde2DPlugin(), RadvizPlugin(), ParallelCoordinatesPlugin(), Kde1DPlugin(), DensityPlugin(), Histogram2DPlugin(), ScatterplotPlugin(), HistogramPlugin() ] plugins.extend(view_plugins) op_plugins = [ RatioPlugin(), PCAPlugin(), KMeansPlugin(), FlowPeaksPlugin(), DensityGatePlugin(), TransformStatisticPlugin(), ChannelStatisticPlugin(), TasbePlugin(), ColorTranslationPlugin(), AutofluorescencePlugin(), BeadCalibrationPlugin(), # BleedthroughPiecewisePlugin(), BleedthroughLinearPlugin(), GaussianMixture2DPlugin(), GaussianMixture1DPlugin(), BinningPlugin(), PolygonPlugin(), QuadPlugin(), Range2DPlugin(), RangePlugin(), ThresholdPlugin(), ImportPlugin() ] plugins.extend(op_plugins) # these two lines stop pkg_resources from trying to load resources # from the __main__ module, which is frozen (and thus not loadable.) icon = ImageResource('icon') icon.search_path = [] app = CytoflowApplication(id='edu.mit.synbio.cytoflow', plugins=plugins, icon=icon, remote_connection=remote_connection, debug=debug) app.run() remote_process.join() logging.shutdown()