From e21ab2e2ada22ae19290116b5846e7c115b110f3 Mon Sep 17 00:00:00 2001 From: sccolbert Date: Fri, 6 Nov 2009 14:42:46 +0100 Subject: [PATCH] progress commit --- scikits/image/io/_plugins/q_color_mixer.py | 309 +++++++++++++++++ scikits/image/io/_plugins/qt_plugin.py | 381 +-------------------- 2 files changed, 314 insertions(+), 376 deletions(-) create mode 100644 scikits/image/io/_plugins/q_color_mixer.py diff --git a/scikits/image/io/_plugins/q_color_mixer.py b/scikits/image/io/_plugins/q_color_mixer.py new file mode 100644 index 00000000..e5e4c26d --- /dev/null +++ b/scikits/image/io/_plugins/q_color_mixer.py @@ -0,0 +1,309 @@ +# the module for the qt color_mixer plugin +from PyQt4 import QtGui, QtCore +from PyQt4.QtGui import (QWidget, QStackedWidget, QSlider, QVBoxLayout, + QGridLayout, QLabel) + +from util import ColorMixer + + + + +class IntelligentSlider(QWidget): + ''' A slider that adds a 'name' attribute and calls a callback + with 'name' as an argument to the registerd callback. + + This allows you to create large groups of sliders in a loop, + but still keep track of the individual events + + It also prints a label below the slider. + + The range of the slider is hardcoded from zero - 1000, + but it supports a conversion factor so you can scale the results''' + + def __init__(self, name, a, b, callback): + QWidget.__init__(self) + self.name = name + self.callback = callback + self.a = a + self.b = b + + self.slider = QSlider() + self.slider.setRange(0, 1000) + self.slider.setValue(500) + self.slider.valueChanged.connect(self.slider_changed) + + self.name_label = QLabel() + self.name_label.setText(self.name) + self.name_label.setAlignment(QtCore.Qt.AlignCenter) + + self.value_label = QLabel() + self.value_label.setText(str(self.slider.value() * self.a + self.b)) + self.value_label.setAlignment(QtCore.Qt.AlignCenter) + + self.layout = QVBoxLayout(self) + self.layout.addWidget(self.name_label) + self.layout.addWidget(self.slider) + self.layout.addWidget(self.value_label) + + # bind this to the valueChanged signal of the slider + def slider_changed(self, val): + val = self.val() + self.value_label.setText(str(val)[:4]) + self.callback(self.name, val) + + def set_conv_fac(self, a, b): + self.a = a + self.b = b + + def set_value(self, val): + self.slider.setValue(int((val - self.a) / self.b)) + + def val(self): + return self.value() * self.a + self.b + + +class MixerPanel(QWidget): + '''A color mixer to hook up to an image. + You pass the image you the panel to operate on + and it operates on that image in place. You also + pass a callback to be called to trigger a refresh. + This callback is called every time the mixer modifies + your image.''' + def __init__(self, img): + QWidget.__init__(self) + + self.img = img + self.mixer = ColorMixer(self.img) + + #--------------------------------------------------------------- + # ComboBox + #--------------------------------------------------------------- + + self.combo_box_entries = ['RGB Color', 'HSV Color', + 'Brightness/Contrast', + 'Gamma (Sigmoidal)'] + self.combo_box = QtGui.QComboBox() + for entry in self.combo_box_entries: + self.combo_box.addItem(entry) + self.combo_box.currentIndexChanged.connect(self.combo_box_changed) + + #--------------------------------------------------------------- + # RGB color sliders + #--------------------------------------------------------------- + + # radio buttons + self.rgb_add = QtGui.QRadioButton('Additive') + self.rgb_mul = QtGui.QRadioButton('Multiplicative') + self.rgb_mul.toggled.connect(self.rgb_radio_changed) + self.rgb_add.toggled.connect(self.rgb_radio_changed) + + # sliders + rs = IntelligentSlider('R', 0.51, -255, self.rgb_changed) + gs = IntelligentSlider('G', 0.51, -255, self.rgb_changed) + bs = IntelligentSlider('B', 0.51, -255, self.rgb_changed) + self.rs = rs + self.gs = gs + self.bs = bs + + self.rgb_widget = QWidget() + self.rgb_widget.layout = QGridLayout(self.rgb_widget) + self.rgb_widget.layout.addWidget(self.rgb_add, 0, 0, 1, 3) + self.rgb_widget.layout.addWidget(self.rgb_mul, 1, 0, 1, 3) + self.rgb_widget.layout.addWidget(self.rs, 2, 0) + self.rgb_widget.layout.addWidget(self.gs, 2, 1) + self.rgb_widget.layout.addWidget(self.bs, 2, 2) + + + #--------------------------------------------------------------- + # HSV sliders + #--------------------------------------------------------------- + + # radio buttons + self.hsv_add = QtGui.QRadioButton('Additive') + self.hsv_mul = QtGui.QRadioButton('Multiplicative') + self.hsv_mul.toggled.connect(self.hsv_radio_changed) + self.hsv_mul.toggled.connect(self.hsv_radio_changed) + + # sliders + hs = IntelligentSlider('H', 0.36, -180, self.hsv_changed) + ss = IntelligentSlider('S', 0.002, 0, self.hsv_changed) + vs = IntelligentSlider('V', 0.002, 0, self.hsv_changed) + self.hs = hs + self.ss = ss + self.vs = vs + + self.hsv_widget = QWidget() + self.hsv_widget.layout = QGridLayout(self.hsv_widget) + self.hsv_widget.layout.addWidget(self.hsv_add, 0, 0, 1, 3) + self.hsv_widget.layout.addWidget(self.hsv_mul, 1, 0, 1, 3) + self.hsv_widget.layout.addWidget(self.hs, 2, 0) + self.hsv_widget.layout.addWidget(self.ss, 2, 1) + self.hsv_widget.layout.addWidget(self.vs, 2, 2) + + + #--------------------------------------------------------------- + # Brightness/Contrast sliders + #--------------------------------------------------------------- + + # sliders + cont = IntelligentSlider('x', 0.002, 0, self.bright_changed) + bright = IntelligentSlider('+', 0.51, -155, self.bright_changed) + self.cont = cont + self.bright = bright + + # layout + self.bright_widget = QWidget() + self.bright_widget.layout = QtGui.QGridLayout(self.bright_widget) + self.bright_widget.layout.addWidget(self.cont, 0, 0) + self.bright_widget.layout.addWidget(self.bright, 0, 1) + + + ''' + #--------------------------------------------------------------- + # Gamma sliders + #--------------------------------------------------------------- + # sliders + self.gamma_sliders = NSliderBlock(2, + [(100, 1200, 100, 'alpha', 0.01), + (0, 1200, 0, 'beta', 0.01)], + self.gamma_changed) + + # layout + self.gamma_widget = QWidget() + self.gamma_widget.layout = QtGui.QGridLayout(self.gamma_widget) + self.gamma_widget.layout.addWidget(self.gamma_sliders, 0, 0) + ''' + + #--------------------------------------------------------------- + # Buttons + #--------------------------------------------------------------- + self.commit_button = QtGui.QPushButton('Commit') + self.commit_button.clicked.connect(self.commit_changes) + self.revert_button = QtGui.QPushButton('Revert') + self.revert_button.clicked.connect(self.revert_changes) + + #--------------------------------------------------------------- + # Mixer Layout + #--------------------------------------------------------------- + self.sliders = QStackedWidget() + self.sliders.addWidget(self.rgb_widget) + self.sliders.addWidget(self.hsv_widget) + self.sliders.addWidget(self.bright_widget) + + self.layout = QtGui.QGridLayout(self) + self.layout.addWidget(self.combo_box, 0, 0) + self.layout.addWidget(self.sliders, 1, 0) + self.layout.addWidget(self.commit_button, 2, 0) + self.layout.addWidget(self.revert_button, 3, 0) + + #--------------------------------------------------------------- + # Initialization + #--------------------------------------------------------------- + + self.combo_box.setCurrentIndex(0) + self.sliders.setCurrentIndex(2) + #self.hide_sliders() + #self.rgb_widget.show() + #self.rgb_mul.setChecked(True) + #self.hsv_mul.setChecked(True) + + def rgb_changed(self, name, val): + pass + + + def hsv_changed(self, name, val): + pass + + def bright_changed(self, name, val): + # doesnt matter which slider changed we need both + # values + factor = self.bright_sliders.sliders['x'].conv_val() + offset = self.bright_sliders.sliders['+'].conv_val() + self.mixer.brightness(offset, factor) + self.update() + + def gamma_changed(self, name, val): + # doesnt matter which slider changed we need both + # values + alpha = self.gamma_sliders.sliders['alpha'].conv_val() + beta = self.gamma_sliders.sliders['beta'].conv_val() + self.mixer.sigmoid_gamma(alpha, beta) + self.update() + + def iter_all_sliders(self): + pass + + def reset_sliders(self): + self.rgb_add_sliders.set_sliders({'R': 0, 'G': 0, 'B': 0}) + self.rgb_mul_sliders.set_sliders({'R': 500, 'G': 500, 'B': 500}) + self.hsv_add_sliders.set_sliders({'H': 0, 'S': 0, 'V': 0}) + self.hsv_mul_sliders.set_sliders({'H': 0, 'S': 500, 'V': 500}) + self.bright_sliders.set_sliders({'+': 0, 'x': 500}) + self.gamma_sliders.set_sliders({'alpha': 100, 'beta': 0}) + + def combo_box_changed(self, index): + self.reset_sliders() + self.mixer.set_to_stateimg() + self.update() + combo_box_map={0: self.show_rgb, 1: self.show_hsv, + 2: self.show_bright, 3: self.show_gamma} + combo_box_map[index]() + + def hide_sliders(self): + self.rgb_widget.hide() + self.hsv_widget.hide() + self.bright_widget.hide() + self.gamma_sliders.hide() + + def rgb_radio_changed(self): + if self.rgb_add.isChecked(): + self.rgb_add_sliders.show() + self.rgb_mul_sliders.hide() + elif self.rgb_mul.isChecked(): + self.rgb_mul_sliders.show() + self.rgb_add_sliders.hide() + else: + pass + + self.reset_sliders() + self.mixer.set_to_stateimg() + self.update() + + def hsv_radio_changed(self): + if self.hsv_add.isChecked(): + self.hsv_add_sliders.show() + self.hsv_mul_sliders.hide() + elif self.hsv_mul.isChecked(): + self.hsv_mul_sliders.show() + self.hsv_add_sliders.hide() + else: + pass + + self.reset_sliders() + self.mixer.set_to_stateimg() + self.update() + + def show_rgb(self): + self.hide_sliders() + self.rgb_widget.show() + + def show_hsv(self): + self.hide_sliders() + self.hsv_widget.show() + + def show_bright(self): + self.hide_sliders() + self.bright_widget.show() + + def show_gamma(self): + self.hide_sliders() + self.gamma_sliders.show() + + def commit_changes(self): + self.mixer.commit_changes() + self.update() + + def revert_changes(self): + self.mixer.revert() + self.reset_sliders() + self.update() \ No newline at end of file diff --git a/scikits/image/io/_plugins/qt_plugin.py b/scikits/image/io/_plugins/qt_plugin.py index a7d95a98..88516c2d 100644 --- a/scikits/image/io/_plugins/qt_plugin.py +++ b/scikits/image/io/_plugins/qt_plugin.py @@ -1,4 +1,4 @@ -from util import prepare_for_display, window_manager, GuiLockError, ColorMixer +from util import prepare_for_display, window_manager, GuiLockError import numpy as np import sys @@ -17,6 +17,7 @@ else: QLabel, QWidget, QVBoxLayout, QSlider, QPainter, QColor, QFrame) from PyQt4 import QtCore, QtGui + from q_color_mixer import MixerPanel except ImportError: print 'PyQT4 libraries not installed. Plugin not loaded.' @@ -73,380 +74,6 @@ else: pass - class IntelligentSlider(QSlider): - ''' A slider that adds a 'name' attribute and calls a callback - with 'name' as an argument to the registerd callback. - - This allows you to create large groups of sliders in a loop, - but still keep track of the individual events''' - - def __init__(self, name, callback, conv_fac): - QSlider.__init__(self) - self.name = name - self.callback = callback - self.conv_fac = conv_fac - - self.name_label = QLabel() - self.name_label.setText(self.name) - self.name_label.setAlignment(QtCore.Qt.AlignCenter) - - self.value_label = QLabel() - self.value_label.setText('') - self.value_label.setAlignment(QtCore.Qt.AlignCenter) - - # bind this to the valueChanged signal of the slider - def i_changed(self, val): - val = self.conv_val() - self.value_label.setText(str(val)[:4]) - self.callback(self.name, val) - - def conv_val(self): - return self.value() * self.conv_fac - - - class NSliderBlock(QWidget): - '''Creates a block of n sliders with ranges - specified as a list of tuples. The fourth entry - in the tuple will be used as a dictionary key - so you can access the slider later. - So the tuple should be (min, max, initial, name) - - The callback is the function to be called - when a slider value changes. The callback will be - called with the following arguments (name, value). - - You can get a hook to a specific slider using - NSliderBlock.sliders[name] - - ''' - - def __init__(self, n, ranges_labels, callback): - QWidget.__init__(self) - - if len(ranges_labels) != n: - raise ValueError('not enough or too many ranges supplied') - - self.callback = callback - - # each key will give you - self.sliders = {} - self.layout = QtGui.QGridLayout(self) - - for i in range(n): - params = ranges_labels[i] - if len(params) != 5: - raise ValueError('Tuples must be length 4') - - name = params[3] - conv_fac = params[4] - - slider = IntelligentSlider(name, self.callback, conv_fac) - slider.setMinimum(params[0]) - slider.setMaximum(params[1]) - slider.setValue(params[2]) - slider.valueChanged.connect(slider.i_changed) - - self.sliders[name] = slider - - self.layout.addWidget(slider.name_label, 0, i) - self.layout.addWidget(slider, 1, i, QtCore.Qt.AlignHCenter) - self.layout.addWidget(slider.value_label, 2, i) - - self.layout.setColumnMinimumWidth(i, 50) - - def set_sliders(self, vals): - # vals should a dict to of slider names and set vals - if len(vals) != len(self.sliders): - raise ValueError('Wrong number of values') - - for key, value in vals.iteritems(): - self.sliders[key].setValue(value) - - class MixerPanel(QWidget): - '''A color mixer to hook up to an image. - You pass the image you the panel to operate on - and it operates on that image in place. You also - pass a callback to be called to trigger a refresh. - This callback is called every time the mixer modifies - your image.''' - def __init__(self, img, callback): - QWidget.__init__(self) - - self.img = img - self.update = callback - self.mixer = ColorMixer(self.img) - - #--------------------------------------------------------------- - # ComboBox - #--------------------------------------------------------------- - - self.combo_box_entries = ['RGB Color', 'HSV Color', - 'Brightness/Contrast', - 'Gamma (Sigmoidal)'] - self.combo_box = QtGui.QComboBox() - for entry in self.combo_box_entries: - self.combo_box.addItem(entry) - self.combo_box.currentIndexChanged.connect(self.combo_box_changed) - - #--------------------------------------------------------------- - # RGB color sliders - #--------------------------------------------------------------- - - # radio buttons - self.rgb_add = QtGui.QRadioButton('Additive') - self.rgb_mul = QtGui.QRadioButton('Multiplicative') - self.rgb_mul.toggled.connect(self.rgb_radio_changed) - self.rgb_add.toggled.connect(self.rgb_radio_changed) - - # additive sliders - self.rgb_add_sliders = NSliderBlock(3, [(-255, 255, 0, 'R', 1), - (-255, 255, 0, 'G', 1), - (-255, 255, 0, 'B', 1)], - self.rgb_add_changed) - - # multiplicative sliders - self.rgb_mul_sliders = NSliderBlock(3, [(0, 1000, 500, 'R', .002), - (0, 1000, 500, 'G', .002), - (0, 1000, 500, 'B', .002)], - self.rgb_mul_changed) - - # layout - self.rgb_widget = QWidget() - self.rgb_widget.layout = QtGui.QGridLayout(self.rgb_widget) - self.rgb_widget.layout.addWidget(self.rgb_add, 0, 0) - self.rgb_widget.layout.addWidget(self.rgb_mul, 1, 0) - self.rgb_widget.layout.addWidget(self.rgb_add_sliders, 2, 0) - self.rgb_widget.layout.addWidget(self.rgb_mul_sliders, 2, 0) - - #--------------------------------------------------------------- - # HSV sliders - #--------------------------------------------------------------- - - # radio buttons - self.hsv_add = QtGui.QRadioButton('Additive') - self.hsv_mul = QtGui.QRadioButton('Multiplicative') - self.hsv_mul.toggled.connect(self.hsv_radio_changed) - self.hsv_add.toggled.connect(self.hsv_radio_changed) - - # additive sliders - self.hsv_add_sliders = NSliderBlock(3, [(-180, 180, 0, 'H', 1), - (-100, 100, 0, 'S', .01), - (-100, 100, 0, 'V', .01)], - self.hsv_add_changed) - - # multiplicative sliders - self.hsv_mul_sliders = NSliderBlock(3, [(-180, 180, 0, 'H', 1), - (0, 1000, 500, 'S', .002), - (0, 1000, 500, 'V', .002)], - self.hsv_mul_changed) - - # layout - self.hsv_widget = QWidget() - self.hsv_widget.layout = QtGui.QGridLayout(self.hsv_widget) - self.hsv_widget.layout.addWidget(self.hsv_add, 0, 0) - self.hsv_widget.layout.addWidget(self.hsv_mul, 1, 0) - self.hsv_widget.layout.addWidget(self.hsv_add_sliders, 2, 0) - self.hsv_widget.layout.addWidget(self.hsv_mul_sliders, 2, 0) - - #--------------------------------------------------------------- - # Brightness sliders - #--------------------------------------------------------------- - - # sliders - self.bright_sliders = NSliderBlock(2, - [(0, 1000, 500, 'x', 0.002), - (-255, 255, 0, '+', 1)], - self.bright_changed) - - # layout - self.bright_widget = QWidget() - self.bright_widget.layout = QtGui.QGridLayout(self.bright_widget) - self.bright_widget.layout.addWidget(self.bright_sliders, 0, 0) - - #--------------------------------------------------------------- - # Gamma sliders - #--------------------------------------------------------------- - # sliders - self.gamma_sliders = NSliderBlock(2, - [(100, 1200, 100, 'alpha', 0.01), - (0, 1200, 0, 'beta', 0.01)], - self.gamma_changed) - - # layout - self.gamma_widget = QWidget() - self.gamma_widget.layout = QtGui.QGridLayout(self.gamma_widget) - self.gamma_widget.layout.addWidget(self.gamma_sliders, 0, 0) - - #--------------------------------------------------------------- - # Buttons - #--------------------------------------------------------------- - self.commit_button = QtGui.QPushButton('Commit') - self.commit_button.clicked.connect(self.commit_changes) - self.revert_button = QtGui.QPushButton('Revert') - self.revert_button.clicked.connect(self.revert_changes) - - #--------------------------------------------------------------- - # Mixer Layout - #--------------------------------------------------------------- - self.layout = QtGui.QGridLayout(self) - self.layout.addWidget(self.combo_box, 0, 0) - self.layout.addWidget(self.rgb_widget, 1, 0) - self.layout.addWidget(self.hsv_widget, 1, 0) - self.layout.addWidget(self.gamma_widget, 1, 0) - self.layout.addWidget(self.bright_widget, 1, 0) - - self.layout.addWidget(self.commit_button, 2, 0) - self.layout.addWidget(self.revert_button, 3, 0) - - #--------------------------------------------------------------- - # Initialization - #--------------------------------------------------------------- - - self.combo_box.setCurrentIndex(0) - self.hide_sliders() - self.rgb_widget.show() - self.rgb_mul.setChecked(True) - self.hsv_mul.setChecked(True) - - def rgb_add_changed(self, name, val): - if not self.rgb_add.isChecked(): - return - if name == 'R': - self.mixer.add(self.mixer.RED, val) - elif name == 'G': - self.mixer.add(self.mixer.GREEN, val) - elif name == 'B': - self.mixer.add(self.mixer.BLUE, val) - else: - return - self.update() - - def rgb_mul_changed(self, name, val): - if not self.rgb_mul.isChecked(): - return - if name == 'R': - self.mixer.multiply(self.mixer.RED, val) - elif name == 'G': - self.mixer.multiply(self.mixer.GREEN, val) - elif name == 'B': - self.mixer.multiply(self.mixer.BLUE, val) - else: - return - self.update() - - def hsv_add_changed(self, name, val): - if not self.hsv_add.isChecked(): - return - h = self.hsv_add_sliders.sliders['H'].conv_val() - s = self.hsv_add_sliders.sliders['S'].conv_val() - v = self.hsv_add_sliders.sliders['V'].conv_val() - self.mixer.hsv_add(h, s, v) - self.update() - - def hsv_mul_changed(self, name, val): - if not self.hsv_mul.isChecked(): - return - h = self.hsv_mul_sliders.sliders['H'].conv_val() - s = self.hsv_mul_sliders.sliders['S'].conv_val() - v = self.hsv_mul_sliders.sliders['V'].conv_val() - self.mixer.hsv_multiply(h, s, v) - self.update() - - def bright_changed(self, name, val): - # doesnt matter which slider changed we need both - # values - factor = self.bright_sliders.sliders['x'].conv_val() - offset = self.bright_sliders.sliders['+'].conv_val() - self.mixer.brightness(offset, factor) - self.update() - - def gamma_changed(self, name, val): - # doesnt matter which slider changed we need both - # values - alpha = self.gamma_sliders.sliders['alpha'].conv_val() - beta = self.gamma_sliders.sliders['beta'].conv_val() - self.mixer.sigmoid_gamma(alpha, beta) - self.update() - - def iter_all_sliders(self): - pass - - def reset_sliders(self): - self.rgb_add_sliders.set_sliders({'R': 0, 'G': 0, 'B': 0}) - self.rgb_mul_sliders.set_sliders({'R': 500, 'G': 500, 'B': 500}) - self.hsv_add_sliders.set_sliders({'H': 0, 'S': 0, 'V': 0}) - self.hsv_mul_sliders.set_sliders({'H': 0, 'S': 500, 'V': 500}) - self.bright_sliders.set_sliders({'+': 0, 'x': 500}) - self.gamma_sliders.set_sliders({'alpha': 100, 'beta': 0}) - - def combo_box_changed(self, index): - self.reset_sliders() - self.mixer.set_to_stateimg() - self.update() - combo_box_map={0: self.show_rgb, 1: self.show_hsv, - 2: self.show_bright, 3: self.show_gamma} - combo_box_map[index]() - - def hide_sliders(self): - self.rgb_widget.hide() - self.hsv_widget.hide() - self.bright_widget.hide() - self.gamma_sliders.hide() - - def rgb_radio_changed(self): - if self.rgb_add.isChecked(): - self.rgb_add_sliders.show() - self.rgb_mul_sliders.hide() - elif self.rgb_mul.isChecked(): - self.rgb_mul_sliders.show() - self.rgb_add_sliders.hide() - else: - pass - - self.reset_sliders() - self.mixer.set_to_stateimg() - self.update() - - def hsv_radio_changed(self): - if self.hsv_add.isChecked(): - self.hsv_add_sliders.show() - self.hsv_mul_sliders.hide() - elif self.hsv_mul.isChecked(): - self.hsv_mul_sliders.show() - self.hsv_add_sliders.hide() - else: - pass - - self.reset_sliders() - self.mixer.set_to_stateimg() - self.update() - - def show_rgb(self): - self.hide_sliders() - self.rgb_widget.show() - - def show_hsv(self): - self.hide_sliders() - self.hsv_widget.show() - - def show_bright(self): - self.hide_sliders() - self.bright_widget.show() - - def show_gamma(self): - self.hide_sliders() - self.gamma_sliders.show() - - def commit_changes(self): - self.mixer.commit_changes() - self.update() - - def revert_changes(self): - self.mixer.revert() - self.reset_sliders() - self.update() - - class RGBHSVDisplay(QWidget): def __init__(self): QWidget.__init__(self) @@ -621,7 +248,7 @@ else: self.label.setMouseTracking(True) self.label.setMinimumSize(QtCore.QSize(100, 100)) - self.mixer_panel = MixerPanel(self.arr, self.refresh_image) + self.mixer_panel = MixerPanel(self.arr) self.layout.addWidget(self.mixer_panel, 0, 2) self.mixer_panel.show() @@ -644,6 +271,7 @@ else: self.layout.addWidget(self.save_variable, 1, 1) self.layout.addWidget(self.save_file, 1, 2) + '''' # hook up the mixer sliders move events to trigger a # histogram redraw. self.mixer_panel.rgb_add_sliders.sliders['R'].\ @@ -674,6 +302,7 @@ else: sliderMoved.connect(self.update_histogram) self.mixer_panel.bright_sliders.sliders['x'].\ sliderMoved.connect(self.update_histogram) + ''' def update_histogram(self): self.rgb_hist.update_hists(self.calc_hist())