Source code for crikit.ui.widget_images

"""
Visualization Widgets (crikit.ui.widget_images)
=======================================================

widgetColorMath : Mathematical operations on raw data leading to color \
    images

widgetBWImg : Grayscale imagery

widgetSglColor : Single-color imagery

widgetCompositeColor : Composite-color imagery

_mplWin : Matplotlib window container

"""

import sys as _sys
import numpy as _np

# Generic imports for QT-based programs
from PyQt5.QtWidgets import (QApplication as _QApplication,
                             QWidget as _QWidget,
                             QSizePolicy as _QSizePolicy,
                             QColorDialog as _QColorDialog,
                             QHBoxLayout as _QHBoxLayout)

import PyQt5.QtCore as _QtCore

# Import from Designer-based GUI
from crikit.ui.qt_CompositeColor import Ui_Form as Ui_CompositeColor_Form
from sciplot.ui.widget_mpl import MplCanvas as _MplCanvas
from crikit.ui.qt_GrayScaleImgInfoBar import Ui_formWidgetGrayScaleImgInfoBar as Ui_GrayImgInfoBar
from crikit.ui.qt_ColorModeSetting import Ui_Form as Ui_ColorModeSetting
from crikit.ui.qt_BlankLayout import Ui_Form as Ui_Blank
from crikit.ui.qt_PopSpectrumGS import Ui_Form as Ui_PopSpectrumGS
from crikit.ui.qt_ImageGainMath import Ui_Form as Ui_ImageGainMath

# Generic imports for MPL-incorporation
import matplotlib as _mpl
from matplotlib.pyplot import colormaps as _plt_colormaps

from sciplot.sciplotUI import SciPlotUI as _SciPlotUI

#import matplotlib.pyplot as _plt

_mpl.use('Qt5Agg')
_mpl.rcParams['font.family'] = 'sans-serif'
_mpl.rcParams['font.size'] = 10

from matplotlib.backends.backend_qt5agg import (NavigationToolbar2QT as _NavigationToolbar)

from crikit.ui.classes_ui import BW, SingleColor, CompositeColor


[docs]class widgetImageGainMath(_QWidget): """ Panel that controle image gain and applies math """ OPERATION_STRINGS = ['','+','-','*','/','Peak b/w troughs', 'SUM', 'SUM(ABS(Re) + 1j*ABS(Im))', 'Max', 'Min', 'MaxAbs', 'MinAbs'] OPERATION_FREQ_COUNT = [1, 2, 2, 2,2, 3, 2, 2, 2, 2, 2, 2] COND_TYPE_STRINGS = ['>','<','=','<=','>='] assert len(OPERATION_FREQ_COUNT) == len(OPERATION_STRINGS), 'Operation strings and freq num do not agree' def __init__(self, parent=None, **kwargs): super().__init__(parent) self.ui = Ui_ImageGainMath() self.ui.setupUi(self) self.ui.comboBoxCondOps.addItem('OFF') for item in widgetImageGainMath.OPERATION_STRINGS: self.ui.comboBoxOperations.addItem(item) self.ui.comboBoxCondOps.addItem(item) for item in widgetImageGainMath.COND_TYPE_STRINGS: self.ui.comboBoxCondInEquality.addItem(item) self.ui.comboBoxOperations.currentIndexChanged.connect(self.operationchange) self.ui.comboBoxCondOps.currentIndexChanged.connect(self.condOpsChange)
[docs] def clear(self): """ Resets the ui to it's initial state """ self.ui.checkBoxDisable.setChecked(False) self.ui.spinBoxGain.setValue(1.0) self.ui.tabWidgetMath.setCurrentIndex(0) self.ui.pushButtonOpFreq1.setText('Freq 1') self.ui.pushButtonOpFreq2.setText('Freq 2') self.ui.pushButtonOpFreq3.setText('Freq 3') self.ui.comboBoxOperations.setCurrentIndex(0) self.ui.pushButtonCondFreq1.setText('Freq 1') self.ui.pushButtonCondFreq2.setText('Freq 2') self.ui.pushButtonCondFreq3.setText('Freq 3') self.ui.comboBoxCondOps.setCurrentIndex(0) self.ui.comboBoxCondInEquality.setCurrentIndex(0) self.ui.spinBoxInEquality.setValue(0.0)
[docs] def condOpsChange(self): index = self.ui.comboBoxCondOps.currentIndex() if index == 0: num_freq = 0 else: num_freq = widgetImageGainMath.OPERATION_FREQ_COUNT[index-1] self.ui.pushButtonCondFreq1.setEnabled(False) self.ui.pushButtonCondFreq2.setEnabled(False) self.ui.pushButtonCondFreq3.setEnabled(False) self.ui.comboBoxCondInEquality.setEnabled(False) self.ui.spinBoxInEquality.setEnabled(False) if num_freq >= 1: self.ui.pushButtonCondFreq1.setEnabled(True) self.ui.comboBoxCondInEquality.setEnabled(True) self.ui.spinBoxInEquality.setEnabled(True) if num_freq >= 2: self.ui.pushButtonCondFreq2.setEnabled(True) if num_freq >= 3: self.ui.pushButtonCondFreq3.setEnabled(True)
[docs] def operationchange(self): index = self.ui.comboBoxOperations.currentIndex() num_freq = widgetImageGainMath.OPERATION_FREQ_COUNT[index] self.ui.pushButtonOpFreq1.setEnabled(False) self.ui.pushButtonOpFreq2.setEnabled(False) self.ui.pushButtonOpFreq3.setEnabled(False) if num_freq >= 1: self.ui.pushButtonOpFreq1.setEnabled(True) if num_freq >= 2: self.ui.pushButtonOpFreq2.setEnabled(True) if num_freq >= 3: self.ui.pushButtonOpFreq3.setEnabled(True)
[docs]class widgetPopSpectrumGS(_QWidget): """ Panel that let's user pop the current image, an average spectrum, or a grayscale image to SciPlot """ def __init__(self, parent=None, **kwargs): super().__init__(parent) self.ui = Ui_PopSpectrumGS() self.ui.setupUi(self)
[docs]class widgetGrayScaleInfoBar(_QWidget): """ Grayscale image info bar """ def __init__(self, parent = None, **kwargs): super().__init__(parent) self.ui = Ui_GrayImgInfoBar() self.ui.setupUi(self)
[docs]class widgetColorMode(_QWidget): """ Color mode selector """ def __init__(self, parent=None, **kwargs): super().__init__(parent) self.ui = Ui_ColorModeSetting() self.ui.setupUi(self) # Get all MPL named colors color_list = ['red', 'green', 'blue', 'magenta', 'cyan', 'yellow', 'black', 'white', 'CUSTOM'] color_list.extend(sorted(set(_mpl.colors.cnames.keys()) - set(color_list))) self.ui.comboBoxBGColor.addItems(color_list) self.ui.comboBoxFGColor.addItems(color_list) self.ui.comboBoxBGColor.setCurrentIndex(color_list.index('black')) # Get all mpl colormaps and set combo box list_of_colormaps = sorted(_plt_colormaps()) self.ui.comboBoxColormap.addItems(list_of_colormaps) # Set default colormap to 'gray' idx = self.ui.comboBoxColormap.findText('gray') self.ui.comboBoxColormap.setCurrentIndex(idx)
[docs]class widgetBWImg(_QWidget): """ Grayscale image widget """ def __init__(self, parent = None, **kwargs): super().__init__(parent) self.win = Ui_Blank() self.win.setupUi(self) self.win.gridLayout.setEnabled(False) self._img_defaults = {'showcbar': True, 'axison': True} self.gsinfo = widgetGrayScaleInfoBar(parent=self) self.colormode = widgetColorMode(parent=self) self.colormode.ui.comboBoxColorMode.setCurrentIndex(1) self.colormode.ui.comboBoxColormap.setVisible(True) self.colormode.ui.labelColormap.setVisible(True) self.colormode.ui.comboBoxFGColor.setVisible(False) self.colormode.ui.comboBoxBGColor.setVisible(False) self.colormode.ui.comboBoxColorMode.setVisible(False) self.colormode.ui.labelBGColor.setVisible(False) self.colormode.ui.labelFGColor.setVisible(False) self.colormode.ui.labelColorMode.setVisible(False) self.popimage = widgetPopSpectrumGS(parent=self) self.popimage.ui.pushButtonGSPop.setVisible(False) self.ui = self.gsinfo.ui # Alias self.win.horizLayout = _QHBoxLayout() self.win.horizLayout.setContentsMargins(2,2,2,2) self.win.verticalLayout.insertLayout(0, self.win.horizLayout) self.win.horizLayout.insertWidget(0, self.gsinfo, alignment=_QtCore.Qt.AlignHCenter) self.win.horizLayout.insertWidget(0, self.colormode, alignment=_QtCore.Qt.AlignBottom) # Initialize underlying data self.initData() self.external_plots = [] # Stand-in image data self.data.grayscaleimage = _np.dot(_np.ones([100,1]),_np.linspace(1,100,100)[None,:]) self.data.set_x(_np.linspace(1,400,self.data.xlen)) self.data.set_y(_np.linspace(1,400,self.data.ylen)) # Calculate extent of image winextent = (self.data.x.min(), self.data.x.max(), self.data.y.min(), self.data.y.max()) # MPL canvas self.mpl = _MplCanvas(**kwargs) self.mpl.cbar = None # Monkey patch on a cbar object # Create stand-image plot self.createImg(img=self.data.image, xunits=self.data.xunits, yunits=self.data.yunits, extent=winextent, cmap=self.colormode.ui.comboBoxColormap.currentText()) try: self.mpl.fig.tight_layout() except Exception: print('tight_layout failed (widget_images 1') # Insert canvas widget into this widget self.win.verticalLayout.insertWidget(0,self.mpl, alignment=_QtCore.Qt.AlignCenter) self.win.verticalLayout.insertWidget(0,self.popimage, alignment=_QtCore.Qt.AlignCenter) self.win.verticalLayout.insertWidget(0,self.mpl.toolbar, alignment=_QtCore.Qt.AlignHCenter) # # SIGNAL & SLOTS self.ui.checkBoxFixed.stateChanged.connect(self.checkBoxFixed) self.ui.checkBoxRemOutliers.stateChanged.connect(self.checkBoxRemOutliers) self.ui.spinBoxStdDevs.editingFinished.connect(self.checkBoxRemOutliers) # New self.ui.comboBoxAboveMax.currentIndexChanged.connect(self.comboBoxCompress) self.ui.comboBoxBelowMin.currentIndexChanged.connect(self.comboBoxCompress) self.ui.spinBoxMax.editingFinished.connect(self.spinBoxMinMaxSet) self.ui.spinBoxMin.editingFinished.connect(self.spinBoxMinMaxSet) self.colormode.ui.comboBoxColormap.currentIndexChanged.connect(self.checkBoxFixed) self.popimage.ui.pushButtonPop.pressed.connect(lambda: self.createImg_Ext(img=self.data.image, cmap=self.colormode.ui.comboBoxColormap.currentText(), showcbar=True, extent=self.data.winextent, xunits=self.data.xunits, yunits=self.data.yunits, parent=parent))
[docs] def initData(self): """ (Re)-initialize self.data """ self.data = BW()
[docs] def createImg_Ext(self, img, xunits = None, yunits = None, extent = None, showcbar = True, axison = True, cmap = _mpl.cm.gray, parent=None): """ Create new figure window and show image of img """ self.external_plots.append(_SciPlotUI(parent=parent)) self.external_plots[-1].imshow(img, x_label=xunits, y_label=yunits, cmap=cmap, cbar=showcbar, extent=extent)
[docs] def createImg(self, img, xunits = None, yunits = None, extent = None, cmap = _mpl.cm.gray): self.mpl.ax.clear() self.mpl.img = self.mpl.ax.imshow(img, interpolation = 'none', extent = extent, cmap = cmap, origin='lower') if xunits is not None: self.mpl.ax.xaxis.set_label_text(xunits) if yunits is not None: self.mpl.ax.yaxis.set_label_text(yunits) if self._img_defaults['axison'] == False: self.mpl.ax.set_axis_off() # print(self.mpl.cbar) if self.mpl.cbar is not None: self.mpl.cbar.remove() self.mpl.cbar = None if self._img_defaults['showcbar'] == True: self.mpl.cbar = self.mpl.fig.colorbar(self.mpl.img) if self.ui.checkBoxFixed.isChecked() == False: self.ui.spinBoxMax.setValue(self.data.maxer) self.ui.spinBoxMin.setValue(self.data.minner)
[docs] def spinBoxMinMaxSet(self): try: self.data.setmin = self.ui.spinBoxMin.value() self.data.setmax = self.ui.spinBoxMax.value() self.ui.checkBoxFixed.setChecked(True) # Spin-Box call from Outlier-related widgets? sent_by = self.sender() if ((sent_by == self.ui.checkBoxRemOutliers) | (sent_by == self.ui.spinBoxStdDevs)): pass elif ((sent_by == self.ui.spinBoxMax) | (sent_by == self.ui.spinBoxMin)): self.ui.checkBoxRemOutliers.setChecked(False) else: pass self.createImg(img=self.data.image, xunits=self.data.xunits, yunits=self.data.yunits, extent=self.data.winextent, cmap=self.colormode.ui.comboBoxColormap.currentText()) self.mpl.draw() except Exception: print('Error in spinBoxMinMaxSet')
[docs] def checkBoxRemOutliers(self): """ """ if self.ui.checkBoxRemOutliers.isChecked() == False: pass else: new_max = self.data.mean + self.ui.spinBoxStdDevs.value()* \ self.data.std new_min = self.data.mean - self.ui.spinBoxStdDevs.value()* \ self.data.std self.ui.spinBoxMax.setValue(new_max) self.ui.spinBoxMin.setValue(new_min) self.spinBoxMinMaxSet() self.createImg(img=self.data.image, xunits=self.data.xunits, yunits=self.data.yunits, extent=self.data.winextent, cmap=self.colormode.ui.comboBoxColormap.currentText()) self.mpl.draw()
[docs] def checkBoxFixed(self): """ See if the min and max are identified as being fixed by checkbox """ # See if there is a min and max in the textBrowsers if self.ui.checkBoxFixed.isChecked() == True: # Checked try: self.data.setmin = self.ui.spinBoxMin.value() self.data.setmax = self.ui.spinBoxMax.value() if self.ui.comboBoxAboveMax.currentIndex() == 0: self.data.compress_high = False else: self.data.compress_high = True if self.ui.comboBoxBelowMin.currentIndex() == 0: self.data.compress_low = False else: self.data.compress_low = True except Exception: pass else: self.data.setmin = None self.data.setmax = None self.data.compress_low = None self.data.compress_high = None self.ui.checkBoxRemOutliers.setChecked(False) self.createImg(img=self.data.image, xunits=self.data.xunits, yunits=self.data.yunits, extent=self.data.winextent, cmap=self.colormode.ui.comboBoxColormap.currentText()) self.mpl.draw()
[docs] def comboBoxCompress(self): """ See if compression is activated via the comboBoxAboveMax """ if self.ui.comboBoxAboveMax.currentIndex() == 0: self.data.compress_high = False else: self.data.compress_high = True if self.ui.comboBoxBelowMin.currentIndex() == 0: self.data.compress_low = False else: self.data.compress_low = True self.createImg(img=self.data.image, xunits=self.data.xunits, yunits=self.data.yunits, extent=self.data.winextent, cmap=self.colormode.ui.comboBoxColormap.currentText()) self.mpl.draw()
[docs]class widgetSglColor(widgetBWImg): """ Single-color widget """ def __init__(self, parent=None, **kwargs): super().__init__(parent) self.win.gridLayout.setEnabled(False) self._img_defaults = {'showcbar': False, 'axison': True} self.initData() self.data.grayscaleimage = _np.dot(_np.ones([100,1]),_np.linspace(1,100,100)[None,:]) self.data.set_x(_np.linspace(1,400,self.data.xlen)) self.data.set_y(_np.linspace(1,400,self.data.ylen)) self.changeColor() self.colormode.setMaximumHeight(130) self.math = widgetImageGainMath(parent=self) self.win.verticalLayout.insertWidget(3, self.math) # Disconnect colormap-related (from BW parent) self.colormode.ui.comboBoxColormap.currentIndexChanged.disconnect() self.colormode.ui.comboBoxColorMode.setCurrentIndex(0) self.colormode.ui.comboBoxColormap.setVisible(False) self.colormode.ui.labelColormap.setVisible(False) self.colormode.ui.comboBoxFGColor.setVisible(True) self.colormode.ui.comboBoxBGColor.setVisible(True) self.colormode.ui.comboBoxColorMode.setVisible(False) self.colormode.ui.labelBGColor.setVisible(True) self.colormode.ui.labelFGColor.setVisible(True) self.colormode.ui.labelColorMode.setVisible(True) self.colormode.ui.comboBoxFGColor.currentIndexChanged.connect(self.changeColor) self.colormode.ui.comboBoxBGColor.currentIndexChanged.connect(self.changeColor) self.math.ui.spinBoxGain.editingFinished.connect(self.applyGain) self.math.ui.pushButtonGain1.pressed.connect(self.gain1) self.math.ui.checkBoxDisable.stateChanged.connect(self.disabled) self.popimage.ui.pushButtonGSPop.setVisible(True) try: self.popimage.ui.pushButtonPop.pressed.disconnect() except Exception: pass self.popimage.ui.pushButtonPop.pressed.connect(lambda: self.createImg_Ext(img = self.data.image, showcbar=False, extent=self.data.winextent, xunits=self.data.xunits, yunits=self.data.yunits, parent=parent)) try: self.popimage.ui.pushButtonGSPop.pressed.disconnect() except TypeError: pass # Just means pushButtonGSPop wasn't connected to anything self.popimage.ui.pushButtonGSPop.pressed.connect(lambda: self.createImg_Ext(img = self.data.imageGS, showcbar=True, extent=self.data.winextent, xunits=self.data.xunits, yunits=self.data.yunits, parent=parent))
[docs] def initData(self): """ (Re)-initialize self.data """ self.data = SingleColor()
[docs] def changeColor(self): # try: if self.sender() == self.colormode.ui.comboBoxFGColor: color_str = self.colormode.ui.comboBoxFGColor.currentText() if color_str == 'CUSTOM': color = _QColorDialog.getColor().getRgb() color = [round(color[0]/255,2), round(color[1]/255,2), round(color[2]/255,2)] self.data.colormap = color else: self.data.colormap = _mpl.colors.colorConverter.to_rgb(_mpl.colors.cnames[color_str]) elif self.sender() == self.colormode.ui.comboBoxBGColor: bgcolor_str = self.colormode.ui.comboBoxBGColor.currentText() if bgcolor_str == 'CUSTOM': bgcolor = _QColorDialog.getColor().getRgb() bgcolor = [round(bgcolor[0]/255,2), round(bgcolor[1]/255,2), round(bgcolor[2]/255,2)] self.data.bgcolor = bgcolor else: self.data.bgcolor = _mpl.colors.colorConverter.to_rgb(_mpl.colors.cnames[bgcolor_str]) self.createImg(img = self.data.image, xunits = self.data.xunits, yunits = self.data.yunits, extent = self.data.winextent) self.mpl.draw()
[docs] def applyGain(self): self.data.setgain = self.math.ui.spinBoxGain.value() self.changeColor() if self.data.setgain == 0.0: self.math.ui.checkBoxDisable.setChecked(True) else: self.math.ui.checkBoxDisable.setChecked(False)
[docs] def gain1(self): self.math.ui.spinBoxGain.setValue(1.0)
[docs] def disabled(self): if self.math.ui.checkBoxDisable.isChecked(): self.math.ui.spinBoxGain.setValue(0.0) else: self.math.ui.spinBoxGain.setValue(1.0)
[docs]class widgetCompositeColor(_QWidget): def __init__(self, sgl_color_widget_list = None, parent = None, **kwargs): super(widgetCompositeColor, self).__init__(parent) ## Double check the spellings self._img_defaults = {'showcbar':False, 'axison':True} self.ui = Ui_CompositeColor_Form() self.ui.setupUi(self) # Initialize underlying data self.initData(sgl_color_widget_list) self.external_plots = [] # Create stand-in image data self.data.grayscaleimage = _np.dot(_np.ones([100,1]),_np.linspace(1,100,100)[None,:]) self.data.set_x(_np.linspace(1,400,self.data.xlen)) self.data.set_y(_np.linspace(1,400,self.data.ylen)) winextent = (self.data.x.min(), self.data.x.max(), self.data.y.min(), self.data.y.max()) # Instantiate mpl widget self.mpl = _MplCanvas(**kwargs) self.mpl.cbar = None # Monkey patch on a cbar object # Background color-related # Get all MPL named colors color_list = ['black', 'white', 'CUSTOM', 'red', 'green', 'blue', 'magenta', 'cyan', 'yellow'] color_list.extend(sorted(set(_mpl.colors.cnames.keys()) - set(color_list))) self.ui.comboBoxBGColor.addItems(color_list) self.ui.comboBoxBGColor.setCurrentIndex(color_list.index('black')) # Emission/Absorption mode settings self.ui.comboBoxColorMode.setCurrentIndex(0) # Emission mode is default # Create stand-in image data self.createImg(img = self.data.image, xunits = self.data.xunits, yunits = self.data.yunits, extent = winextent) try: self.mpl.fig.tight_layout() except Exception: print('tight_layout failed (widget_image: 3') # Insert mpl widget into this widget self.ui.verticalLayout.insertWidget(0,self.mpl, alignment=_QtCore.Qt.AlignHCenter) self.ui.verticalLayout.insertWidget(0,self.mpl.toolbar, alignment=_QtCore.Qt.AlignHCenter) self.popimage = widgetPopSpectrumGS(self) self.ui.verticalLayout.insertWidget(1, self.popimage, alignment=_QtCore.Qt.AlignHCenter) self.popimage.ui.pushButtonPop.pressed.connect(lambda: self.createImg_Ext(img = self.data.image, showcbar=False, extent=self.data.winextent, xunits=self.data.xunits, yunits=self.data.yunits, parent=parent)) self.popimage.ui.pushButtonGSPop.setEnabled(False) self.popimage.ui.pushButtonSpectrum.setEnabled(False) self.ui.comboBoxBGColor.setEnabled(False) self.ui.comboBoxBGColor.setVisible(False) # Broken -- don't know if it will ever work self.ui.labelBGColor.setVisible(False) # Broken self.ui.comboBoxColorMode.currentIndexChanged.connect(self.changeMode)
[docs] def initData(self, sgl_color_widget_list): """ (Re)-initialize self.data """ if sgl_color_widget_list is None: self.data = CompositeColor() else: temp = [] for count in sgl_color_widget_list: temp.append(count.data) self.data = CompositeColor(temp)
[docs] def createImg(self, img, xunits = None, yunits = None, extent = None, cmap = _mpl.cm.gray): self.mpl.ax.clear() self.mpl.img = self.mpl.ax.imshow(img, interpolation = 'none', extent = extent, cmap = cmap, origin='lower') if xunits is not None: self.mpl.ax.xaxis.set_label_text(xunits) if yunits is not None: self.mpl.ax.yaxis.set_label_text(yunits) if self._img_defaults['axison'] == False: self.mpl.ax.set_axis_off() if self.mpl.cbar is not None: self.mpl.cbar.remove() if self._img_defaults['showcbar'] == True: self.mpl.cbar = self.mpl.fig.colorbar(self.mpl.img)
[docs] def createImg_Ext(self, img, xunits = None, yunits = None, extent = None, showcbar = True, axison = True, cmap = _mpl.cm.gray, parent=None): """ Create new figure window and show image of img """ self.external_plots.append(_SciPlotUI(parent=parent)) self.external_plots[-1].imshow(img, x_label=xunits, y_label=yunits, cmap=cmap, cbar=showcbar, extent=extent)
# BROKEN -- May never work # def changeBGColor(self): # """ # Does not work as expected # """ # color_str = self.ui.comboBoxBGColor.currentText() # self.data.bgcolor = _mpl.colors.to_rgb(_mpl.colors.cnames[color_str]) # self.createImg(img = self.data.image, xunits = self.data.xunits, # yunits = self.data.yunits, # extent = self.data.winextent) # self.mpl.fig.tight_layout() # self.mpl.draw()
[docs] def changeMode(self): self.data.mode = self.ui.comboBoxColorMode.currentIndex() # self.data.mode = _np.abs(self.data.mode - 1).astype(int) self.mpl.ax.clear() self.createImg(img = self.data.image, xunits = self.data.xunits, yunits = self.data.yunits, extent = self.data.winextent) try: self.mpl.fig.tight_layout() except Exception: print('tight_layout failed (widget_image: 3') self.mpl.draw()
if __name__ == '__main__': app = _QApplication(_sys.argv) app.setStyle('Cleanlooks') winBWImg = widgetBWImg() winBWImg.setWindowTitle('BW Image') winBWImg.show() winSglColor = widgetSglColor() winSglColor.setWindowTitle('Single Color') winSglColor.colormode.ui.comboBoxBGColor.setCurrentIndex(7) winSglColor.show() winSglColor2 = widgetSglColor() winSglColor2.colormode.ui.comboBoxFGColor.setCurrentIndex(1) winSglColor2.colormode.ui.comboBoxBGColor.setCurrentIndex(7) winSglColor2.setWindowTitle('Single Color') winSglColor2.show() winColorMath = widgetImageGainMath() winColorMath.setWindowTitle('Color Math') winColorMath.show() winCompositeColor = widgetCompositeColor(sgl_color_widget_list=[winSglColor, winSglColor2]) winCompositeColor.setWindowTitle('Composite Color') winCompositeColor.show() _sys.exit(app.exec_())