Пример #1
0
class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle(
            "Pyside2 Progress Bar")  # Configure le titre de la fenêtre
        self.setGeometry(300, 300, 500,
                         400)  # Configure la taille de la fenêtre

        self.setIcon()

        # Create Progress Bar
        self.statusLabel = QLabel("Showing Progress")
        self.progressBar = QProgressBar()
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(100)

        self.createStatusBar()

    def setIcon(self):
        appIcon = QIcon("icon.png")
        self.setWindowIcon(appIcon)

    def createStatusBar(self):
        self.statusBar = QStatusBar()
        self.progressBar.setValue(10)
        self.statusBar.addWidget(self.statusLabel, 1)
        self.statusBar.addWidget(self.progressBar, 2)
        self.setStatusBar(self.statusBar)
Пример #2
0
class MainWindow(QMainWindow):
    # Constructor function
    def __init__(self):
        super(MainWindow, self).__init__()
        self.initGUI()

    def initGUI(self):
        self.setWindowTitle("Main Window")
        self.setGeometry(300, 250, 400, 300)
        self.statusLabel = QLabel('Showing Progress')
        self.CreateProgessBar()
        self.CreateStatusBar()
        self.show()

    def CreateProgessBar(self):
        self.progressBar = QProgressBar()
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(100)

    def CreateStatusBar(self):  # Function to create the status bar
        self.myStatusBar = QStatusBar()
        #self.progressBar.setValue(0)
        self.myStatusBar.addWidget(self.statusLabel, 1)
        self.myStatusBar.addWidget(self.progressBar, 2)
        self.setStatusBar(self.myStatusBar)

    def ShowProgress(self, progress):  # Function to show progress
        self.progressBar.setValue(progress)
        if progress == 100:
            self.statusLabel.setText('Ready')
            return
class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("sttting icon")
        self.setGeometry(300, 300, 500, 400)
        self.setIcon()
        # showing a hint, or tooltip
        self.setToolTip("this is window")
#        self.setButton()
        self.center()
        self.pushButton()
        
        self.statusLabel = QLabel("showing progress")
        self.progressbar = QProgressBar()
        self.progressbar.setMinimum(0)
        self.progressbar.setMaximum(100)
        self.createStatusBar()
    def setIcon(self):
        appIcon = QIcon("Screenshot from 2019-10-15 09-33-25.png")
        self.setWindowIcon(appIcon)
   
    def setButton(self):
        btn1 = QPushButton("Quit", self)
        btn1.move(50,100)
        btn1.clicked.connect(self.quitApp)
        
    def quitApp(self):
        userInfo = QMessageBox.question(self, "Confirmation", "Do you want to quit the application ?", QMessageBox.Yes|QMessageBox.No)
        if(userInfo == QMessageBox.Yes):
            myapp.quit()
        elif(userInfo == QMessageBox.No):
            pass
    def center(self):
        qRect = self.frameGeometry()
        centerPoint = QDesktopWidget().availableGeometry().center()
        qRect.moveCenter(centerPoint)
        self.move(qRect.topLeft())
        
    def pushButton(self):
        self.aboutButton = QPushButton("About box", self)
        self.aboutButton.move(50, 100)
#        self.move(50, 100)
        self.aboutButton.clicked.connect(self.aboutBox)
    def aboutBox(self):
        QMessageBox.about(self.aboutButton, "About pyside 2", "Pyside 2 is cross platfirmn gui")
    def createStatusBar(self):
        self.myStatus = QStatusBar()
#        self.myStatus.showMessage("status bar is ready", 3000)
        self.progressbar.setValue(10)
        self.myStatus.addWidget(self.statusLabel, 1)
        self.myStatus.addWidget(self.progressbar, 2)
        self.setStatusBar(self.myStatus)
Пример #4
0
    def initUI(self):
        self.but = QPushButton('スタート')
        self.but.clicked.connect(self.task_start)
        self.setCentralWidget(self.but)

        status_label = QLabel('進捗')
        status_label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        self.proggress_bar = QProgressBar()
        self.proggress_bar.setSizePolicy(QSizePolicy.Expanding,
                                         QSizePolicy.Fixed)

        status_bar = QStatusBar()
        status_bar.addWidget(status_label, 1)
        status_bar.addWidget(self.proggress_bar, 2)

        self.setStatusBar(status_bar)
Пример #5
0
class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()

        self.setWindowTitle("Progress Bar")
        self.setGeometry(300, 300, 300, 300)
        self.statusLabel = QLabel("showing progress")
        self.progressBar = QProgressBar()
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(100)
        self.progressBar.setValue(20)
        self.createStatusBar()

    def createStatusBar(self):
        self.statusBar = QStatusBar()

        self.statusBar.addWidget(self.statusLabel, 1)
        self.statusBar.addWidget(self.progressBar, 2)
        self.setStatusBar(self.statusBar)
Пример #6
0
class MainWindow(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle("A Company Login Windows")
        self.setGeometry(300,250,400,300)
        
        #self.CreateStatusBar()
        self.CreateProgressBar()
        #self.showProgress()


    def CreateStatusBar(self):
        self.myStatusBar = QStatusBar()

        self.myStatusBar.showMessage('Ready',0)
        
        self.setStatusBar(self.myStatusBar)

    def CreateProgressBar(self):
        self.myStatusBar = QStatusBar()
        
        self.progressBar = QProgressBar()
        self.statusLabel = QLabel("Showing Progress")
        #self.finishLabel = QLabel("Finish Progress")
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(100)
        self.progressBar.setValue(0)
        self.myStatusBar.addWidget(self.statusLabel,1)
        self.myStatusBar.addWidget(self.progressBar,2)
        #self.myStatusBar.addWidget(self.finishLabel,3)

        self.setStatusBar(self.myStatusBar)

    def showProgress(self):
        while(self.progressBar.value() < self.progressBar.maximum()):
            self.progressBar.setValue(self.progressBar.value() + 10)
            time.sleep(1)
        self.statusLabel.setText('Ready') 
Пример #7
0
class MainWindow(QMainWindow):
    def __init__(self, rtsp_url: str, parent=None):
        super().__init__(parent)
        self.image_updater = ImageUpdater(rtsp_url, self)

        self.status_bar = QStatusBar()
        self.setStatusBar(self.status_bar)

        self.position_label = QLabel("X: -, Y: -")
        self.status_bar.addWidget(self.position_label)

        self.central_widget = QWidget()

        self.main_grid = QGridLayout()
        self.secondary_grid = QGridLayout()
        self.main_grid.addLayout(self.secondary_grid, 0, 0)

        self.main_image = ImageWidget("Connecting...", 0.7)
        self.main_image.mouse_move.connect(
            lambda x, y: self.position_label.setText(f"X: {x}, Y: {y}"))
        self.main_grid.addWidget(self.main_image, 0, 1)

        self.roi_image = QLabel("No image data")
        self.secondary_grid.addWidget(self.roi_image, 0, 0)

        self.central_widget.setLayout(self.main_grid)
        self.setCentralWidget(self.central_widget)
        self.resize(1600, 800)
        self.setWindowTitle('Parking statistics')
        self.show()

        self.image_updater.update.connect(self.main_image.update_image,
                                          Qt.QueuedConnection)
        self.image_updater.start()

    def closeEvent(self, event: QCloseEvent):
        self.image_updater.stop()
        event.accept()
Пример #8
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.setGeometry(300,200,500,100)

        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.gridLayout = QtWidgets.QGridLayout(self.centralWidget)

        selectVideoLabel = QLabel(self.centralWidget)
        selectVideoLabel.setText("Select a video to summarize:")

        self.file_Select_Btn = QPushButton(self.centralWidget)
        self.file_Select_Btn.setGeometry(QtCore.QRect(1082, 80, 121, 28))
        self.file_Select_Btn.setObjectName("file_Select_Btn")
        self.file_Select_Btn.setText("Load Video")

        self.gridLayout.addWidget(selectVideoLabel)

        self.gridLayout.addWidget(self.file_Select_Btn)


        MainWindow.setCentralWidget(self.centralWidget)

        self.statusLabel = QLabel("Loading Video ...")
        self.progressbar = QProgressBar()
        self.progressbar.setMinimum(0)
        self.progressbar.setMaximum(100)

        self.createStatusBar()


        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def createStatusBar(self):
        self.statusBar = QStatusBar()
        self.progressbar.setValue(0)
        self.statusBar.addWidget(self.statusLabel, 1)
        self.statusBar.addWidget(self.progressbar, 2)
Пример #9
0
class Main_Window(QMainWindow):
    '''Our Main Window Class'''
    def __init__(self):
        '''Constructure Function'''
        QMainWindow.__init__(self)
        self.setWindowTitle("A Sample Text Editor")
        self.setWindowIcon(QIcon('doc_open.png'))
        self.setGeometry(350, 250, 550, 400)  # self.setGeometry(x,y,w,h)
        #self.setMinimumSize(250,250)# Size -> Width * Height
        #self.setMaximumSize(750,750)
        self.CreateStatusBar()
        #self.CreateProgressBar()
        #self.showProgress()
        self.setUpComponents()

    def setUpComponents(self):
        '''Setting Up Central Widget'''
        self.textEdit = QTextEdit("Enter your Text Here")
        self.setCentralWidget(self.textEdit)

        self.CreateActions()
        self.CreateMenus()
        self.CreateToolBar()

        self.fileMenu.addAction(self.newAction)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(self.exitAction)
        self.fileMenu.addAction(self.copyAction)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(self.pasteAction)
        self.fileMenu.addAction(self.aboutAction)

        self.mainToolbar.addAction(self.newAction)
        self.mainToolbar.addSeparator()
        self.mainToolbar.addAction(self.copyAction)
        self.mainToolbar.addAction(self.pasteAction)

    def CreateToolBar(self):
        '''Function to Create Toolbar'''
        self.mainToolbar = self.addToolBar('Main')

    #Slots Menu When Menu actions are Triggered
    def newFile(self):
        self.textEdit.setText('')

    def exitFile(self):
        self.close()

    def aboutHelp(self):
        QMessageBox.about(self, "About Simple Text Editor",
                          "This Example Demonstrate the Use of Menu Bar")

    def CreateActions(self):
        '''Functions to Create actions for Menus'''
        self.newAction = QAction(QIcon('doc_open.png'),
                                 '&New',
                                 self,
                                 shortcut=QKeySequence.New,
                                 statusTip='Create a New File',
                                 triggered=self.newFile)
        self.exitAction = QAction(QIcon('doc_open.png'),
                                  'E&xit',
                                  self,
                                  shortcut="Ctrl+Q",
                                  statusTip="Exit the Application",
                                  triggered=self.exitFile)
        self.copyAction = QAction(QIcon("doc_open.png"),
                                  'C&opy',
                                  self,
                                  shortcut="Ctrl+c",
                                  statusTip="Copy",
                                  triggered=self.textEdit.copy)
        self.pasteAction = QAction(QIcon('paste.png'),
                                   '&Paste',
                                   self,
                                   shortcut="Ctrl+V",
                                   statusTip="Paste",
                                   triggered=self.textEdit.paste)
        self.aboutAction = QAction(QIcon('about.png'),
                                   'A&bout',
                                   self,
                                   statusTip="Displays info about text editor",
                                   triggered=self.aboutHelp)

    def CreateMenus(self):
        #Actual Menu Bar Item Creation
        '''Function to Create actual menu bar'''
        self.fileMenu = self.menuBar().addMenu("&File")
        self.editMenu = self.menuBar().addMenu("&Edit")
        self.helpMenu = self.menuBar().addMenu("&Help")

    def showProgress(self):
        '''Function to Show Progress'''
        self.CreateProgressBar()
        while (self.progressbar.value() < self.progressbar.maximum()):
            self.progressbar.setValue(self.progressbar.value() + 10)
            time.sleep(0.5)
        self.myProgressMessage.setText("Ready")

    def CreateProgressBar(self):
        '''Function to Create Progrss Bar'''
        self.myProgressMessage = QLabel("In Progress")
        self.progressbar = QProgressBar()
        self.progressbar.setMinimum(0)
        self.progressbar.setMaximum(100)
        self.myProgressStatusBar = QStatusBar()
        self.progressbar.setValue(0)
        self.myProgressStatusBar.addWidget(self.myProgressMessage, 1)
        self.myProgressStatusBar.addWidget(self.progressbar, 2)
        self.setStatusBar(self.myProgressStatusBar)

    def CreateStatusBar(self):
        '''Function to Create Status Bar'''
        self.myStatusBar = QStatusBar()
        self.myStatusBar.showMessage("Getting Ready", 2000)
        self.setStatusBar(self.myStatusBar)
Пример #10
0
class PyFOrg(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        main_widget = QWidget()
        self.gui = gui_gen.Ui_MainWidget()
        self.gui.setupUi(main_widget)

        self.setup_status_bar()

        self.setCentralWidget(main_widget)
        self.load_config()
        self.bind_signals()

        self.req_comp_widgets = [
            self.gui.comp_threshold_slider,
            self.gui.expand_tree,
            self.gui.expand_checked_tree_items,
            self.gui.check_all_tree_items,
            self.gui.collapse_checked_tree_items,
            self.gui.collapse_tree,
            self.gui.uncheck_all_tree_items,
            self.gui.collapse_unchecked_tree_items,
            self.gui.expand_unchecked_tree_items,
            self.gui.button_check_items,
            self.gui.button_move_files,
        ]

        self.enable_comp_widgets(False)

    def enable_comp_widgets(self, enable):
        for widget in self.req_comp_widgets:
            widget.setEnabled(enable)

    def setup_status_bar(self):

        self.status_bar = QStatusBar()
        self.status_label = QLabel(self.status_bar)
        self.status_bar.addWidget(self.status_label)
        self.setStatusBar(self.status_bar)
        self.set_status_text("Idle")

    def set_status_text(self, text):
        self.status_label.setText(text)

    def load_config(self):

        self.config = config.ConfigObj()
        try:
            with open("config.json", "r") as fp:
                self.config.load(json.load(fp))
        except:
            # No config file - Using Defaults
            pass

        self.gui.comp_threshold_slider.setValue(self.config.comp_threshold)
        self.gui.slider_word_length_weighting.setValue(
            self.config.word_length_weighting)
        self.gui.slider_str_length_difference_weighting.setValue(
            self.config.str_length_weighting)
        self.gui.slider_word_length_difference_weighting.setValue(
            self.config.word_difference_weighting)

        self.gui.filename_cleaner_text_ctrl.setText(self.config.strip_str)
        self.gui.sort_source_location.setText(self.config.sort_from_dir)
        self.gui.sort_into_dir.setText(self.config.sort_to_dir)

        self.gui.enable_disable_sort_to.setChecked(
            self.config.enable_sort_to_dir)

        self.gui.text_clean_parentheses_checkbox.setChecked(
            self.config.parentheses)
        self.gui.text_clean_brackets_checkbox.setChecked(self.config.brackets)
        self.gui.text_clean_curly_brackets_checkbox.setChecked(
            self.config.curly_braces)
        self.gui.repeated_filename_checkbox.setChecked(
            self.config.duplicate_segments)
        self.gui.strip_extensions_checkbox.setChecked(
            self.config.file_extensions)

        self.gui.strip_single_letters_no_i_checkbox.setChecked(
            self.config.strip_single_letters_no_i)
        self.gui.strip_single_letters_including_i_checkbox.setChecked(
            self.config.strip_single_letters_including_i)
        self.gui.strip_vol_chapter_strings_checkbox.setChecked(
            self.config.strip_vol_chapter_strings)
        self.gui.strip_digits_checkbox.setChecked(self.config.strip_digits)

        # Update the labels
        self.handler_threshold_slider_adjusted(None)
        self.handler_word_length_weighting_adjusted(None)
        self.handler_str_len_difference_adjusted(None)
        self.handler_word_len_difference_weighting_adjusted(None)

    def bind_signals(self):
        self.gui.slider_word_length_weighting.valueChanged.connect(
            self.handler_word_length_weighting_adjusted)
        self.gui.slider_str_length_difference_weighting.valueChanged.connect(
            self.handler_str_len_difference_adjusted)
        self.gui.slider_word_length_difference_weighting.valueChanged.connect(
            self.handler_word_len_difference_weighting_adjusted)

        self.gui.slider_num_file_for_checking.valueChanged.connect(
            self.handler_check_slider_changed)

        self.gui.text_clean_parentheses_checkbox.stateChanged.connect(
            self.handler_update_checkboxes_config)
        self.gui.text_clean_brackets_checkbox.stateChanged.connect(
            self.handler_update_checkboxes_config)
        self.gui.text_clean_curly_brackets_checkbox.stateChanged.connect(
            self.handler_update_checkboxes_config)
        self.gui.repeated_filename_checkbox.stateChanged.connect(
            self.handler_update_checkboxes_config)
        self.gui.strip_extensions_checkbox.stateChanged.connect(
            self.handler_update_checkboxes_config)
        self.gui.strip_single_letters_no_i_checkbox.stateChanged.connect(
            self.handler_update_checkboxes_config)
        self.gui.strip_single_letters_including_i_checkbox.stateChanged.connect(
            self.handler_update_checkboxes_config)
        self.gui.strip_vol_chapter_strings_checkbox.stateChanged.connect(
            self.handler_update_checkboxes_config)
        self.gui.strip_digits_checkbox.stateChanged.connect(
            self.handler_update_checkboxes_config)

        self.gui.filename_cleaner_text_ctrl.editingFinished.connect(
            self.handler_text_entry_fields)
        self.gui.sort_source_location.editingFinished.connect(
            self.handler_text_entry_fields)
        self.gui.sort_into_dir.editingFinished.connect(
            self.handler_text_entry_fields)

        self.gui.expand_tree.clicked.connect(self.handler_expand_tree)
        self.gui.expand_checked_tree_items.clicked.connect(
            self.handler_expand_checked_tree_items)
        self.gui.check_all_tree_items.clicked.connect(
            self.handler_check_all_tree_items)
        self.gui.collapse_checked_tree_items.clicked.connect(
            self.handler_collapse_checked_tree_items)
        self.gui.collapse_tree.clicked.connect(self.handler_collapse_tree)
        self.gui.uncheck_all_tree_items.clicked.connect(
            self.handler_uncheck_all_tree_items)
        self.gui.collapse_unchecked_tree_items.clicked.connect(
            self.handler_collapse_unchecked_tree_items)
        self.gui.expand_unchecked_tree_items.clicked.connect(
            self.handler_expand_unchecked_tree_items)

        self.gui.button_check_items.clicked.connect(
            self.handler_check_items_with_threshold)

        self.gui.button_move_files.clicked.connect(
            self.handler_move_selected_items_into_new_folders)
        self.gui.start_proc_button.clicked.connect(
            self.handler_start_dir_processing)

        self.gui.select_dir_button.clicked.connect(
            self.handler_select_source_dir_pressed)
        self.gui.select_sort_into_dir_button.clicked.connect(
            self.handler_select_target_dir_pressed)

        self.handler_toggle_sort_to_evt(None)
        self.gui.enable_disable_sort_to.toggled.connect(
            self.handler_toggle_sort_to_evt)

        self.gui.comp_threshold_slider.valueChanged.connect(
            self.handler_threshold_slider_adjusted)
        self.gui.comp_threshold_slider.sliderReleased.connect(
            self.handler_threshold_slider_changed)

    def handler_select_source_dir_pressed(self, _event):

        new_folder = QFileDialog.getExistingDirectory(
            self,
            caption='Select source directory to sort',
            dir=self.config.sort_from_dir)
        if new_folder:
            self.gui.sort_source_location.setText(new_folder)
            self.config.sort_from_dir = new_folder

    def handler_select_target_dir_pressed(self, _event):

        new_folder = QFileDialog.getExistingDirectory(
            self,
            caption='Select target directory to sort into',
            dir=self.config.sort_to_dir)
        if new_folder:
            self.gui.sort_into_dir.setText(new_folder)
            self.config.sort_to_dir = new_folder

    def handler_toggle_sort_to_evt(self, _event):
        self.config.enable_sort_to_dir = self.gui.enable_disable_sort_to.isChecked(
        )

        if not self.config.enable_sort_to_dir:
            self.gui.sort_into_dir.setEnabled(False)
            self.gui.select_sort_into_dir_button.setEnabled(False)
            self.gui.enable_disable_sort_to.setText("Enable")
        else:
            self.gui.sort_into_dir.setEnabled(True)
            self.gui.select_sort_into_dir_button.setEnabled(True)
            self.gui.enable_disable_sort_to.setText("Disable")

    def handler_word_length_weighting_adjusted(self, _event):
        self.config.word_length_weighting = float(
            self.gui.slider_word_length_weighting.value())
        textVal = self.config.word_length_weighting / 1000
        self.gui.value_word_length_weighting.setText("%0.3f" % textVal)

    def handler_str_len_difference_adjusted(self, _event):
        self.config.str_length_weighting = float(
            self.gui.slider_str_length_difference_weighting.value())
        textVal = self.config.str_length_weighting / 1000
        self.gui.value_str_length_difference_weighting.setText("%0.3f" %
                                                               textVal)

    def handler_word_len_difference_weighting_adjusted(self, _event):
        self.config.word_difference_weighting = float(
            self.gui.slider_word_length_difference_weighting.value())
        textVal = self.config.word_difference_weighting / 1000
        self.gui.value_word_length_difference_weighting.setText("%0.3f" %
                                                                textVal)

    def handler_threshold_slider_adjusted(self, _event):
        self.config.comp_threshold = self.gui.comp_threshold_slider.value()
        self.gui.com_threshold_slider_value_label.setText(
            "%0.3f" % self.config.getCompThresh())

    def handler_check_slider_changed(self, _event):
        val = self.gui.slider_num_file_for_checking.value()
        self.gui.slider_num_file_for_checking_label.setText("%s" % val)

    def handler_update_checkboxes_config(self, _event):
        self.config.parentheses = self.gui.text_clean_parentheses_checkbox.isChecked(
        )
        self.config.brackets = self.gui.text_clean_brackets_checkbox.isChecked(
        )
        self.config.curly_braces = self.gui.text_clean_curly_brackets_checkbox.isChecked(
        )
        self.config.duplicate_segments = self.gui.repeated_filename_checkbox.isChecked(
        )
        self.config.file_extensions = self.gui.strip_extensions_checkbox.isChecked(
        )
        self.config.strip_single_letters_no_i = self.gui.strip_single_letters_no_i_checkbox.isChecked(
        )
        self.config.strip_single_letters_including_i = self.gui.strip_single_letters_including_i_checkbox.isChecked(
        )
        self.config.strip_vol_chapter_strings = self.gui.strip_vol_chapter_strings_checkbox.isChecked(
        )
        self.config.strip_digits = self.gui.strip_digits_checkbox.isChecked()

    def handler_threshold_slider_changed(self):
        try:
            assert self.compar
            self.set_status_text("Recomputing similarity tree")
            trimmed_dict = self.compar.trimTree(self.config.getCompThresh())
            self.set_status_text("Trimmed tree contains %s items" %
                                 (len(trimmed_dict), ))
            #print "Adding Tree"
            #print trimmed_dict
            self.add_dict_to_tree(trimmed_dict)
        except:
            traceback.print_stack()
            self.set_status_text("Need to run comparison first")

    def handler_text_entry_fields(self):
        self.config.strip_str = self.gui.filename_cleaner_text_ctrl.text()
        self.config.sort_from_dir = self.gui.sort_source_location.text()
        self.config.sort_to_dir = self.gui.sort_into_dir.text()

    def closeEvent(self, _event):
        self.set_status_text("Exiting")
        try:
            self.compar.close()
        except:
            pass

        with open("config.json", "w") as fp:
            conf = json.dumps(self.config.dump(), indent=4)
            fp.write(conf)

    def handler_start_dir_processing(self, _event):

        terms = self.gui.filename_cleaner_text_ctrl.text().split(":")
        terms = [tmp for tmp in terms if tmp]
        self.config.strip_terms = terms

        if self.config.enable_sort_to_dir and not os.access(
                self.config.sort_to_dir, os.F_OK):
            msg_box = QMessageBox()
            msg_box.setText("Cannot Access Path %s" % self.config.sort_to_dir)
            msg_box.exec_()
            return

        if not os.access(self.config.sort_from_dir, os.F_OK):
            msg_box = QMessageBox()
            msg_box.setText("Cannot Access Path %s" %
                            self.config.sort_from_dir)
            msg_box.exec_()
            return

        self.compar = file_comparator.Comparator(self.config)

        if self.config.enable_sort_to_dir:
            self.compar.sort_into(self.config.sort_from_dir,
                                  self.config.sort_to_dir)
        else:
            self.compar.sort(self.config.sort_from_dir)

        self.set_status_text("Sort Complete")

        trimmed_dict = self.compar.trimTree(self.config.getCompThresh())

        #print trimmed_dict
        if len(trimmed_dict) < 1:
            self.set_status_text(
                "No items. Either folder is empty or thresholds are set incorrectly."
            )
        else:
            self.set_status_text("Trimmed tree contains %s items" %
                                 (len(trimmed_dict), ))

        self.add_dict_to_tree(trimmed_dict)

        self.enable_comp_widgets(True)

    def handler_check_items_with_threshold(self, _event):
        slider_val = self.gui.slider_num_file_for_checking.value()

        for idx in range(self.gui.file_tree.topLevelItemCount()):
            item = self.gui.file_tree.topLevelItem(idx)

            child_cnt = item.childCount()

            if child_cnt >= slider_val:
                item.setCheckState(0, Qt.Checked)
            else:
                item.setCheckState(0, Qt.Unchecked)

    def handler_expand_tree(self, _event):
        self.gui.file_tree.expandAll()

    def handler_collapse_tree(self, _event):
        self.gui.file_tree.collapseAll()

    def handler_check_all_tree_items(self, _event):
        for idx in range(self.gui.file_tree.topLevelItemCount()):
            item = self.gui.file_tree.topLevelItem(idx)
            item.setCheckState(0, Qt.Checked)

    def handler_uncheck_all_tree_items(self, _event):
        for idx in range(self.gui.file_tree.topLevelItemCount()):
            item = self.gui.file_tree.topLevelItem(idx)
            item.setCheckState(0, Qt.Unchecked)

    def handler_collapse_checked_tree_items(self, _event):

        for idx in range(self.gui.file_tree.topLevelItemCount()):
            item = self.gui.file_tree.topLevelItem(idx)
            checked = item.checkState(0)

            if checked in [Qt.Checked, Qt.PartiallyChecked]:
                item.setExpanded(False)

    def handler_expand_checked_tree_items(self, _event):
        for idx in range(self.gui.file_tree.topLevelItemCount()):
            item = self.gui.file_tree.topLevelItem(idx)
            checked = item.checkState(0)

            if checked in [Qt.Checked, Qt.PartiallyChecked]:
                item.setExpanded(True)

    def handler_collapse_unchecked_tree_items(self, _event):

        for idx in range(self.gui.file_tree.topLevelItemCount()):
            item = self.gui.file_tree.topLevelItem(idx)
            checked = item.checkState(0)

            if checked == Qt.Unchecked:
                item.setExpanded(False)

    def handler_expand_unchecked_tree_items(self, _event):
        for idx in range(self.gui.file_tree.topLevelItemCount()):
            item = self.gui.file_tree.topLevelItem(idx)
            checked = item.checkState(0)

            if checked == Qt.Unchecked:
                item.setExpanded(True)

    def add_dict_to_tree(self, filesList):
        self.gui.file_tree.clear()

        for group in filesList:
            parent = QTreeWidgetItem(self.gui.file_tree)

            parent.setFlags(parent.flags() | Qt.ItemIsTristate
                            | Qt.ItemIsUserCheckable)

            source_item = None
            for item_object, simVal in group.items():

                if simVal == "Source":
                    parent.setText(0, "{}".format(item_object.fn))
                    parent.setText(3, "{}".format(item_object.src_fqpath))
                    source_item = item_object

            assert source_item is not None
            for item_object, simVal in group.items():

                if simVal == "Source":
                    continue

                branch = QTreeWidgetItem(parent)
                branch.setFlags(branch.flags() | Qt.ItemIsUserCheckable)

                branch.setText(CLEANED_NAME_COLUMN, item_object.cn)
                branch.setText(FILE_NAME_COLUMN, item_object.fn)
                branch.setText(SOURCE_FQPATH_COLUMN,
                               "%s" % (item_object.src_fqpath, ))
                branch.setText(DEST_FQPATH_COLUMN,
                               "%s" % (item_object.dest_fqpath, ))
                if isinstance(simVal, (int, float)):
                    branch.setText(SIMILARITY_COLUMN, "%0.5f" % (simVal, ))
                else:
                    branch.setText(SIMILARITY_COLUMN, "%s" % (simVal, ))
                branch.setCheckState(0, Qt.Unchecked)
                branch.item_data = item_object

        self.gui.file_tree.setColumnWidth(CLEANED_NAME_COLUMN, 400)
        self.gui.file_tree.setColumnWidth(FILE_NAME_COLUMN, 400)
        self.gui.file_tree.setColumnWidth(SOURCE_FQPATH_COLUMN, 100)
        self.gui.file_tree.setColumnWidth(DEST_FQPATH_COLUMN, 100)
        self.gui.file_tree.setColumnWidth(SIMILARITY_COLUMN, 100)

    def handler_move_selected_items_into_new_folders(self, _event):

        if self.config.enable_sort_to_dir:
            output_folder = self.config.sort_to_dir
        else:
            output_folder = QFileDialog.getExistingDirectory(
                self,
                caption='Select directory to create new folders in',
                dir=self.config.last_move_to_dir,
            )

        if not output_folder:
            msg_box = QMessageBox()
            msg_box.setText("No output folder! How did this happen?")
            msg_box.exec_()
            return
        self.config.last_move_to_dir = output_folder

        self.set_status_text("Item count: %s" %
                             self.gui.file_tree.topLevelItemCount())
        moved = 0
        errors = 0
        already_existing = 0

        for root_idx in range(self.gui.file_tree.topLevelItemCount()):
            item = self.gui.file_tree.topLevelItem(root_idx)

            child_cnt = item.childCount()
            checked = item.checkState(0)

            if checked in [Qt.Checked, Qt.PartiallyChecked]:

                # Don't create directories if we're in sort-into mode.
                if not self.config.enable_sort_to_dir:
                    # Column 0 is the header column
                    first_child = item.child(0)
                    item_folder_name = os.path.join(
                        output_folder,
                        first_child.item_data.cleared_name.title())

                    if not os.access(item_folder_name, os.F_OK):
                        os.mkdir(item_folder_name)

                    for child_idx in range(child_cnt):
                        child = item.child(child_idx)
                        child.item_data.set_dest_path(item_folder_name)

                for child_idx in range(child_cnt):
                    child = item.child(child_idx)
                    child_checked = child.checkState(0)
                    if child_checked == Qt.Checked:
                        source_fn = child.item_data.src_fqpath
                        dest_fn = child.item_data.dest_fqpath
                        if os.access(dest_fn, os.F_OK):
                            already_existing += 1
                            self.set_status_text(
                                "Destination file %s already exists!" %
                                (dest_fn, ))
                        elif os.access(source_fn, os.F_OK):
                            shutil.move(source_fn, dest_fn)
                            moved += 1
                        else:
                            errors += 1
                            self.set_status_text(
                                "Cannot access source file %s!" %
                                (source_fn, ))

        self.set_status_text(
            "Moved %s files, encountered %s errors and skipped moving %s files as they already exist."
            % (moved, errors, already_existing))
Пример #11
0
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.signals = Signals()
        self.initUI()
        self.setSignals()
        self.decensor = Decensor(self)
        self.load_model()

    def initUI(self):

        grid_layout = QGridLayout()
        grid_layout.setSpacing(10)
        self.setLayout(grid_layout)

        #Tutorial
        self.tutorialLabel = QLabel()
        self.tutorialLabel.setText(
            "Welcome to DeepCreamPy!\n\nIf you're new to DCP, please read the README.\nThis program does nothing without the proper setup of your images.\n\nReport any bugs you encounter to me on Github or Twitter @deeppomf."
        )
        self.tutorialLabel.setAlignment(Qt.AlignCenter)
        self.tutorialLabel.setFont(QFont('Sans Serif', 13))

        #Censor type group
        self.censorTypeGroupBox = QGroupBox('Censor Type')

        barButton = QRadioButton('Bar censor')
        mosaicButton = QRadioButton('Mosaic censor')
        barButton.setChecked(True)

        censorLayout = QVBoxLayout()
        censorLayout.addWidget(barButton)
        censorLayout.addWidget(mosaicButton)
        # censorLayout.addStretch(1)
        self.censorTypeGroupBox.setLayout(censorLayout)

        #Variation count group
        self.variationsGroupBox = QGroupBox('Number of Decensor Variations')

        var1Button = QRadioButton('1')
        var2Button = QRadioButton('2')
        var3Button = QRadioButton('4')
        var1Button.setChecked(True)

        varLayout = QVBoxLayout()
        varLayout.addWidget(var1Button)
        varLayout.addWidget(var2Button)
        varLayout.addWidget(var3Button)
        # varLayout.addStretch(1)
        self.variationsGroupBox.setLayout(varLayout)

        #Decensor button
        self.decensorButton = QPushButton('Decensor Your Images')
        self.decensorButton.clicked.connect(self.decensorClicked)
        self.decensorButton.setSizePolicy(QSizePolicy.Preferred,
                                          QSizePolicy.Preferred)

        #Progress message
        # self.progressGroupBox = QGroupBox('Progress')

        self.progressMessage = QTextEdit()
        self.progressCursor = QTextCursor(self.progressMessage.document())
        self.progressMessage.setTextCursor(self.progressCursor)
        self.progressMessage.setReadOnly(True)
        self.progressCursor.insertText(
            "After you prepared your images, click on the decensor button once to begin decensoring.\nPlease be patient.\nDecensoring will take time.\n"
        )

        # Progress Bar
        self.statusBar = QStatusBar(self)
        self.progressBar = QProgressBar()
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(100)
        self.progressBar.setValue(0)
        self.statusLabel = QLabel("Showing Progress")

        self.statusBar.addWidget(self.statusLabel, 1)
        self.statusBar.addWidget(self.progressBar, 2)

        #put all groups into grid
        # addWidget(row, column, rowSpan, columnSpan)
        grid_layout.addWidget(self.tutorialLabel, 0, 0, 1, 2)
        grid_layout.addWidget(self.censorTypeGroupBox, 1, 0, 1, 1)
        grid_layout.addWidget(self.variationsGroupBox, 1, 1, 1, 1)
        grid_layout.addWidget(self.decensorButton, 2, 0, 1, 2)
        grid_layout.addWidget(self.progressMessage, 3, 0, 1, 2)
        grid_layout.addWidget(self.statusBar, 4, 0, 1, 2)

        #window size settings
        self.resize(900, 600)
        self.center()
        self.setWindowTitle('DeepCreamPy v2.2.0-beta')
        self.show()

    def load_model(self):
        # load model to make able to decensor several times
        self.decensorButton.setEnabled(False)
        self.decensorButton.setText(
            "Loading Machine Learning Model (Please Wait...)")
        self.decensor.start()
        self.decensor.signals = self.signals
        self.progressCursor.insertText(
            "Loading Decensor app consumes 6 GB memory at maximum")

    def setSignals(self):
        self.signals.update_decensorButton_Text.connect(
            self.decensorButton.setText)
        self.signals.update_decensorButton_Enabled.connect(
            self.decensorButton.setEnabled)
        self.signals.update_statusLabel_Text.connect(self.statusLabel.setText)
        self.signals.update_ProgressBar_SET_VALUE.connect(
            self.progressBar.setValue)
        self.signals.update_ProgressBar_MAX_VALUE.connect(
            self.progressBar.setMaximum)
        self.signals.update_ProgressBar_MIN_VALUE.connect(
            self.progressBar.setMinimum)
        # self.signals.insertText_progressCursor.connect(self.progressCursor.insertText)
        self.signals.insertText_progressCursor.connect(
            self.progressMessage.append)
        self.signals.clear_progressMessage.connect(self.progressMessage.clear)
        self.signals.appendText_progressMessage.connect(
            self.progressMessage.append)

    def decensorClicked(self):
        self.decensorButton.setEnabled(False)
        self.progressMessage.clear()
        self.progressCursor.insertText("Decensoring has begun!\n")

        # for now, decensor is initiated when this app is started
        # self.decensor = Decensor(text_edit = self.progressMessage, text_cursor = self.progressCursor, ui_mode = True)

        #https://stackoverflow.com/questions/42349470/pyqt-find-checked-radiobutton-in-a-group
        #set decensor to right settings
        #censor type
        censorTypeElements = self.censorTypeGroupBox.children()
        censorButtons = [
            elem for elem in censorTypeElements
            if isinstance(elem, QRadioButton)
        ]
        for cb in censorButtons:
            if cb.isChecked():
                censorType = cb.text()
        if censorType == 'Bar censor':
            self.decensor.is_mosaic = False
        else:
            self.decensor.is_mosaic = True

        #variations count
        variationsElements = self.variationsGroupBox.children()
        variationsButtons = [
            elem for elem in variationsElements
            if isinstance(elem, QRadioButton)
        ]
        for vb in variationsButtons:
            if vb.isChecked():
                variations = int(vb.text())
        self.decensor.variations = variations

        self.decensorButton.setEnabled(False)
        self.decensor.start()
        # decensor.decensor_all_images_in_folder()

    # #centers the main window
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
Пример #12
0
class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        layout = QHBoxLayout()

        # video player object
        self.video_player = VideoPlayer(self)

        # Tracks table
        self.tracks_table = QTableView()

        # Keeps display options
        self.display_options = {"show_tracks": True,
                                "show_traces": True,
                                "show_labels": True}

        layout.addWidget(self.video_player)
        layout.addWidget(self.tracks_table)

        # Create tracks model and items to show in tracks table.
        self.tracks_model = QStandardItemModel()
        self.tracks_model.setHorizontalHeaderLabels(["Id", "State", "Age"])
        self.tracks_table.setModel(self.tracks_model)
        self.track_items = {}

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        self.setMinimumHeight(800)
        self.setMinimumWidth(1000)

        self.tracks_table.setFixedWidth(300)

        toolbar = QToolBar("Main")
        self.addToolBar(toolbar)

        open_button = QAction(self.style().standardIcon(QStyle.SP_DirOpenIcon), "Open Video File", self)
        open_button.setStatusTip("Open Video File")
        open_button.triggered.connect(self.video_player.open_video_file)
        toolbar.addAction(open_button)

        toolbar.addWidget(QLabel("Tracks"))
        self.tracks_check_box = QCheckBox()
        self.tracks_check_box.toggle()
        self.tracks_check_box.stateChanged.connect(self.tracks)
        toolbar.addWidget(self.tracks_check_box)

        toolbar.addWidget(QLabel("Traces"))
        self.traces_check_box = QCheckBox()
        self.traces_check_box.toggle()
        self.traces_check_box.stateChanged.connect(self.traces)
        toolbar.addWidget(self.traces_check_box)

        toolbar.addWidget(QLabel("Labels"))
        self.labels_check_box = QCheckBox()
        self.labels_check_box.toggle()
        self.labels_check_box.stateChanged.connect(self.labels)
        toolbar.addWidget(self.labels_check_box)

        self.status_bar = QStatusBar()
        self.vps_server_label = QLabel("")
        self.tps_server_label = QLabel("")

        self.status_bar.addWidget(self.vps_server_label)
        self.status_bar.addWidget(self.tps_server_label)

        self.setStatusBar(self.status_bar)

    def get_or_create_track_row(self, track: dict) -> ():
        """
        Get or create a track row in tracks table

        Args:
            track: Track label and trace
        """

        track_id = track[0]
        if track_id not in self.track_items:
            self.track_items[track_id] = self.add_track_row(track)
        return self.track_items[track_id]

    def add_track_row(self, track):
        """
        Adds a track row to the tracks table model.

        Args:
            track: Track label and trace

        Returns:
            id_item
            status_item
            age_item
        """
        id_item = QStandardItem()
        id_item.setText(track[0])
        id_item.setBackground(QBrush(QColor(
            get_random_color(int(track[0]))
        )))
        id_item.setEditable(False)

        status_item = QStandardItem()
        status_item.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
        status_item.setEditable(False)

        age_item = QStandardItem()
        age_item.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)
        age_item.setEditable(False)

        self.tracks_model.appendRow([id_item, status_item, age_item])
        self.tracks_model.sort(0)
        return id_item, status_item, age_item

    def update_track_row(self, track_id, trace):
        """
        Updates track list and model

        Args:
            track_id
            trace
        """
        status = "Active"
        if track_id in self.track_items:
            # If length of the track trace is not changed
            # Track is passive
            if len(self.track_items[track_id]) == len(trace):
                status = "Passive"
        track_id, track_status, track_age = self.get_or_create_track_row(track_id)
        track_status.setText(status)
        track_age.setText(f"{len(trace)//24}")

    def reset_tracks_table(self):
        """Reset tracks_model and track_items"""
        self.tracks_model.removeRows(0, len(self.track_items))
        self.track_items = {}

    def update_server_stats(self, vps_stats_summary, tps_stats_summary):
        """
        Updates server statistics.

        Args:
            vps_stats_summary: Video Processing Server statistics
            tps_stats_summary: Track Processing Server statistics
        """
        self.tps_server_label.setText(tps_stats_summary)
        self.vps_server_label.setText(vps_stats_summary)

    def update_track_viewer(self, tracks):
        """
        Update tracks table

        Args:
            tracks
        """
        if not tracks:  # Skip update if we have no data.
            return

        for track_id, trace in tracks.items():
            self.update_track_row(track_id, trace)

    def traces(self):
        """Changes trace display options."""
        self.display_options["show_traces"] = not self.display_options["show_traces"]

    def labels(self):
        """Changes labels display options."""
        self.display_options["show_labels"] = not self.display_options["show_labels"]

    def tracks(self):
        """Changes tracks display options."""
        self.display_options["show_tracks"] = not self.display_options["show_tracks"]

    def closeEvent(self, event):
        """Exit application."""
        reply = QMessageBox.question(self, 'Window Close', 'Are you sure you want to close the window?',
                                     QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
            self.video_player.close()
            event.accept()

        else:
            event.ignore()
Пример #13
0
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        # Setting a Central Widget
        self.timer_widget = TimerWidget(parent=self)
        self.setCentralWidget(self.timer_widget)
        self.setWindowTitle("Timesheet")

        # Set up a menubar
        menu_bar = self.menuBar()

        # Set up the File Menu
        file_menu = menu_bar.addMenu("File")
        open_action = QAction("Open", self)
        close_action = QAction("Close", self)
        save_action = QAction("Save", self)
        clear_action = QAction("Clear", self)
        file_menu.addAction(open_action)
        file_menu.addAction(close_action)
        file_menu.addAction(save_action)
        file_menu.addAction(clear_action)

        # Set up the Edit Menu
        edit_menu = menu_bar.addMenu("Edit")
        client_action = QAction("View Clients", self)
        viewer_action = QAction("Current Timesheet", self)
        export_action = QAction("Weekly Timesheet", self)
        manual_action = QAction("Manual Change", self)
        edit_menu.addAction(client_action)
        edit_menu.addAction(viewer_action)
        edit_menu.addAction(export_action)
        edit_menu.addAction(manual_action)

        # Connect the buttons
        save_action.triggered.connect(self.timer_widget.save_time)
        clear_action.triggered.connect(self.clear_timesheet)
        close_action.triggered.connect(self.close)
        client_action.triggered.connect(self.show_client_list)
        viewer_action.triggered.connect(self.show_current_timesheet)
        export_action.triggered.connect(self.show_viewer)
        manual_action.triggered.connect(self.show_manual)

        # Set up the statusbar
        self.status_bar = QStatusBar()
        self.status_bar.addWidget(self.timer_widget.status_label)
        self.setStatusBar(self.status_bar)

    def show_client_list(self):
        self.dialog = ClientList(parent=self)
        self.dialog.setModal(True)
        self.dialog.show()

    def clear_timesheet(self, event):
        if ct.current_timesheet:
            ret = self.close_menu_dialog(
                set_text="Clear Timesheet Entries!",
                set_info_text="This will delete all timesheet entries for today. Are you sure?",
            )
            if ret == QMessageBox.No:
                return
            else:
                ct.current_timesheet = defaultdict(float)
                return

    def show_current_timesheet(self):
        self.dialog = CurrentTimesheetViewer(parent=self)
        self.dialog.setModal(True)
        self.dialog.show()

    def show_viewer(self):
        self.dialog = Viewer(parent=self)
        self.dialog.setModal(True)
        self.dialog.show()

    def show_manual(self):
        self.dialog = ChangeTimeWidget(parent=self)
        self.dialog.setModal(True)
        self.dialog.show()

    def closeEvent(self, event):
        if self.timer_widget.is_running:
            ret = self.close_menu_dialog(
                set_text="Your Timesheet is still running!",
                set_info_text="Are you sure you want to exit?",
            )
            if ret == QMessageBox.No:
                event.ignore()
                return
        if ct.current_timesheet:
            ret = self.close_menu_dialog(
                set_text="You have not saved your Timesheet!",
                set_info_text="Are you sure you want to exit?",
            )
            if ret == QMessageBox.No:
                event.ignore()
                return
        self.timer_widget.delete_autosave()
        event.accept()

    def close_menu_dialog(self, set_text, set_info_text):
        msg_box = QMessageBox(self)
        msg_box.setWindowTitle("Exit Warning")
        msg_box.setText(set_text)
        msg_box.setInformativeText(set_info_text)
        msg_box.setIcon(QMessageBox.Critical)
        msg_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        msg_box.setDefaultButton(QMessageBox.No)
        ret = msg_box.exec_()
        return ret
Пример #14
0
class App(QMainWindow):
    # ------------------------------------------
    # -- Initialize the Class
    # ------------------------------------------
    def __init__(self):
        super(App, self).__init__()

        # -- Home Directory
        self.home_path = expanduser("~")

        # -- Base Path
        # self.app_path = os.path.abspath(__file__)
        self.app_path = sys.argv[0]
        self.base_path_split = self.app_path.split('/')
        self.base_path = str('/').join(self.base_path_split[0:-1])

        # -- Files under config
        self.config_file = self.base_path + '/config/config.json'
        self.connect_file = self.base_path + '/config/connect.sh'
        self.table_file = self.base_path + '/config/table.csv'

        self.delimiter_table_row = ';'

        # -- Data of Config File (with Default Values)
        self.config_data_file = {
            'Message': {
                'FileReadSuccess': True,
                'FileReadFailed': True,
                'ColorRedefinition': True
            },
            'Window': {
                'Left': 100,
                'Top': 100,
                'Width': 640,
                'Height': 480
            },
            'Margin': {
                'Left': 11,
                'Top': 11,
                'Right': 11,
                'Bottom': 11
            },
            'Title': {
                'Label': 'SLT - Simple Login Tool - ' + __version__
            },
            'Button': {
                'Connect': {
                    'Label': 'Connect'
                },
                'Message': {
                    'Label': 'X'
                }
            },
            'Table': {
                'Header': [],
                'Column': {
                    'Color':
                    1,  # -- Number of column which used for text matching
                    'Connect': [
                        9, 1
                    ]  # -- These are those column numbers which data picked from the selected row and will be used as connection parameters
                },
                'Cell': {
                    'Color': {}
                }
            }
        }

        # -- Data of Table File
        self.table_data_file = []

        # -- Dictionary of Colors with QColor Elements
        self.color_data = {}

        # -- Central Widget
        self.central_widget = None

        # -- Main Layout
        self.main_layout = None

        # -- Input Box
        self.input_box = None

        # -- Connect Button
        self.connect_button = None

        # -- Message Button
        self.message_button = None

        # -- Message Label
        self.message_label = None
        self.message_label_count = None

        # -- Message List
        self.message_list = []

        # -- Main Table
        self.main_table = None

        # -- Status Bar
        self.status_bar = None

        # -- Messages
        self.messages = {
            'FileReadSuccess': 'INFO: File is opened for read: ',
            'FileReadFailed': 'ERROR: File could not be opened for read: ',
            'ColorRedefinition': 'WARN: Color Redefinition: '
        }

        # -- Initialize the UI
        self.initUI()

    # ------------------------------------------
    # -- Create Main Window
    # ------------------------------------------
    # def createMainWindow(self):
    #     if (self.main_window is None):
    #         self.main_window = QMainWindow(self)

    # ------------------------------------------
    # -- Create Central Widget
    # ------------------------------------------
    def createCentralWidget(self):
        if (self.central_widget is None):
            self.central_widget = QWidget()

        # -- Set Central Widget for QMainWindow
        self.setCentralWidget(self.central_widget)

    # ------------------------------------------
    # -- Create Layout
    # ------------------------------------------
    def createLayout(self):
        if (self.main_layout is None):
            self.main_layout = QGridLayout()

    # ------------------------------------------
    # -- Create Input Box
    # ------------------------------------------
    def createInputBox(self):
        if (self.input_box is None):
            self.input_box = QLineEdit()

        # -- Enable Clear Button
        self.input_box.setClearButtonEnabled(True)

        # -- Create Event if enter pressed
        # self.input_box.editingFinished.connect(self.eventSearchInTable)
        self.input_box.editingFinished.connect(self.eventConnectButtonClicked)

        # -- Create Event if text changed
        self.input_box.textChanged.connect(self.eventSearchInTable)

    # ------------------------------------------
    # -- Search Event
    # ------------------------------------------
    def eventSearchInTable(self):
        # print('Search Event. Look up text is: %s' %(self.input_box.text()))  # -- Debug
        self.refreshTable(self.input_box.text().strip())

    # ------------------------------------------
    # -- Create Connect Button
    # ------------------------------------------
    def createConnectButton(self, text):
        if (self.connect_button is None):
            self.connect_button = QPushButton(text)

        # -- Add Clicked Event
        self.connect_button.clicked.connect(self.eventConnectButtonClicked)

    # ------------------------------------------
    # -- Event for Connect Button Clicked
    # ------------------------------------------
    def eventConnectButtonClicked(self):
        connectParameters = ''
        row = 0

        # print('Connect Button Pressed')  # -- Debug

        if (self.main_table.rowCount() == 1):
            for column in self.config_data_file['Table']['Column']['Connect']:
                cellTable = self.main_table.item(row, column)
                connectParameters += ' ' + str(cellTable.text())

            self.connectExecute(connectParameters)
        # else:
        # print('More than one item in table, therefore cannot decide which one to choose')  # -- Debug

    # ------------------------------------------
    # -- Create Status Bar
    # ------------------------------------------
    def createStatusBar(self):
        if (self.status_bar is None):
            self.status_bar = QStatusBar()

        self.status_bar.addWidget(self.message_label_count, 0)
        self.status_bar.addWidget(VLine(), 0)
        self.status_bar.addWidget(self.message_label, 1)
        self.status_bar.addWidget(self.message_button, 0)

    # ------------------------------------------
    # -- Update Status Bar
    # ------------------------------------------
    def updateStatusBar(self):
        if (self.status_bar is not None):
            # -- Hide the Status Bar if the Message List is empty
            if (len(self.message_list) > 0):
                self.status_bar.show()
            else:
                self.status_bar.hide()

    # ------------------------------------------
    # -- Get Latest Message
    # ------------------------------------------
    def getLatestMessage(self):
        result = None
        length = len(self.message_list)

        if (length > 0):
            result = self.message_list[length - 1]

        return result

    # ------------------------------------------
    # -- Create Message Label
    # ------------------------------------------
    def createMessageLabel(self):
        if (self.message_label is None):
            self.message_label = QLabel(self)

        # -- Add a Text to Message Label
        # self.message_label.setText(self.getLatestMessage())
        self.updateMessageLabel()

    # ------------------------------------------
    # -- Update Message Label with Latest Entry
    # ------------------------------------------
    def updateMessageLabel(self):
        message = ''
        length = len(self.message_list)

        if (self.message_label is not None):
            if (length > 0):
                message = self.message_list[-1]

            self.message_label.setText(message)

    # ------------------------------------------
    # -- Create Message Label Count
    # ------------------------------------------
    def createMessageLabelCount(self):
        if (self.message_label_count is None):
            self.message_label_count = QLabel(self)

        self.updateMessageLabelCount()

    # ------------------------------------------
    # -- Update Message Label Count
    # ------------------------------------------
    def updateMessageLabelCount(self):
        message = ''
        length = len(self.message_list)

        if (self.message_label_count is not None):
            if (length > 0):
                message = '  ' + str(length)

            self.message_label_count.setText(message)

    # ------------------------------------------
    # -- Create Message Button
    # ------------------------------------------
    def createMessageButton(self, text):
        if (self.message_button is None):
            self.message_button = QPushButton(text)

        # -- Add Clicked Event
        self.message_button.clicked.connect(self.eventMessageButtonClicked)

    # ------------------------------------------
    # -- Event for Message Button Clicked
    # ------------------------------------------
    def eventMessageButtonClicked(self):
        length = len(self.message_list)

        # -- Remove the latest item in Message List
        if (length > 0):
            del self.message_list[length - 1]

        # -- Update Message Labels
        self.updateMessageLabel()
        self.updateMessageLabelCount()

        # -- Update the Status Bar
        self.updateStatusBar()

    # ------------------------------------------
    # -- Add a New Message to List
    # ------------------------------------------
    def addNewMessage(self, message):
        self.message_list.append(message)
        self.updateMessageLabel()

        # -- Update Status Bar
        self.updateStatusBar()

    # ------------------------------------------
    # -- Check Table Header
    # ------------------------------------------
    def checkMainTableHeader(self, hostsList):
        # -- Length of the Header defined in the config file
        lengthHeaderconfig_file = len(self.config_data_file['Table']['Header'])

        # -- Length of the First Record
        if (len(hostsList) > 0):
            lengthFirstRecord = len(hostsList[0])
        else:
            lengthFirstRecord = 0

        # -- Append the Header if the list in config file is too short
        if (lengthHeaderconfig_file < lengthFirstRecord):
            for header in range(lengthHeaderconfig_file + 1,
                                lengthFirstRecord + 1):
                self.config_data_file['Table']['Header'].append(str(header))

    # ------------------------------------------
    # -- Create Table
    # ------------------------------------------
    def createMainTable(self, hostsList):
        numCell = 0

        maxTableRow = len(hostsList)
        maxTableColumn = len(self.config_data_file['Table']['Header'])

        if (self.main_table is None):
            self.main_table = QTableWidget()

        # -- Set the Maximum Size of Table
        self.main_table.setColumnCount(maxTableColumn)
        self.main_table.setRowCount(maxTableRow)

        # -- Create the Horizontal Header of Table
        headerTableWidget = self.main_table.horizontalHeader()

        # -- Set the Table Header
        self.main_table.setHorizontalHeaderLabels(
            self.config_data_file['Table']['Header'])

        # -- Hide The Horizontal Table Header
        # self.main_table.horizontalHeader().setVisible(False)

        # -- Set the Cells to Read Only
        self.main_table.setEditTriggers(QTableWidget.NoEditTriggers)

        # -- Set Table Header Properties
        for numCell in range(0, len(self.config_data_file['Table']['Header'])):
            headerTableWidget.setSectionResizeMode(
                numCell, QHeaderView.ResizeToContents)

        # -- Set the First Column to Resizeable
        # headerTableWidget.setSectionResizeMode(0, QHeaderView.Stretch)

        # -- Set the Last Column to Resizeable
        headerTableWidget.setSectionResizeMode(maxTableColumn - 1,
                                               QHeaderView.Stretch)

        # -- Add Double Clicked Event on Table
        self.main_table.itemDoubleClicked.connect(
            self.eventMainTableDoubleClickedOnCell)

        # -- Insert Data into Table
        self.insertDataIntoTable(self.main_table, hostsList)

    # ------------------------------------------
    # -- Double Clicked on Cell Event
    # ------------------------------------------
    def eventMainTableDoubleClickedOnCell(self):
        connectParameters = ''
        row = self.main_table.currentRow()

        # print('Double Clicked on a Table Cell')  # -- Debug

        for column in self.config_data_file['Table']['Column']['Connect']:
            cellTable = self.main_table.item(row, column)
            connectParameters += ' ' + str(cellTable.text())

        self.connectExecute(connectParameters)

    # ------------------------------------------
    # -- Insert Data into the Table
    # ------------------------------------------
    def insertDataIntoTable(self, inputTable, inputRecords):
        maxHeaderColumn = len(self.config_data_file['Table']['Header'])
        maxTableColumn = len(self.config_data_file['Table']['Header'])
        maxTableRow = len(inputRecords)
        colorColumn = self.config_data_file['Table']['Column']['Color']
        numRecord = 0
        numCell = 0

        # -- Set the Maximum size of Table
        inputTable.setColumnCount(maxTableColumn)
        inputTable.setRowCount(maxTableRow)

        for record in inputRecords:
            # print('Record : %s' %(str(record)))  # -- Debug
            for cell in record:
                # print('Cell : %s' %(cell))  # -- Debug
                if (numCell < maxHeaderColumn):
                    inputTable.setItem(numRecord, numCell,
                                       QTableWidgetItem(cell))

                    # -- Set the Background Color of Cells
                    # if (record[colorColumn] in self.colorCell):
                    #     inputTable.item(numRecord, numCell).setBackground(self.colorCell[record[colorColumn]])
                    if (record[colorColumn] in self.config_data_file['Table']
                        ['Cell']['Color']):
                        nameColor = self.config_data_file['Table']['Cell'][
                            'Color'][record[colorColumn]]

                        # print('Cell: %s, %s, %s' %(record[colorColumn], nameColor, self.color_data[nameColor]))  # -- Debug

                        inputTable.item(numRecord, numCell).setBackground(
                            self.color_data[nameColor])

                numCell += 1
            numCell = 0
            numRecord += 1

        inputTable.move(0, 0)

    # ------------------------------------------
    # -- Refresh Table
    # ------------------------------------------
    def refreshTable(self, searchText):
        found = False
        filteredHostsList = []

        # print('Refresh table data.')  # -- Debug

        # -- Clean the Table
        for row in range(self.main_table.rowCount() - 1, -1, -1):
            # print('Remove row: %s' %(str(row))) # -- Debug
            self.main_table.removeRow(row)

        self.main_table.show()

        # -- Update the table_data_file with searchText
        for record in self.table_data_file:
            found = False
            for cell in record:
                if (searchText == ''
                        or cell.lower().find(searchText.lower()) != -1):
                    # print('Found: %s' %(str(cell)))  # -- Debug
                    found = True

            if (found):
                filteredHostsList.append(record)

        # -- Recreate Table Data with filtered Values
        self.insertDataIntoTable(self.main_table, filteredHostsList)

        # -- Refresh the QTableWidget (required due to screen artifact)
        self.main_table.hide()
        self.main_table.show()

    # ------------------------------------------
    # -- Read Config File
    # ------------------------------------------
    def readConfigFile(self, filename):
        fileHandle = None
        message = ''

        try:
            fileHandle = open(filename, 'r')
        except IOError:
            message = self.messages['FileReadFailed'] + filename
            print(message)

            # -- Message
            if (self.config_data_file['Message']['FileReadFailed'] is True):
                self.addNewMessage(message)
        else:
            message = self.messages['FileReadSuccess'] + filename
            print(message)

            # -- Update the Default Data Values with the New Ones
            # self.config_data_file = json.load(fileHandle)
            self.config_data_file.update(json.load(fileHandle))

            # -- Add Colors to the List
            for key, value in self.config_data_file['Color'].items():
                # -- Check the Length of Value (must have 3 elements [R,G,B])
                if (len(value) == 3):
                    self.addColor(key, value[0], value[1], value[2])

            # -- Message
            if (self.config_data_file['Message']['FileReadSuccess'] is True):
                self.addNewMessage(message)

            # print('JSON: %s' %(self.config_data_file))  # -- Debug
        finally:
            if (fileHandle):
                fileHandle.close()

    # ------------------------------------------
    # -- Add Color to the Dictionary
    # ------------------------------------------
    def addColor(self, name, red, green, blue):
        # print('Add Color: %s [%d,%d,%d]' %(name, red, green, blue))  # -- Debug

        # -- Check Red
        if (type(red) is int):
            if (red < 0 or red > 255):
                red = 255
        else:
            red = 255

        # -- Check Green
        if (type(green) is int):
            if (green < 0 or green > 255):
                green = 255
        else:
            green = 255

        # -- Check Blue
        if (type(blue) is int):
            if (blue < 0 or blue > 255):
                blue = 255
        else:
            blue = 255

        # print('Add Color: %s [%d,%d,%d]' %(name, red, green, blue))  # -- Debug

        # -- Add the Color to the Dictionary
        if (name not in self.color_data):
            self.color_data[name] = QColor(red, green, blue)
        else:
            # -- Message
            if (self.config_data_file['Message']['ColorRedefinition'] is True):
                self.addNewMessage(self.messages['ColorRedefinition'] + name)

    # ------------------------------------------
    # -- Read CSV File
    # ------------------------------------------
    def readCsvFile(self, filename):
        fileHandle = None
        result = []
        message = ''

        try:
            fileHandle = open(filename, 'r')
        except IOError:
            message = self.messages['FileReadFailed'] + filename
            print(message)

            # -- Message
            if (self.config_data_file['Message']['FileReadFailed'] is True):
                self.addNewMessage(message)
        else:
            message = self.messages['FileReadSuccess'] + filename
            print(message)

            # -- Message
            if (self.config_data_file['Message']['FileReadSuccess'] is True):
                self.addNewMessage(message)

            fileContent = fileHandle.readlines()

            for line in fileContent:
                strippedLine = line.strip()

                if (strippedLine != ''):
                    if (strippedLine[0] != '#'):
                        # result.append(list(strippedLine.split(self.delimiter_table_row)))  # -- List Items are not Stripped
                        result.append(
                            list(item.strip() for item in strippedLine.split(
                                self.delimiter_table_row))
                        )  # -- List Items are Stripped
                        # print(strippedLine)  # -- Debug

            # -- Debug
            # for line in result:
            #    for column in line:
            #        print('[\'%s\']' %(str(column)), end='')
            #    print('')
        finally:
            if (fileHandle):
                fileHandle.close()

        return result

    # ------------------------------------------
    # -- Execute the Connect Command in Shell
    # ------------------------------------------
    def connectExecute(self, parameters):
        # print('Run: %s %s' %(self.connect_file, parameters))  # -- Debug

        os.system(self.connect_file + ' ' + parameters)

    # ------------------------------------------
    # -- UI Initialization
    # ------------------------------------------
    def initUI(self):
        # -- Read the Config File
        self.readConfigFile(self.config_file)

        # -- Read the Table CSV File
        self.table_data_file = self.readCsvFile(self.table_file)

        # -- Create GUI Elements
        self.createCentralWidget()
        self.createLayout()

        self.createInputBox()
        self.createConnectButton(
            self.config_data_file['Button']['Connect']['Label'])
        self.checkMainTableHeader(self.table_data_file)
        self.createMainTable(self.table_data_file)

        self.createMessageLabel()
        self.createMessageLabelCount()
        self.createMessageButton(
            self.config_data_file['Button']['Message']['Label'])

        self.createStatusBar()
        self.updateStatusBar()

        # -- Set Window Title
        self.setWindowTitle(self.config_data_file['Title']['Label'])

        # -- Set Window Geometry
        self.setGeometry(self.config_data_file['Window']['Left'],
                         self.config_data_file['Window']['Top'],
                         self.config_data_file['Window']['Width'],
                         self.config_data_file['Window']['Height'])

        # -- Set Layout Margins
        self.main_layout.setContentsMargins(
            self.config_data_file['Margin']['Left'],
            self.config_data_file['Margin']['Top'],
            self.config_data_file['Margin']['Right'],
            self.config_data_file['Margin']['Bottom'])

        # -- Set Layout
        self.central_widget.setLayout(self.main_layout)

        # -- Add Widgets to Layout
        self.main_layout.addWidget(self.input_box, 0, 0, 1, 1)
        self.main_layout.addWidget(self.connect_button, 0, 1, 1, 1)
        self.main_layout.addWidget(self.main_table, 1, 0, 1, 2)

        # -- Set Status Bar for QMainWindow
        self.setStatusBar(self.status_bar)
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("open video")
        self.setGeometry(300, 300, 800, 600)
        self.setIcon()
        # showing a hint, or tooltip
        #        self.setToolTip("this is window")
        #        self.center()
        #        self.centralwidget = QWidget(self)
        #        self.setCentralWidget(self.centralwidget)

        self.add_menu()
        self.create_main_frame()

        self.setImageView()

        self.statusLabel = QLabel("showing progress")
        self.progressbar = QProgressBar()
        self.progressbar.setMinimum(0)
        self.progressbar.setMaximum(100)
        self.createStatusBar()
        self.init()

    def init(self):
        self.file_name = ""
        self.timer = QTimer()
        self.timer.timeout.connect(self.displayFrame)

    def create_main_frame(self):
        self.mainWidget = QWidget()
        self.setCentralWidget(self.mainWidget)

    def open_video(self):
        self.fname = QFileDialog.getOpenFileName()

        print(self.fname[0])

        self.cap = cv2.VideoCapture(self.fname[0])
        self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)
        self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)

        self.timer.start()

    def add_menu(self):
        menubar = self.menuBar()
        menu = QMenu('File', self)  # title and parent
        file_action = QAction("Open file", self)  # title and parent
        file_action.setStatusTip("Select a file to play")
        file_action.triggered.connect(self.open_video)

        menu.addAction(file_action)
        menubar.addMenu(menu)
        menubar.setNativeMenuBar(False)
        self.statusBar().showMessage("Ready")

    def displayFrame(self):
        ret, frame = self.cap.read()
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        height, width, channel = frame.shape
        bytesPerLine = 3 * width
        qImg = QImage(frame.data, width, height, bytesPerLine,
                      QImage.Format_RGB888)
        self.imageView.setPixmap(QPixmap(qImg))

    def setImageView(self):
        layout = QVBoxLayout()
        self.imageView = QLabel("no video input")
        layout.addWidget(self.imageView)
        self.mainWidget.setLayout(layout)

    def setIcon(self):
        appIcon = QIcon("Screenshot from 2019-10-15 09-33-25.png")
        self.setWindowIcon(appIcon)

    def center(self):
        qRect = self.frameGeometry()
        centerPoint = QDesktopWidget().availableGeometry().center()
        qRect.moveCenter(centerPoint)
        self.move(qRect.topLeft())

    def createStatusBar(self):
        self.myStatus = QStatusBar()
        #        self.myStatus.showMessage("status bar is ready", 3000)
        self.progressbar.setValue(10)
        self.myStatus.addWidget(self.statusLabel, 1)
        self.myStatus.addWidget(self.progressbar, 2)
        self.setStatusBar(self.myStatus)
Пример #16
0
    def __init__(self, app, appname, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.hide()
        #self.setMinimumSize(640, 480)
        self.setFixedSize(self.geometry().width(), self.geometry().height())
        self.setWindowIcon(QIcon('icon.ico'))
        self.setWindowTitle(appname)

        # Create menu bar
        menu_bar = QMenuBar()

        help_menu = menu_bar.addAction('&Help')
        about_menu = menu_bar.addAction('A&bout')
        exit_menu = menu_bar.addAction('&Exit')

        self.setMenuBar(menu_bar)

        # Make interface layouts
        window = QWidget()
        layout = QVBoxLayout()

        top_section = QVBoxLayout()

        buttons = QGridLayout()
        middle_section = QHBoxLayout()

        label_section = QHBoxLayout()
        range_section = QGridLayout()
        clarity_section = QHBoxLayout()
        plot_section = QHBoxLayout()
        bottom_section = QVBoxLayout()

        status_layout = QHBoxLayout()

        # Create widgets and items
        figure = plt.figure()
        canvas = FigureCanvas(figure)

        label = QLabel(f'''Welcome to {appname}!
Plot any equation of the form y = f(x).
Use the options below to plot your own equation!''')

        help_message = QMessageBox()
        help_message.setTextFormat(Qt.RichText)
        help_message.setText(f'''<h3>Help</h3>
{appname} lets you plot any equation of the form y = f(x).
<br/>
Enter the function f(x), specify the range of x, and click Plot!
<br/><br/>
Operators : <code>+, -, *, /</code><br/>
Variable : <code>x</code><br/>
Functions : <code>sin, cos, tan</code><br/>
<code>pi</code> : π<br/>
<code>e</code> : Exponential e<br/>
<code>c</code> : Speed of Light<br/>''')
        help_message.setStandardButtons(QMessageBox.Ok)
        help_message.setWindowTitle(f'{appname} - Help')
        self.help = help_message

        help_button = QPushButton('Help...')
        help_button.clicked.connect(self.help.exec_)

        about_message = QMessageBox()
        about_message.setWindowTitle(f'{appname} - About')
        about_message.setTextFormat(Qt.RichText)
        about_message.setText(f'''<h3>About</h3>
{appname} is created in PySide2 (Qt), using \
the Matplotlib and Equation PyPI modules for plotting and parsing expressions respectively.
<br/><br/>
Created by <a href="http://paramsid.com">Param Siddharth</a>.''')
        about_message.setStandardButtons(QMessageBox.Ok)
        self.about = about_message

        about_button = QPushButton('About...')
        about_button.clicked.connect(self.about.exec_)

        expr_label = QLabel('f(x) =')
        expr_input = QLineEdit()

        range_label1 = QLabel('Minimum (x):')
        range_min = QLineEdit()
        range_label2 = QLabel('Maximum (x):')
        range_max = QLineEdit()

        clarity_label = QLabel('Clarity:')
        clarity_spinbox = QSpinBox()
        clarity_spinbox.setRange(1, 10000)
        clarity_spinbox.setValue(100)

        plot_button = QPushButton('Plot')
        plot_button.setMaximumWidth(200)

        status = QStatusBar()
        status_text = QLabel('')
        status_text.setStyleSheet('color: #999999;')

        attribution = QLabel(
            'Made with <span style="color: red;">❤</span> by <a href="http://paramsid.com">Param</a>'
        )
        attribution.setTextFormat(Qt.RichText)
        attribution.setStyleSheet('color: #555555; font-size: 20px;')
        attribution.setAlignment(Qt.AlignRight | Qt.AlignVCenter)

        help_menu.triggered.connect(self.help.exec_)
        about_menu.triggered.connect(self.about.exec_)
        exit_menu.triggered.connect(self.close)

        # Configure backend
        backmath.configure(canvas=canvas,
                           figure=figure,
                           btn=plot_button,
                           text=expr_input,
                           limits=(range_min, range_max),
                           status=status_text,
                           range_text=(range_min, range_max),
                           clarity=clarity_spinbox)

        # Finalize and display
        top_section.addWidget(canvas)

        buttons.addWidget(help_button, 0, 0, 1, 1)
        buttons.addWidget(about_button, 0, 1, 1, 1)

        middle_section.addWidget(label)
        middle_section.addLayout(buttons)

        label_section.addWidget(expr_label)
        label_section.addWidget(expr_input)

        equally_spaced = QSizePolicy(QSizePolicy.Preferred,
                                     QSizePolicy.Preferred)
        equally_spaced.setHorizontalStretch(1)

        range_label1.setSizePolicy(equally_spaced)
        range_min.setSizePolicy(equally_spaced)
        range_label2.setSizePolicy(equally_spaced)
        range_max.setSizePolicy(equally_spaced)

        range_label1.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        range_label2.setAlignment(Qt.AlignRight | Qt.AlignVCenter)

        range_section.addWidget(range_label1, 0, 0, 1, 1)
        range_section.addWidget(range_min, 0, 1, 1, 1)
        range_section.addWidget(range_label2, 0, 2, 1, 1)
        range_section.addWidget(range_max, 0, 3, 1, 1)

        clarity_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)

        clarity_section.addWidget(clarity_label)
        clarity_section.addWidget(clarity_spinbox)

        plot_section.addWidget(plot_button)

        status.addWidget(status_text)
        status.addPermanentWidget(attribution)

        status_layout.addWidget(status)

        bottom_section.addLayout(label_section)
        bottom_section.addLayout(range_section)
        bottom_section.addLayout(clarity_section)
        bottom_section.addLayout(plot_section)

        layout.addLayout(top_section)
        layout.addLayout(middle_section)
        layout.addLayout(bottom_section)
        layout.addLayout(status_layout)

        window.setLayout(layout)
        self.setCentralWidget(window)
        self.show()

        status_text.setText('READY ')