Example #1
0
    def spawn_worker_thread(self, worker, **signals):
        # Setup worker and its thread
        thread = QThread(self.parent)
        thread.setTerminationEnabled(True)
        worker.moveToThread(thread)
        thread.started.connect(worker.run)
        thread.worker = worker # TODO: needed?

        # Connect log and any extra signals
        worker.log_signal.connect(self.log_append)
        for signal_name in signals:
            getattr(worker, signal_name).connect(signals[signal_name])

        thread.start()

        self.current_worker_thread = thread
Example #2
0
class QtCodeGen(QtWidgets.QDialog):
    # Folgende Widgets stehen zur Verfügung:
    def __init__(self, kontaktdaten: dict, ROOT_PATH: str, parent = None):
        super().__init__(parent)
        uic.loadUi(os.path.join(PATH, "ui_qtcodegen.ui"), self)
        self.setupUi(self, ROOT_PATH)
        
        self.parent = parent
        self._hardClose = False
        
        # Attribute erstellen
        self.kontaktdaten = kontaktdaten
        self.ROOT_PATH = ROOT_PATH

        # std.out & error auf das Textfeld umleiten
        sys.stdout = EigenerStream(text_schreiben=self.update_ausgabe)
        sys.stderr = EigenerStream(text_schreiben=self.update_ausgabe)

        # Entsprechend Konfigurieren
        self.setup_thread()
        self.thread.start()
        
        # show gui
        self.show()
  
    def __del__(self):
        print("QtCodeGen destruct")
        
    def setupUi(self, QtCodeGen, ROOT_PATH):
        self.setObjectName("QtCodeGen")
        self.setWindowModality(QtCore.Qt.WindowModal)
        self.setModal(False)
        self.resize(700, 300)
        self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowContextHelpButtonHint);
        self.setWindowIcon(QIcon(os.path.join(ROOT_PATH, "images/spritze.ico")))

    def setup_thread(self):
        """
        Thread + Worker erstellen und Konfigurieren
        """
        self.thread = QThread(parent=self)
        self.thread.setTerminationEnabled(True)
        self.worker = Worker(self.kontaktdaten, self.ROOT_PATH)
        
        # Worker und Thread verbinden
        self.worker.moveToThread(self.thread)
        
        # Signale setzen
        self.thread.started.connect(self.worker.code_gen)
        self.worker.signalShowInput.connect(self.showInputDlg)
        self.worker.signalShowDlg.connect(self.showDlg)


    def update_ausgabe(self, text):
        """
        Fügt den übergeben Text dem textAusgabe hinzu

        Args:
            text (str): Text welcher hinzukommen soll
        """

        # Austausch der Farbcodes / Ascii Zeichen aus der Shell
        listeCodes = ['\033[95m', '\033[91m', '\033[33m', '\x1b[0m', '\033[94m', '\033[32m', '\033[0m']
        for farbcode in listeCodes:
            if farbcode in text:
                if farbcode == '\033[95m' or farbcode == '\033[91m':
                    text = f"<div style='color:red'>{text}</div>"
                elif farbcode == '\033[33m':
                    text = f"<div style='color:orange'>{text}</div>"
                elif farbcode == '\x1b[0m':
                    text = f"<div>{text}</div>"
                elif farbcode == '\033[94m':
                    text = f"<div style='color:blue'>{text}</div>"
                elif farbcode == '\033[32m':
                    text = f"<div style='color:green'>{text}</div>"
                text = text.replace(farbcode, '')

        cursor = self.textAusgabe.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertHtml(str(text))
        cursor.insertText(str("\n"))
        self.textAusgabe.setTextCursor(cursor)
        self.textAusgabe.ensureCursorVisible()

    def showInputDlg(self, dlgType):
        
        if dlgType == "GEBURTSDATUM":
           while True:
                try:
                    text, ok = QtWidgets.QInputDialog.getText(self, 'Geburtsdatum', 'Bitte trage nachfolgend dein Geburtsdatum im Format DD.MM.YYYY ein.\n'
                        'Beispiel: 02.03.1982\n')
                    if ok:
                        geburtsdatum = str(text)
                        validate_datum(geburtsdatum)
                        self.worker.signalUpdateData.emit("GEBURTSDATUM",geburtsdatum)
                        break
                    else:
                        self.hardClose()
                        break
                except ValidationError as exc:
                    QtWidgets.QMessageBox.critical(self, "Geburtsdatum ungültiges Format", "Das Datum entspricht nicht dem richtigen Format (DD.MM.YYYY).")
 
        elif dlgType == "SMSCODE_OK":
            ret = QtWidgets.QMessageBox.information(self, "Erfolgreich", "Code erfolgreich generiert. Du kannst jetzt mit der Terminsuche fortfahren.",QMessageBox.StandardButton.Ok)
            if ret == QMessageBox.StandardButton.Ok:
                self.worker.signalUpdateData.emit("SMSCODE_OK","")
                self.hardClose()
            
    def showDlg(self, strMode, strTxt):
        if strMode == "MISSING_KONTAKT":
            ret = QtWidgets.QMessageBox.critical(self, "Kontaktdaten ungültig",
                "Die Kontakdaten sind nicht korrekt!.\n\nBitte Datei neu erstellen!", QMessageBox.StandardButton.Ok)
            if ret == QMessageBox.StandardButton.Ok:
                self.hardClose()
        elif strMode == "CRITICAL_CLOSE":
            ret = QtWidgets.QMessageBox.critical(self, "Error", strTxt, QMessageBox.StandardButton.Ok)
            if ret == QMessageBox.StandardButton.Ok:
                self.hardClose()

                
    # force to close the dialog without confirmation
    def hardClose(self):
        self._hardClose = True
        self.close()
         
    def closeEvent(self, event):
        """
        Wird aufgerufen, wenn die Anwendung geschlossen wird
        """

        if self.thread.isRunning():
            if self._hardClose is False:
                res = QtWidgets.QMessageBox.warning(self, "Suche beenden", "Suche wirklich beenden?\n",
                                                    (QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel))

                if res != QMessageBox.StandardButton.Ok:
                    event.ignore()
                    return
                
            
        #exit

        #stop worker
        self.worker.stop()
        self.worker.deleteLater()

        #stop thread
        self.thread.quit()
        self.thread.wait(3000)
        self.thread.terminate()

        # Streams wieder korrigieren, damit kein Fehler kommt
        sys.stdout = sys.__stdout__
        sys.stderr = sys.__stderr__

        self.deleteLater()
        event.accept()

    @staticmethod
    def start_code_gen(kontaktdaten: dict,  ROOT_PATH: str):
        app = QtWidgets.QApplication(list())
        window = QtCodeGen(kontaktdaten, ROOT_PATH)
        app.exec_()
Example #3
0
class ExampleThread(Qt.QWidget):
    def __init__(self, parent=None):
        super(ExampleThread, self).__init__(parent)

        layout = Qt.QVBoxLayout(self)
        self.lbl = Qt.QLabel("Start")
        layout.addWidget(self.lbl)
        self.btnA = Qt.QPushButton("Запустить AThread(QThread)")
        layout.addWidget(self.btnA)
        self.btnB = Qt.QPushButton("Запустить SomeObject(QObject)")
        layout.addWidget(self.btnB)
        self.btnC = Qt.QPushButton("Запустить Worker(QRunnable)")
        layout.addWidget(self.btnC)
        self.progressBar = Qt.QProgressBar()
        self.progressBar.setProperty("value", 0)
        layout.addWidget(self.progressBar)

        self.setGeometry(550, 65, 300, 300)
        self.setWindowTitle('3 разных и простых способа работы с потоками.')

        self.btnA.clicked.connect(self.using_q_thread)
        self.btnB.clicked.connect(self.using_move_to_thread)
        self.btnC.clicked.connect(self.using_q_runnable)

        self.msg = MsgBoxAThread()
        self.thread = None

        self.msgSomeObject = MsgBoxSomeObject()
        self.objThread = None

        self.counter = 0
        self.timer = Qt.QTimer()
        self.timer.setInterval(1000)
        # -------- timeout -------> def recurring_timer(self):
        self.timer.timeout.connect(self.recurring_timer)
        self.timer.start()

        self.threadpool = QThreadPool()
        print("Max потоков, кот. будут использоваться=`%d`" % self.threadpool.maxThreadCount())
        self.msgWorker = MsgBoxWorker()

        self.threadtest = QThread(self)
        self.idealthreadcount = self.threadtest.idealThreadCount()
        print("Ваша машина может обрабатывать `{}` потокa оптимально.".format(self.idealthreadcount))

    def recurring_timer(self):
        self.counter += 1
        self.lbl.setText("СЧЁТЧИК цикл GUI: %d" % self.counter)

    # ---- AThread(QThread) -----------#
    def using_q_thread(self):
        if self.thread is None:
            self.thread = AThread()
            self.thread.threadSignalAThread.connect(self.on_threadSignalAThread)
            self.thread.finished.connect(self.finishedAThread)
            self.thread.start()
            self.btnA.setText("Stop AThread(QThread)")
        else:
            self.thread.terminate()
            self.thread = None
            self.btnA.setText("Start AThread(QThread)")

    def finishedAThread(self):
        self.thread = None
        self.btnA.setText("Start AThread(QThread)")

    def on_threadSignalAThread(self, value):
        self.msg.label.setText(str(value))
        # Восстанавливаем визуализацию потокового окна, если его закрыли. Поток работает.
        # .setVisible(true) или .show() устанавливает виджет в видимое состояние,
        # если видны все его родительские виджеты до окна.
        if not self.msg.isVisible():
            self.msg.show()

    # --END-- AThread(QThread) -------------------#

    # ---- SomeObject(QObject) -------------------#
    def using_move_to_thread(self):
        if self.objThread is None:
            self.objThread = QThread()
            self.obj = SomeObject()
            self.obj.moveToThread(self.objThread)  # Переместить в поток для выполнения

            self.obj.threadSignalSomeObject.connect(self.on_threadSignalSomeObject)
            self.obj.finishedSomeObject.connect(self.finishedSomeObject)
            self.objThread.started.connect(self.obj.long_running)
            self.objThread.start()

            self.btnB.setText("Wait SomeObject(QObject)")
            self.btnB.setEnabled(False)
        else:
            pass

    def finishedSomeObject(self):
        self.objThread.terminate()
        self.objThread.wait(1)

        self.objThread = None
        self.btnB.setEnabled(True)
        self.btnB.setText("Start SomeObject(QObject)")

    def on_threadSignalSomeObject(self, value):
        self.msgSomeObject.label.setText(str(value))
        # Восстанавливаем визуализацию потокового окна, если его закрыли. Поток работает.
        if not self.msgSomeObject.isVisible():
            self.msgSomeObject.show()

    # --END-- SomeObject(QObject) -------------------#

    # ---- Worker(QRunnable) ------------------------#
    def using_q_runnable(self):
        # Передайте функцию для выполнения
        # Любые другие аргументы, kwargs передаются функции run
        worker = Worker(self.execute_this_fn)
        worker.signals.result.connect(self.print_output)
        worker.signals.finish.connect(self.thread_complete)
        worker.signals.progress.connect(self.progress_fn)
        self.threadpool.start(worker)

    def progress_fn(self, n):
        self.progressBar.setValue(n)
        self.msgWorker.label.setText(str(n))
        # Восстанавливаем визуализацию потокового окна, если его закрыли. Поток работает.
        if not self.msgWorker.isVisible():
            self.msgWorker.show()

    def execute_this_fn(self, progress_callback):
        for n in range(0, 11):
            Qt.QThread.msleep(600)
            progress_callback.emit(n * 100 / 10)
        return "Готово."

    def print_output(self, s):
        print("\ndef print_output(self, s):", s)

    def thread_complete(self):
        print("\nTHREAD ЗАВЕРШЕН!, self->", self)

    # --END-- Worker QRunnable) -------------------#

    # ==============================================###
    # потоки или процессы должны быть завершены    ###
    def closeEvent(self, event):
        reply = Qt.QMessageBox.question \
            (self, 'Информация',
             "Вы уверены, что хотите закрыть приложение?",
             Qt.QMessageBox.Yes,
             Qt.QMessageBox.No)
        if reply == Qt.QMessageBox.Yes:
            if self.thread:
                self.thread.quit()
            del self.thread
            self.msg.close()

            if self.objThread:
                self.objThread.setTerminationEnabled(True)
                self.objThread.terminate()
                self.objThread.wait(1)
            self.msgSomeObject.close()

            # закрыть поток Worker(QRunnable)
            self.msgWorker.close()

            super(ExampleThread, self).closeEvent(event)
        else:
            event.ignore()
class GeneratorDialog(QDialog):
    """Generator Dialog"""
    def __init__(self, version, iconPath, addonDir, mediaDir):

        super().__init__()
        self.mediaDir = mediaDir
        self.iconPath = iconPath

        # Paths
        self.ankiCsvPath = join(addonDir, Constant.ANKI_DECK)

        # Create Generator GUI
        self.ui = UiGenerator()
        self.ui.setupUi(self, version, iconPath)
        self.ui.cancelBtn.setDisabled(True)

        # Create Importer Instance
        self.importer = ImporterDialog(version, iconPath, addonDir, mediaDir)
        self.importer.keyPressed.connect(self.importer.on_key)

        # Set Total Input Word count
        self.ui.inputTxt.textChanged.connect(self.input_text_changed)

        # Set Completed Output Card count
        self.ui.outputTxt.textChanged.connect(self.output_text_changed)

        # Set Failures Word count
        self.ui.failureTxt.textChanged.connect(self.failure_text_changed)

        # Handle clicks on Generate button
        self.ui.generateBtn.clicked.connect(self.btn_generate_clicked)

        # Handle clicks on Progress bar
        self.ui.importBtn.clicked.connect(self.btn_importer_clicked)

        self.get_supported_languages()
        # Handle user clicks on translation
        self.ui.source1.clicked.connect(self.get_supported_languages)
        self.ui.source2.clicked.connect(self.get_supported_languages)
        self.ui.source3.clicked.connect(self.get_supported_languages)
        self.ui.source4.clicked.connect(self.get_supported_languages)

    def close_event(self, event):
        logging.shutdown()

    def input_text_changed(self):

        words = self.ui.inputTxt.toPlainText().split("\n")
        # Filter words list, only get non-empty words
        self.words = list(filter(None, words))
        self.ui.totalLbl.setText("Total: {}".format(len(self.words)))

    def output_text_changed(self):

        cards = self.ui.outputTxt.toPlainText().split("\n")
        # Filter cards list, only get non-empty cards
        self.cards = list(filter(None, cards))
        self.cardCount = len(self.cards)
        self.ui.completedLbl.setText("Completed: {}".format(len(self.cards)))

    def failure_text_changed(self):

        failures = self.ui.failureTxt.toPlainText().split("\n")
        # Filter failures list, only get non-empty failures
        self.failures = list(filter(None, failures))
        self.failureCount = len(self.failures)
        self.ui.failureLbl.setText("Failure: {}".format(len(self.failures)))

    def btn_generate_clicked(self):

        # Validate if input text empty?
        inputText = self.ui.inputTxt.toPlainText()

        if not inputText:
            AnkiHelper.message_box("Info",
                                   "No input words available for generating.",
                                   "Please check your input words!",
                                   self.iconPath)
            return

        # Increase to 2% as a processing signal to user
        self.ui.generateProgressBar.setValue(2)
        self.ui.generateBtn.setDisabled(True)

        # Clean up output before generating cards
        self.ui.outputTxt.setPlainText("")
        self.ui.failureTxt.setPlainText("")

        # Get translation options
        source = self.selected_radio(self.ui.sourceBox)
        target = self.selected_radio(self.ui.translatedToBox)
        self.translation = Translation(source, target)

        # Get generating options
        self.allWordTypes = self.ui.allWordTypes.isChecked()
        self.isOnline = self.ui.isOnline.isChecked()

        # Initialize Generator based on translation
        self.generator = Worker.initialize_generator(self.translation)

        # Step 2: Create a QThread object
        self.bgThread = QThread(self)
        self.bgThread.setTerminationEnabled(True)

        # Step 3: Create a worker object
        self.worker = Worker(self.generator, self.words, self.translation,
                             self.mediaDir, self.isOnline, self.allWordTypes,
                             self.ankiCsvPath)

        # Step 4: Move worker to the thread
        self.worker.moveToThread(self.bgThread)

        # Step 5: Connect signals and slots
        self.bgThread.started.connect(self.worker.generate_cards_background)

        self.worker.finished.connect(self.bgThread.quit)
        self.bgThread.finished.connect(self.bgThread.deleteLater)

        self.worker.finished.connect(self.worker.deleteLater)
        self.worker.progress.connect(self.report_progress)

        self.worker.cardStr.connect(self.report_card)
        self.worker.failureStr.connect(self.report_failure)

        # Step 6: Start the thread
        self.bgThread.start()
        self.ui.cancelBtn.setEnabled(True)
        self.ui.generateBtn.setDisabled(True)

        # Handle cancel background task
        self.isCancelled = False

        receiversCount = self.ui.cancelBtn.receivers(self.ui.cancelBtn.clicked)
        if receiversCount > 0:
            logging.info(
                "Already connected before...{}".format(receiversCount))
            self.ui.cancelBtn.clicked.disconnect()

        self.ui.cancelBtn.clicked.connect(self.cancel_background_task)

        # Final resets
        self.bgThread.finished.connect(self.finished_generation_progress)

    def cancel_background_task(self):

        logging.info("Canceling background task...")
        self.bgThread.requestInterruption()
        self.bgThread.quit()

        self.ui.outputTxt.setPlainText("")
        self.isCancelled = True

        AnkiHelper.message_box("Info",
                               "Flashcards generation process stopped!",
                               "Restart by clicking Generate button.",
                               self.iconPath)

    def finished_generation_progress(self):

        self.ui.cancelBtn.setDisabled(True)
        self.ui.generateBtn.setEnabled(True)

        # Return if thread is cancelled
        if self.isCancelled:
            self.ui.outputTxt.setPlainText("")
            return

        if self.ui.outputTxt.toPlainText():
            btnSelected = AnkiHelper.message_box_buttons(
                "Info",
                "Finished generating flashcards.\nThanks for using AnkiFlash!",
                "Do you want to import generated flashcards now?\n\nProgress completed 100%\n- Input: {}\n- Output: {}\n- Failure: {}"
                .format(len(self.words), self.cardCount,
                        self.failureCount), QMessageBox.No | QMessageBox.Yes,
                QMessageBox.Yes, self.iconPath)
            if btnSelected == QMessageBox.Yes:
                self.btn_importer_clicked()
        else:
            AnkiHelper.message_box_buttons(
                "Info",
                "Finished generating flashcards.\nThanks for using AnkiFlash!",
                "No output flashcards available for importing.\n\nProgress completed 100%\n- Input: {}\n- Output: {}\n- Failure: {}"
                .format(len(self.words), self.cardCount, self.failureCount),
                QMessageBox.Close, QMessageBox.Close, self.iconPath)

    def report_progress(self, percent):

        # Return if thread is interrupted
        if self.bgThread.isInterruptionRequested():
            return

        self.ui.generateProgressBar.setValue(percent)

    def report_card(self, cardStr):

        # Return if thread is interrupted
        if self.bgThread.isInterruptionRequested():
            return

        currentText = self.ui.outputTxt.toPlainText()
        if currentText:
            currentText += "\n"
        self.ui.outputTxt.setPlainText("{}{}".format(currentText, cardStr))

    def report_failure(self, failureStr):

        # Return if thread is interrupted
        if self.bgThread.isInterruptionRequested():
            return

        currentText = self.ui.failureTxt.toPlainText()
        if currentText:
            currentText += "\n"
        self.ui.failureTxt.setPlainText("{}{}".format(currentText, failureStr))

    def btn_importer_clicked(self):
        if self.ui.outputTxt.toPlainText():
            self.importer.ui.importProgressBar.setValue(0)
            self.importer.show()
        else:
            AnkiHelper.message_box(
                "Info", "No output flashcards available for importing.",
                "Please check your input words!", self.iconPath)

    def get_supported_languages(self):
        source = self.selected_radio(self.ui.sourceBox)
        supportTranslations = {
            Constant.ENGLISH: [
                Constant.ENGLISH, Constant.VIETNAMESE, Constant.CHINESE_TD,
                Constant.CHINESE_SP, Constant.FRENCH, Constant.JAPANESE
            ],
            Constant.VIETNAMESE: [
                Constant.ENGLISH, Constant.FRENCH, Constant.JAPANESE,
                Constant.VIETNAMESE
            ],
            Constant.FRENCH: [Constant.ENGLISH, Constant.VIETNAMESE],
            Constant.JAPANESE: [Constant.ENGLISH, Constant.VIETNAMESE]
        }

        targetLanguages = supportTranslations.get(source)
        logging.info("targetLanguages {}".format(targetLanguages))

        radioBtns = [
            radio for radio in self.ui.translatedToBox.children()
            if isinstance(radio, QRadioButton)
        ]

        for radio in radioBtns:
            if radio.text() == Constant.ENGLISH:
                radio.click()

            if radio.text() in targetLanguages:
                radio.setEnabled(True)
                self.change_radio_color(radio, True)
            else:
                radio.setEnabled(False)
                self.change_radio_color(radio, False)

    def change_radio_color(self, radio: QRadioButton, isEnabled: bool):
        if isEnabled:
            radio.setStyleSheet(self.ui.source1.styleSheet())
        else:
            radio.setStyleSheet("color:gray")

    def selected_radio(self, groupBox: QGroupBox) -> str:
        # Get all radio buttons
        radioBtns = [
            radio for radio in groupBox.children()
            if isinstance(radio, QRadioButton)
        ]
        # Find choosen radio and return text
        for radio in radioBtns:
            if radio.isChecked():
                return radio.text()
class main_principal(QWidget):
    fecha_actual = datetime.datetime.now(
    )  # datetime es la libreria que nos ayuda con las fechas horas minutos y hsta segundos
    #en este caso nos referimos a que nos de la fecha actual
    contador_hilo = 1
    cursor = None
    lista_hilos = []

    def banner_anonymous(self):
        #banner un bannner es solo un mensaje de texto
        #el       \32 es para indicarle que queremos un espacio en blanco
        #puedes ver que hay muchos \32 en este paratado eso es debido a que
        #se necesitan espacios para imprimir bien el banner
        self.textarea_proceso.append(
            "$$$$$\32$\32\32\32\32$\32\32$$$$$\32$\32\32\32\32\32$$$$$$$\32\32\32\32\32\32######\32#####\32######\32##\32\32\32##"
        )
        self.textarea_proceso.append(
            "$\32\32\32\32\32\32\32\32$\32\32\32\32$\32\32\32\32\32$\32\32\32\32$\32\32\32\32\32$\32\32\32\32\32$\32\32\32\32\32$\32\32\32\32\32\32#\32\32\32\32\32\32#"
        )
        self.textarea_proceso.append(
            "$$$$$\32\32\32$\32\32\32\32\32$$$$$\32$\32\32\32\32\32$\32\32\32\32\32$||||||\32\32\32\32\32######\32#####\32######\32#\32\32\32\32\32#"
        )
        self.textarea_proceso.append(
            "$\32\32\32\32\32\32$\32\32$\32\32\32$\32\32\32\32\32$\32\32\32\32\32$\32\32\32\32\32\32$\32\32\32\32\32\32\32\32\32\32\32#|#\32\32\32\32\32#\32\32\32\32#\32#\32\32\32\32\32#"
        )
        self.textarea_proceso.append(
            "$$$$$\32$\32\32\32\32$\32\32$\32\32\32\32\32$$$$$\32$$$$$$$\32\32\32\32\32\32######\32#\32\32\32\32\32#\32\32\32\32#\32#\32\32\32\32\32#"
        )
        self.textarea_proceso.append(
            "Autor: Aldair Martinez Alias Hans Krammler Junior"
        )  # Aqui declaramos mi nombre jajaj XD

    def spam_uno_a_uno(self):
        self.banner_anonymous()
        print(self.fecha_actual)

    def spam_uno_a_varios(self):
        self.banner_anonymous()
        print(self.fecha_actual)
        print(Fore.GREEN + "HAZ ELEGIDO ENVIAR DESDE TU COREO A OTROS CORREO")

    def mensaje(self):
        print("SE TERMINO EL HILO")

    contador_hilo_aux = 0
    lista_hilos = []
    workers = []
    threads = []

    def incializa_hilos(self):
        if self.contador_hilo == 1:
            self.thread = QThread()
            self.thread.setObjectName("Hilo_1")
            self.worker = Worker(self.contador_hilo, self.textarea_proceso,
                                 self.label_proceso_verificacion, None)
            self.worker.moveToThread(self.thread)
            self.thread.setTerminationEnabled(True)
            self.thread.started.connect(self.worker.run)
            self.worker.finished.connect(self.terminado)
            self.thread.finished.connect(
                lambda: self.verificar_resultado_hilo(self.thread))
            self.worker.progressed.connect(
                lambda: self.reportProgress(self.worker))
            self.worker.siguiente.connect(
                lambda: self.siguiente_hilo(self.thread))
            self.thread.finished.connect(self.thread.quit)
            self.lista_hilos.append(self.thread)
            return self.lista_hilos
        else:
            self.lista_hilos = []
            self.threads.append(QThread())
            self.threads[self.contador_hilo_aux].setObjectName("Hilo_2")
            if self.contador_hilo == 2:
                print("Aqui tambien funciona")
                self.workers.append(
                    Worker(self.contador_hilo, self.textarea_proceso, None,
                           self.label_proceso_verificacion2))
            elif self.contador_hilo == 3:
                self.workers.append(
                    Worker(self.contador_hilo, self.textarea_proceso, None,
                           self.label_proceso_verificacion3))
            self.workers[self.contador_hilo_aux].moveToThread(
                self.threads[self.contador_hilo_aux])
            self.threads[self.contador_hilo_aux].started.connect(
                self.workers[self.contador_hilo_aux].run)
            self.workers[self.contador_hilo_aux].finished.connect(
                self.terminado)
            print("Pasando terminado")
            self.threads[self.contador_hilo_aux].finished.connect(
                lambda: self.verificar_resultado_hilo(self.threads[
                    self.contador_hilo_aux]))
            print("Pasando verificar resultado")
            self.workers[self.contador_hilo_aux].progressed.connect(
                lambda: self.reportProgress(self.workers[self.contador_hilo_aux
                                                         ]))
            print("Pasando reportprogress")
            self.workers[self.contador_hilo_aux].siguiente.connect(
                lambda: self.siguiente_hilo(self.threads[self.contador_hilo_aux
                                                         ]))
            self.threads[self.contador_hilo_aux].finished.connect(
                self.threads[self.contador_hilo_aux].quit)
            print("Pasando quit")
            self.lista_hilos.append(self.threads[self.contador_hilo_aux])
            return self.lista_hilos
        return None

    def siguiente_hilo(self, hilo):
        if self.contador_hilo == 1:
            if hilo.isRunning() == False:
                if hilo.isFinished() == True:
                    print("si funciono")
                    hilo.finished.connect(hilo.deleteLater)
                    hilo.finished.connect(hilo.terminate)
                    self.contador_hilo = self.contador_hilo + 1
                    self.incializa_hilos()[0].start()
        elif self.contador_hilo > 1:
            if self.get_verificado() == -1:
                return -1
            elif self.get_verificado() == -2:
                return -2
            else:
                return -3
            if hilo.isRunning() == False:
                if hilo.isFinished() == True:
                    self.contador_hilo = self.contador_hilo + 1
                    self.contador_hilo_aux = self.contador_hilo_aux + 1
                    self.incializa_hilos()[0].start()

        return 0

    cursor = None
    estado_hilo_x = 0
    lista_verificado = []

    def set_verificado(self, estado):
        self.estado_hilo_x = estado

    def get_verificado(self):
        self.lista_verificado.append(self.estado_hilo_x)
        print("get.lista.verificado" + str(self.lista_verificado[0]))
        return int(self.lista_verificado[0])

    def terminado(self):
        if self.contador_hilo == 1:
            print("TRABAJO TERMINADO")
            self.thread.finished.emit()
        elif self.contador_hilo > 1:
            self.threads[self.contador_hilo_aux].finished.emit()

    def verificar_resultado_hilo(self, thread):
        if self.contador_hilo == 1:
            if self.thread.isRunning() == False:
                print("EL HILO 1 HA TERMINADO SU TAREA")
            if self.thread.isFinished() == True:
                print("EL HILI 1 TERMINO CON EXITO")
                self.worker.progressed.emit()
        elif self.contador_hilo > 1:
            print(str(self.contador_hilo_aux))
            if thread.isRunning() == False:
                print("EL HILO" + str(self.contador_hilo_aux) +
                      "ESTA CORRIENDO")
            if thread.isFinished() == True:
                print("EL HILO" + str(self.contador_hilo_aux) + "HA TERMINADO")
                self.workers[self.contador_hilo_aux].progressed.emit()

    porcentaje = 10
    _i = 0
    lista_progreso = ["INICIANDO HILO DE EJECUCION......"]

    def reportProgress(self, worker):
        print(self.contador_hilo)
        if self.contador_hilo == 1:
            print("REPORTANDO HILO")
            #print("POSICION ACTUAL DEL CURSOR"+str(int(self.textarea_proceso.textCursor().position())))
            worker.siguiente.emit()
        else:
            if self.contador_hilo == 2:
                email = self.line_edit_user_email.text()
                password = self.line_edit_user_password.text()
                longitud_email = len(email)
                longitud_password = len(password)
                if longitud_email == 0 or longitud_password == 0:

                    self.set_verificado(-1)
            elif self.contador_hilo == 3:
                email = self.line_edit_user_email.text()
                email_to_list = list(email)
                contador = 1
                for _x in len(email):
                    if email_to_list[_x] == "@":
                        contador = contador + 1
                if contador > 1:
                    self.set_verificado(-2)
            elif self.contador_hilo == 4:
                contador = 1
                email_dominio = email.split(".")
                textarea_proceso.append("DIVIDIENDO TU EMAIL--->" +
                                        email_dominio)
                longitud_dominio_email = len(email_dominio)
                textarea_proceso.append(
                    "VERIFICANDO COINCIDENCIA DE DOMINIO DE EMAIL....")
                dominios = [
                    "gmail.com", "outlook.com", "outlook.es", "hotmail.com",
                    "hotmail.mx", "hotmail.es"
                ]
                longitud_dominio_gmail = len(dominios[0])
                longitud_dominio_outlook_com = len(dominios[1])
                longitud_dominio_outlook_es = len(dominios[2])
                longitud_dominio_hotmail_com = len(dominios[3])
                longitud_dominio_hotmail_mx = len(dominios[4])
                longitud_dominio_hotmail_es = len(dominios[5])
                for _i in range(longitud_dominio_email):
                    for _j in (range(longitud_dominio_gmail)
                               or range(longitud_dominio_outlook_com)
                               or range(longitud_dominio_outlook_es)
                               or range(longitud_dominio_hotmail_com)
                               or range(longitud_dominio_hotmail_mx)
                               or range(longitud_dominio_hotmail_es)):
                        if _j < longitud_dominio_gmail:
                            if dominios[0][_j] == email_dominio[1][_j]:
                                print(dominios[0][j])
                                contador = contador + 1
                        elif _j < longitud_dominio_outlook_com:
                            if dominios[1][_j] == email_dominio[1][_j]:
                                contador = contador + 1
                        elif _j < longitud_dominio_outlook_es:
                            if dominios[2][_j] == email_dominio[1][_j]:
                                contador = contador + 1
                        elif _j < longitud_dominio_hotmail_com:
                            if dominios[3][_j] == email_dominio[1][_j]:
                                contador = contador + 1
                        elif _j < longitud_dominio_hotmail_mx:
                            if dominios[4][_j] == email_dominio[1][_j]:
                                contador = contador + 1
                        elif _j < longitud_dominio_hotmail_es:
                            if dominios[5][_j] == email_dominio[1][_j]:
                                contador = contador + 1
                    if contador > longitud_dominio_gmail:
                        return -3
                    else:
                        contador = 1
            print("AQUI MEN")
            posicion_textarea = len(self.lista_progreso[self._i])
            self.cursor = self.textarea_proceso.textCursor()
            print("CURSOR ACTUAL" + str(self.cursor))
            print("POSICION CURSOR ACTUAL++" + str(self.cursor.position()))
            if self.cursor.atEnd() == True:
                print("FIN DEL CURSOR True")
                print("TEXTO SELECCIONADO ANTES" + self.cursor.selectedText())
                posicion_inicial = (self.cursor.position() -
                                    1) - (posicion_textarea - 1) + 1
                print("posicion inicial" + str(posicion_inicial))
                time.sleep(0.4)
                self.cursor.setPosition(posicion_inicial,
                                        QTextCursor.KeepAnchor)
                print("TEXTO SELECCIONADO AHORA" + self.cursor.selectedText())
                print("POSICION CURSOR ACTUAL--" + str(self.cursor.position()))
                self.progreso = self.cursor.selectedText() + str(
                    self.porcentaje)
                self.porcentaje = self.porcentaje + 10
                self.textarea_proceso.append(self.progreso)
                print("POSICION CURSOR ACTUAL++" + str(self.cursor.position()))
            self._i = self._i + 1
            worker.siguiente.emit()

    def verificar_opcion(self):
        pass

    def validar_oprciones(self):
        if self.checkbox_opcion_spam_uno_a_uno.isChecked(
        ) == True and self.checkbox_opcion_spam_uno_a_varios.isChecked():
            self.label_estado_proceso.setText(
                Fore.RED +
                "LO SIENTO NO PUEDES SELECCIONAR DOS OPCIONES A LA VEZ")
            return False
        else:
            return True

    def escannear_red(self):
        scan = nmap.PortScanner()
        informacion_sistema = os.uname()

    def presionado(self):
        resultado_validar_opciones = self.validar_oprciones()
        if resultado_validar_opciones == True:
            self.inciar_hilo_principal()
            self.resultado_verificacion_email = 0
            if self.resultado_verificacion_email == 0:
                print("PASANDO AL SIGUIENTE HILO DE EJECUCION")
            if self.resultado_verificacion_email == 1:
                if self.checkbox_opcion_spam_uno_a_uno.isChecked() == True:
                    print(
                        "LAS OCPIONES SELECCIONADAAS EN LOS CASILLA SON VALIDAS"
                    )
            else:
                if self.resultado_verificacion_email == -1 or self.resultado_verificacion_email == -2 or self.resultado_verificacion_email == -3:
                    if self.resultado_verificacion_email == -1:
                        self.label_estado_proceso.setText(
                            "NO HAS INGRESADO NADA EN EL PRIMER CAMPO")
                        self.textarea_proceso.append(
                            "ERROR NO HAS INGRESADO NADA EN EL PRIMER CAMPO")
                    elif self.resultado_verificacion_email == -2:
                        self.label_estado_proceso.setText(
                            "HAS MAS DE UN ARROBA EN TU CORREO")
                        self.textarea_proceso.append(
                            "ERROR HAY MAS DE UN ARROBA EN TU CORREO")
                    elif self.resultado_verificacion_email == -3:
                        self.label_estado_proceso.setText(
                            "TERMINACION DE CORREO NO VALIDA")

        else:
            self.textarea_proceso.append(
                "INTENTE DE NUEVO RELLENAR LOS CAMPOS ADECUADAMENTE")

    def __init__(self, parent=None):
        #Parte de intefaz grafica
        super().__init__(parent)

        self.color = QColor(0, 0, 0, 0.5)
        self.setGeometry(550, 100, 1500, 500)
        self.pallette = QPalette(self.color)
        self.pallette.setColor(QPalette.Text, Qt.cyan)

        self.titulo_ventana = "ENVIO DE CORREO PARA HACER SPAM"
        self.setWindowTitle(self.titulo_ventana)
        self.setStyleSheet(
            "border-color: cyan; border-style: dashed; border-width: 2px; color:white"
        )
        self.setPalette(self.pallette)
        self.checkbox_opcion_spam_uno_a_uno = QCheckBox(
            "REALIZAR SPAM UNO A UN CORREO")
        self.checkbox_opcion_spam_uno_a_uno.clicked.connect(
            self.spam_uno_a_uno)
        self.checkbox_opcion_spam_uno_a_varios = QCheckBox(
            "REALIZAR SPAM UNO A VARIOS COOREOS")
        self.checkbox_opcion_spam_uno_a_varios.clicked.connect(
            self.spam_uno_a_varios)

        self.label_user_email = QLabel("Ingresa tu direccion de correo: ")
        self.label_user_email.setFont(QFont("Times", 14, QFont.Bold, True))
        self.label_user_email.setStyleSheet("color: white")

        self.line_edit_user_email = QLineEdit(self)
        self.line_edit_user_email.setPlaceholderText(
            "Ingresa tu direccion de cooreo:")
        self.line_edit_user_email.setFont(QFont("Times", 14, QFont.Bold, True))
        self.line_edit_user_email.setStyleSheet("color : black")

        self.label_user_password = QLabel("Ingresa tu password de correo")
        self.label_user_password.setFont(QFont("Times", 14, QFont.Bold, True))
        self.label_user_password.setStyleSheet("color: white")

        self.line_edit_user_password = QLineEdit(self)
        self.line_edit_user_password.setPlaceholderText(
            "Ingresa tu password de tu correo:")
        self.line_edit_user_password.setFont(
            QFont("Times", 14, QFont.Bold, True))
        self.line_edit_user_password.setStyleSheet("color : black")

        self.label_victima_email = QLabel(
            "Ingresa direccion de correo destinatario: ")
        self.label_victima_email.setFont(QFont("Times", 14, QFont.Bold, True))
        self.label_victima_email.setStyleSheet("color: white")

        self.line_edit_victima_email = QLineEdit(self)
        self.line_edit_victima_email.setPlaceholderText(
            "Ingresa tu direccion de cooreo:")
        self.line_edit_victima_email.setFont(
            QFont("Times", 14, QFont.Bold, True))
        self.line_edit_victima_email.setStyleSheet("color : black")

        self.label_user_asunto = QLabel("Ingresa el asunto ")
        self.label_user_asunto.setFont(QFont("Times", 14, QFont.Bold, True))
        self.label_user_asunto.setStyleSheet("color: white")

        self.line_edit_user_asunto = QLineEdit(self)
        self.line_edit_user_asunto.setPlaceholderText(
            "Ingresa tu direccion de cooreo:")
        self.line_edit_user_asunto.setFont(QFont("Times", 14, QFont.Bold,
                                                 True))
        self.line_edit_user_asunto.setStyleSheet("color : black")

        self.pushbutton_enviar = QPushButton("ENVIAR SPAM")
        self.pushbutton_enviar.setFont(QFont("Times", 14, QFont.Bold, True))
        self.pushbutton_enviar.setPalette(self.pallette)

        self.label_estado_proceso = QLabel("")
        self.label_estado_proceso.setText("ESPERANDO DATOS....")

        self.label_proceso = QLabel("Estado verificacion email y password")
        self.label_proceso_verificacion = QLabel("")
        self.label_proceso2 = QLabel(
            "Estado verificacion arroba de email origen y destino")
        self.label_proceso_verificacion2 = QLabel("")
        self.label_proceso3 = QLabel(
            "Estado verificacion terminacion correo origen y destino")
        self.label_proceso_verificacion3 = QLabel("")
        self.combobox_dominios_from = QComboBox()
        self.combobox_dominios_from.addItem("Gmail.com")
        self.combobox_dominios_from.insertSeparator(1)
        self.combobox_dominios_from.addItem("Outlook.com")
        self.combobox_dominios_from.addItem("Outlook.es")
        self.combobox_dominios_from.insertSeparator(4)
        self.combobox_dominios_from.addItem("Hotmail.com")
        self.combobox_dominios_from.addItem("Hotmail.es")
        self.combobox_dominios_from.addItem("Hotmail.mx")
        self.combobox_dominios_from.setStyleSheet(
            "background-color:black; color: cyan")

        self.combobox_dominios_to = QComboBox()
        self.combobox_dominios_to.addItem("Gmail.com")
        self.combobox_dominios_to.insertSeparator(1)
        self.combobox_dominios_to.addItem("Outlook.com")
        self.combobox_dominios_to.addItem("Outlook.es")
        self.combobox_dominios_to.insertSeparator(4)
        self.combobox_dominios_to.addItem("Hotmail.com")
        self.combobox_dominios_to.addItem("Hotmail.es")
        self.combobox_dominios_to.addItem("Hotmail.mx")
        self.combobox_dominios_to.setStyleSheet(
            "background-color:black; color: cyan")

        self.combobox_dominios_from.currentTextChanged.connect(
            self.verificar_opcion)
        self.combobox_dominios_to.currentTextChanged.connect(
            self.verificar_opcion)
        self.pushbutton_enviar.clicked.connect(self.presionado)

        self.layout_main = QHBoxLayout(self)

        self.layout_principal = QVBoxLayout()
        self.layout_principal.addWidget(self.label_user_email)
        self.layout_principal.addWidget(self.line_edit_user_email)
        self.layout_principal.addWidget(self.label_user_password)
        self.layout_principal.addWidget(self.line_edit_user_password)
        self.layout_principal.addWidget(self.label_victima_email)
        self.layout_principal.addWidget(self.line_edit_victima_email)
        self.layout_principal.addWidget(self.label_user_asunto)
        self.layout_principal.addWidget(self.line_edit_user_asunto)
        self.layout_principal.addWidget(self.checkbox_opcion_spam_uno_a_uno)
        self.layout_principal.addWidget(self.checkbox_opcion_spam_uno_a_varios)
        self.layout_principal.addWidget(self.pushbutton_enviar)
        self.layout_principal.addWidget(self.label_estado_proceso)
        self.layout_principal.addWidget(self.combobox_dominios_from)
        self.layout_principal.addWidget(self.combobox_dominios_to)
        self.layout_principal.addWidget(self.label_proceso)
        self.layout_principal.addWidget(self.label_proceso_verificacion)
        self.layout_principal.addWidget(self.label_proceso2)
        self.layout_principal.addWidget(self.label_proceso_verificacion2)
        self.layout_principal.addWidget(self.label_proceso3)
        self.layout_principal.addWidget(self.label_proceso_verificacion3)

        self.layout_secundario = QVBoxLayout()
        self.textarea_proceso = QTextEdit()
        self.textarea_proceso.setPlaceholderText("ESPERANDO PARA PROCESAR")
        self.textarea_proceso.setFont(QFont("Times", 14, QFont.Bold, True))
        self.textarea_proceso.setGeometry(0, 0, 500, 400)
        self.textarea_proceso.setStyleSheet(
            "color: yellow; background-color:black; border-style:solid")
        self.textarea_proceso.setReadOnly(False)
        self.textarea_proceso.setOverwriteMode(QTextEdit.WidgetWidth)
        self.layout_secundario.addWidget(self.textarea_proceso)

        self.layout_main.addLayout(self.layout_principal, 4)
        self.layout_main.addLayout(self.layout_secundario, 4)

    def inciar_hilo_principal(self):
        self.incializa_hilos()[0].start()
        return 0
Example #6
0
class SerialUI(QMainWindow):

    global ser
    global bpm
    global samplingrate
    global serialcmd
    ser = serial.Serial()
    global flag
    flag = True
    wrong = 0
    stopper = pyqtSignal()
    starter = pyqtSignal()

    def __init__(self):
        super(SerialUI, self).__init__()
        self.InitUI()

    def InitUI(self):
        # QMainWindow settings
        self.setWindowTitle('Heart Monitor')
        self.setStyleSheet("background-color: beige")
        self.setGeometry(10, 10, 1100, 750)
        self.move(500, 300)

        # Create push button
        self.b1 = QPushButton('Start', self)
        self.b1.move(350, 650)
        self.b1.setStyleSheet("background-color: white")
        self.b1.clicked.connect(self.start_call)

        self.b2 = QPushButton('BPM', self)
        self.b2.move(500, 650)
        self.b2.setStyleSheet("background-color: white")
        self.b2.clicked.connect(self.get_bpm)

        self.b3 = QPushButton('Plot', self)
        self.b3.move(650, 650)
        self.b3.setStyleSheet("background-color: white")

        self.lb5 = QLabel(self)
        self.lb5.resize(100, 50)
        self.lb5.move(10, 50)
        self.lb5.setText("COMPORT:")

        # Create textbox
        self.tb1 = QLineEdit(self)  # COMPORT
        self.tb1.resize(150, 70)
        self.tb1.setStyleSheet("background-color: white")
        self.tb1.move(100, 50)

        self.lb6 = QLabel(self)
        self.lb6.resize(100, 50)
        self.lb6.move(260, 50)
        self.lb6.setText("BAUDRATE:")

        self.tb2 = QLineEdit(self)  # BAUDRATE
        self.tb2.resize(150, 70)
        self.tb2.setStyleSheet("background-color: white")
        self.tb2.move(360, 50)

        self.lb7 = QLabel(self)
        self.lb7.resize(130, 50)
        self.lb7.move(520, 50)
        self.lb7.setText("SAMPLINGRATE:")

        # Create textbox
        self.tb4 = QLineEdit(self)  # Sampling Rate
        self.tb4.resize(150, 70)
        self.tb4.setStyleSheet("background-color: white")
        self.tb4.move(650, 50)

        self.lb8 = QLabel(self)
        self.lb8.resize(130, 50)
        self.lb8.move(810, 50)
        self.lb8.setText("SAMPLINGTIME:")

        # Create textbox
        self.tb5 = QLineEdit(self)  # Time
        self.tb5.resize(150, 70)
        self.tb5.setStyleSheet("background-color: white")
        self.tb5.move(940, 50)

        # Create label
        self.lb1 = QLabel(self)
        self.lb1.setFont(QFont('SansSerif', 15))
        self.lb1.setStyleSheet("color: black")
        self.lb1.resize(200, 50)
        self.lb1.move(300, 160)
        self.lb1.setText("Terminal:")

        self.tb3 = QTextEdit(self)
        self.tb3.setFont(QFont('SansSerif', 15))
        self.tb3.setStyleSheet("color: black")
        self.tb3.setStyleSheet("background-color: white")
        self.tb3.resize(500, 400)
        self.tb3.move(300, 230)

        self.thread = QThread()
        self.worker = runThread()
        self.stopper.connect(self.worker.stop)
        self.worker.plot.connect(self.plot)
        self.worker.moveToThread(self.thread)
        #self.worker.end.connect(self.thread.quit)
        #self.worker.end.connect(self.worker.deleteLater)
        #self.worker.end.connect(self.thread.deleteLater)
        self.worker.displayText.connect(self.display)
        self.thread.started.connect(self.worker.work)
        #self.thread.finished.connect(self.worker.stop)
        self.b3.clicked.connect(self.stop_call)
        self.starter.connect(self.worker.start)
        self.show()

    def stop_call(self):
        self.stopper.emit()

    def get_bpm(self):
        self.tb3.append("BPM: " + self.bpm)

    def display(self, heart):
        if (heart != ""):
            if heart[0] != "B":
                self.tb3.append(heart)
            else:
                self.bpm = heart[5:-2]

    def plot(self):
        fig = plt.figure()
        ax = fig.add_subplot(1, 1, 1)
        ax.plot(xs, ys)
        plt.xticks(rotation=45, ha='right')
        plt.subplots_adjust(bottom=0.30)
        plt.title('Heart Beat')
        plt.ylabel('ECG Output')
        plt.ylabel('Count')
        plt.show()

    @pyqtSlot()
    def start_call(self):
        xs.clear()
        ys.clear()
        # # Serial settings
        ser.close()
        try:
            self.thread.terminate()
        except:
            ser.close()
        try:
            ser.port = self.tb1.text()
            ser.baudrate = self.tb2.text()

            if ser.is_open is not True:  # Check the serial port again whether it is open or not.
                ser.open()

            try:
                serialcmd = self.tb5.text()
                userInput = int(serialcmd)
                for x in range(len(serialcmd)):
                    ser.write(serialcmd[x].encode())
                ser.write("\r".encode())

                self.samplingrate = self.tb4.text()
                serialcmd = self.samplingrate
                userInput = int(serialcmd)
                for x in range(len(serialcmd)):
                    ser.write(serialcmd[x].encode())
                ser.write("\r".encode())
                self.thread.setTerminationEnabled(True)
                self.thread.start()
            except ValueError:
                self.tb3.append("Invalid Sampling Rate")
        except:
            self.tb3.append("Invalid Serial Port")
Example #7
0
class Gui(QWidget):
    def __init__(self):
        super().__init__()
        self.foldername = None
        self.server = None
        self.initUI()

    def initUI(self):
        grid = QGridLayout()
        self.setLayout(grid)
        self.addr_frame = QFrame()
        addr_layout = QGridLayout()
        self.addr_frame.setLayout(addr_layout)

        lbl_host = QLabel('Host:', self)
        lbl_port = QLabel('Port:', self)
        lbl_msg = QLabel('Msg:', self)
        lbl_spin = QLabel('Group number:', self)
        self.lbl_msg_wr = QLabel('', self)
        self.lbl_err = QLabel('', self)
        self.edit_host = QLineEdit()
        self.edit_port = QLineEdit('9090')
        self.btn_run = QPushButton('Run server', self)
        self.btn_stop = QPushButton('Stop server', self)
        self.btn_dir = QPushButton('Open folder', self)
        self.btn_ext = QPushButton('Quit', self)
        self.spin = QSpinBox()
        self.spin.setRange(0, 99)

        addr_layout.addWidget(lbl_host, 0, 0)
        addr_layout.addWidget(self.edit_host, 0, 1)
        addr_layout.addWidget(lbl_port, 0, 2)
        addr_layout.addWidget(self.edit_port, 0, 3)
        addr_layout.addWidget(self.lbl_err, 1, 0, 1, 4)

        grid.addWidget(self.addr_frame, 0, 0, 2, 4)
        grid.addWidget(lbl_spin, 2, 1, 1, 2)
        grid.addWidget(self.spin, 2, 3)
        grid.addWidget(lbl_msg, 3, 0)
        grid.addWidget(self.lbl_msg_wr, 3, 1, 1, 3)
        grid.addWidget(self.btn_run, 4, 0, 1, 4)
        grid.addWidget(self.btn_stop, 5, 0, 1, 4)
        grid.addWidget(self.btn_dir, 6, 3)
        grid.addWidget(self.btn_ext, 6, 0)

        self.btn_ext.clicked.connect(QCoreApplication.instance().quit)
        self.btn_run.clicked.connect(self.start)
        self.btn_dir.clicked.connect(self.get_filename)
        self.btn_stop.clicked.connect(self.stop)
        self.btn_stop.setDisabled(True)
        self.spin.valueChanged.connect(self.set_group)

        self.thread = QThread()
        self.thread.started.connect(lambda: self.disable_btn(True))
        self.thread.finished.connect(lambda: self.disable_btn(False))

        self.setWindowTitle('TCP Server')
        self.center()
        self.show()

    def get_filename(self):
        self.foldername = QFileDialog.getExistingDirectory(
            self, "Set folder", ".")

    @pyqtSlot(str)
    def show_msg(self, string):
        self.lbl_msg_wr.setText(string)

    def set_group(self, value):
        if self.server:
            self.server.group_number = str(value).rjust(2, '0')

    def disable_btn(self, value):
        self.btn_run.setDisabled(value)
        self.btn_stop.setEnabled(value)
        self.btn_dir.setDisabled(value)
        self.btn_ext.setDisabled(value)
        self.addr_frame.setDisabled(value)

    def start(self):
        file_patch = self.foldername + '/log.csv' if self.foldername else 'log.csv'
        self.server = Server(str(self.spin.value()).rjust(2, '0'), file_patch)
        self.server.show_string.connect(self.show_msg)
        port = self.edit_port.text()
        if port:
            self.server.create(int(port))
            self.server.loop = True
            self.server.moveToThread(self.thread)
            self.thread.started.connect(self.server.run)
            self.thread.setTerminationEnabled()
            self.thread.start()

        else:
            self.lbl_err.setText('Error!')

    def stop(self):
        if self.server:
            self.server.loop = False
            self.thread.terminate()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
class CameraDisplay(QWidget):
    frame_updated = pyqtSignal()
    # ~~~~~~~~~~~~~~~~~~~~~~~~ #
    def __init__(self, camera=None, log=None, fps=10.):
        super().__init__()
        # ---  --- #
        if log != None:
            self.log = log
        else:
            self.log = LogDisplay()
        #self.log.show()
        # --- default --- #
        self.fps       = fps
        self.normalise_hist = True
        self.cmap      = 'jet'
        # --- main attriute --- #
        self.camera    = camera
        self.contview  = ContinuousView(fps=self.fps)
        self.timer     = pg.QtCore.QTimer() #QTimer()# pg.QtCore.QTimer()
        self.qlabl_max = QLabel()
        self.isOn      = False
        self.frame     = None
        # --- color acuisition --- #
        self.initColorDic()
        # ---  --- #
        self.initUI()
        self.initCamera(camera)
        # ---  --- #
        self.camera.setExposure( self.exposure.value() )

    def initUI(self):
        # ---  --- #
        self.layout      = QVBoxLayout(self)
        self.initView()
        # --- button widget --- #
        self.button_startstop = QPushButton('Start/Stop')
        self.button_startstop.setStyleSheet("background-color: red")
        self.button_nextFrame = QPushButton('Next frame')
        # ---  --- #
        self.fps_input     = QSpinBox()
        self.fps_input.setRange(1, 48)
        self.fps_input.setValue(self.fps)
        self.exposure      = QDoubleSpinBox()
        self.exposure.setSingleStep(0.01)
        self.cam_framerate = QDoubleSpinBox()
        self.exposure.setSingleStep(0.01)
        self.pixelclock    = QDoubleSpinBox()
        self.which_camera  = QComboBox()
        self.which_camera.addItem('USB camera')
        self.which_camera.addItem('From Image Dir.')
        # --- set default --- #
        self.exposure.setRange(0.10, 99.0)
        self.exposure.setValue(12.5)
        self.cam_framerate.setRange(1.00, 15.0)
        self.cam_framerate.setValue( 10.0 )
        self.pixelclock.setRange(5, 30)
        self.pixelclock.setValue(20)
        # --- connections --- #
        self.button_startstop.clicked.connect(self.startStop_continuous_view)
        self.fps_input.valueChanged.connect(self.setFPS)
        self.button_nextFrame.clicked.connect( self.nextFrame )
        self.exposure.valueChanged.connect( self.update_exposure )
        self.cam_framerate.valueChanged.connect( self.update_camFPS )
        self.pixelclock.valueChanged.connect( self.update_pixelClock )
        self.which_camera.currentIndexChanged.connect( self.changeCameraStyle )
        # --- layout --- #
        label_1 = QLabel('fps :')
        label_1.setWordWrap(True)
        label_2 = QLabel('value max:') 
        label_2.setWordWrap(True)
        label_3 = QLabel('Which camera')
        label_3.setWordWrap(True)
        label_4 = QLabel('Exposure (ms):')
        label_4.setWordWrap(True)
        label_5 = QLabel('Camera fps:')
        label_5.setWordWrap(True)
        label_6 = QLabel('Pixel clock (MHz):')
        label_6.setWordWrap(True)
        grid = QGridLayout()
        grid.addWidget( self.button_startstop, 0,0)
        grid.addWidget( self.button_nextFrame, 0,1)
        grid.addWidget( label_1              , 0,2)
        grid.addWidget( self.fps_input       , 0,3)
        grid.addWidget( label_2              , 0,4)
        grid.addWidget( self.qlabl_max       , 0,5)
        grid.addWidget(QVLine()              , 0,6 , 2,1)
        grid.addWidget(label_3               , 0,7)
        grid.addWidget( self.which_camera    , 1,7 , 2,1)
        grid.addWidget(label_4               , 1,0)
        grid.addWidget( self.exposure        , 1,1)
        grid.addWidget(label_5               , 1,2)
        grid.addWidget( self.cam_framerate   , 1,3)
        grid.addWidget(label_6               , 1,4)
        grid.addWidget( self.pixelclock      , 1,5)
        self.layout.addLayout(grid)
        self.layout.addWidget(self.image_view)
        self.setLayout(self.layout)

    def initColorDic(self):
        self.colordic = {}
        # --- jet-like cmap --- #
        alpha     = 1.0
        positions = [0.2, 0.5, 0.75, 1.0]
        colors    = [[0,0,1.,alpha],[0,1.,1.,alpha],[1.,1.,0,alpha],[170/255,0,0,alpha]] #colors    = ['#0000ff', '#00ffff', '#ffff00', '#aa0000']
        self.colordic['jet'] = pg.ColorMap(positions, colors)
        # --- jet reversed cmap --- #
        positions_r = [1-p_ for p_ in positions]
        self.colordic['jet_r'] = pg.ColorMap(positions_r, colors)
        # --- plasma cmap --- #
        self.colordic['plasma'] = generatePgColormap('plasma')

    def initView(self):
        self.image_view     = pg.ImageView()
        # ---  --- #
        self.image_view.setColorMap(self.colordic[self.cmap])
        self.image_view.setLevels(0,255)
        self.image_view.getHistogramWidget().item.setHistogramRange(0,255)
        # ---  --- #
        self.image_view.setMinimumWidth(800)
        self.image_view.setMinimumHeight(600)

    def initCamera(self, camera):
        self.default_camera = camera
        self.simu_camera    = SimuCamera(directory_path=os.getcwd(), log=self.log)
        # ---  --- #
        self.camera = self.default_camera
        if not self.camera.isCameraInit:
            self.camera.__init__()

    def hideHistogram(self):
        self.image_view.ui.histogram.hide()

    def hidePlotButtons(self):
        self.image_view.ui.roiBtn.hide()
        self.image_view.ui.menuBtn.hide()

    def setFPS(self):
        self.fps = self.fps_input.value()
        self.contview.setFPS( self.fps )
        self.timer.setInterval(1e3/self.fps)

    def update_frame(self):
        self.frame = self.camera.get_frame()
        self.qlabl_max.setText( str(np.max(self.frame)) )
        self.image_view.setImage(self.frame.T, autoHistogramRange=False, autoLevels=False)
        self.frame_updated.emit()

    def update_exposure(self):
        self.camera.setExposure( self.exposure.value() )
        self.log.addText( 'New exposure: {}ms'.format( self.camera.getExposure() ) )
        # ---  --- #
        new_pixelclock = self.camera.getPixelClock()
        self.pixelclock.setValue( new_pixelclock )
        new_camFPS     = self.camera.getFrameRate()
        self.cam_framerate.setValue( new_camFPS )

    def update_camFPS(self):
        newfps = self.camera.setFrameRate( self.cam_framerate.value() )
        self.log.addText('New camera fps: {:.3f}'.format( self.camera.getFrameRate() ) )
        self.cam_framerate.setValue(newfps)
        # ---  --- #
        new_pixelclock = self.camera.getPixelClock()
        self.pixelclock.setValue( new_pixelclock )
        new_exposure   = self.camera.getExposure()
        self.exposure.setValue( new_exposure )

    def update_pixelClock(self):
        self.camera.setPixelClock( int(self.pixelclock.value()) )
        self.log.addText( 'New pixel clock: {}Mhz'.format( self.camera.getPixelClock() ))
        # ---  --- #
        new_camFPS     = self.camera.getFrameRate()
        self.cam_framerate.setValue( new_camFPS )
        new_exposure   = self.camera.getExposure()
        self.exposure.setValue( new_exposure )

    def nextFrame(self):
        wasOn = self.isOn
        if not self.isOn:
            self.camera.capture_video()
        # ---  --- #
        self.update_frame()
        # ---  --- #
        if not wasOn:
            self.camera.capture_video()

    def startStop_continuous_view(self):
        if  self.isOn:
            self.stop_continuous_view()
            self.button_startstop.setStyleSheet("background-color: red")
            self.button_nextFrame.setFlat(False)
            self.button_nextFrame.setEnabled(True)
        else:
            self.start_continuous_view()
            self.button_startstop.setStyleSheet("background-color: green")
            self.button_nextFrame.setFlat(True)
            self.button_nextFrame.setEnabled(False)

    def start_continuous_view(self):
        self.camera.capture_video()
        if   True:
            self.start_continuous_view_qtimer()
        elif False:
            self.start_continuous_view_qthread()
        # ---  --- #
        self.isOn = True

    def stop_continuous_view(self):
        self.camera.stop_video()
        if   True:
            self.stop_continuous_view_qtimer()
        elif False:
            self.stop_continuous_view_qthread()
        # ---  --- #
        self.isOn = False

    def start_continuous_view_qthread(self):
        # ---  --- #
        self.thread = QThread()
        self.thread.setTerminationEnabled(True)
        # --- connect --- #
        self.contview.moveToThread(self.thread)
        self.thread.started.connect(self.contview.startFeed)
        self.contview.newshot.connect(self.update_image)
        self.contview.finished.connect(self.thread.quit)
        # ---  --- #
        self.thread.start()

    def stop_continuous_view_qthread(self):
        self.contview.stopFeed()

    def start_continuous_view_qtimer(self):
        # ---  --- #
        self.timer.timeout.connect(self.update_frame)
        self.timer.start(1e3/self.fps) #ms

    def stop_continuous_view_qtimer(self):
        self.timer.stop()

    def changeCameraStyle(self):
        self.camera.stop_video()
        # ---  --- #
        indx = self.which_camera.currentIndex()
        if   indx == 0:
            self.camera = self.default_camera
            # ---  --- #
            self.exposure.setEnabled(True)
            self.cam_framerate.setEnabled(True)
            self.pixelclock.setEnabled(True)
        elif indx == 1:
            self.camera.stop_video()
            dir_path    = QFileDialog().getExistingDirectory()
            self.log.addText('NEW DIR PATH: {}'.format(dir_path))
            self.simu_camera.setDirectoryPath( dir_path )
            self.simu_camera.initialize()
            self.camera = self.simu_camera
            # ---  --- #
            self.exposure.setEnabled(False)
            self.cam_framerate.setEnabled(False)
            self.pixelclock.setEnabled(False)
Example #9
0
class SimulationView(QWidget, Ui_simulationView):
    SIGNAL_toggled_plot_indicator = "indicator"

    def __init__(self, model=None, controller=None):
        super(SimulationView, self).__init__()
        self.model = model
        self.allPlotsDict = {}
        self.setupUi(self)
        self.connect_buttons()
        self.connect_signals()
        self.connect_checkbox()
        self.create_plots()
        self.initialize_view()

    def initialize_view(self):
        self.cb_isInfected.setChecked(True)

    def connect_buttons(self):
        self.pb_simulate.clicked.connect(self.launch_simulation)
        log.info("Connecting simulationView GUI...")

    def connect_checkbox(self):
        self.cb_isInfected.stateChanged.connect(
            lambda: self.toggle_plot("isInfected", caller=self.cb_isInfected))
        self.cb_isInfectious.stateChanged.connect(lambda: self.toggle_plot(
            "isInfectious", caller=self.cb_isInfectious))
        self.cb_isAlive.stateChanged.connect(
            lambda: self.toggle_plot("isAlive", caller=self.cb_isAlive))
        self.cb_isRecovered.stateChanged.connect(lambda: self.toggle_plot(
            "isRecovered", caller=self.cb_isRecovered))
        self.cb_isHospitalized.stateChanged.connect(lambda: self.toggle_plot(
            "isHospitalized", caller=self.cb_isHospitalized))
        self.cb_hasSymptoms.stateChanged.connect(lambda: self.toggle_plot(
            "hasSymptoms", caller=self.cb_hasSymptoms))

    def connect_signals(self):
        log.info("Connecting simulationView Signals...")
        self.model.simulatorObject.s_data_changed.connect(self.update_graph)

    def create_plots(self):
        for indicator in Person().indicators:
            self.allPlotsDict[indicator] = {
                "plotItem": PlotItem(),
                "displayed": 0
            }
        for indicator in Person().indicators:
            self.allPlotsDict[indicator]["plotDataItem"] = {}
            for ageGroup in Person().ageGroupsList:
                dataPlotItem = self.allPlotsDict[indicator]["plotItem"].plot()
                self.allPlotsDict[indicator]["plotDataItem"][
                    ageGroup] = dataPlotItem
                # self.allPlotsDict[indicator]["plotDataItem"][ageGroup].setDownsampling()
            self.allPlotsDict[indicator]["plotItem"].setTitle(indicator)
        print(self.allPlotsDict)

    def toggle_plot(self, indicator, caller=None):
        if caller.checkState() == 2:
            self.allPlotsDict[indicator]["displayed"] = 1
            self.update_plots_position()
            dispatcher.send(signal=SIGNAL_PLOT_TOGGLED,
                            sender=self,
                            **{"indicator": indicator})

        elif caller.checkState() == 0:
            self.pyqtgraphWidget.removeItem(
                self.allPlotsDict["{}".format(indicator)]["plotItem"])
            self.allPlotsDict[indicator]["displayed"] = 0
            self.update_plots_position()

        else:
            pass

    def update_plots_position(self):
        self.pyqtgraphWidget.clear()
        sideLength = math.ceil(
            math.sqrt(
                sum(self.allPlotsDict[ind]["displayed"] == 1
                    for ind in self.allPlotsDict.keys())))
        tempPlotDict = {
            key: value
            for (key, value) in self.allPlotsDict.items()
            if value["displayed"] == 1
        }
        indicatorList = list(tempPlotDict.keys())
        listIndex = 0
        for i in range(sideLength):
            for j in range(sideLength):
                try:
                    self.pyqtgraphWidget.addItem(
                        tempPlotDict[indicatorList[listIndex]]["plotItem"], i,
                        j)
                    listIndex += 1
                except:
                    pass

    @pyqtSlot(dict)
    def update_graph(self, simPlotData):
        # all plot are updated, but could verify which one is active and only update those
        #print(simPlotData)
        for indicator in Person().indicators:
            for ageGroup in Person().ageGroupsList:
                try:
                    kwargs = simPlotData[indicator][ageGroup]
                    #print(ageGroup)
                    self.allPlotsDict[indicator]["plotDataItem"][
                        ageGroup].setData(**kwargs)
                except:
                    log.info("null")

    def unfold_plot_data(self, foldedData):
        unfoldedData = []
        xdata = foldedData[0]
        for ydata in foldedData[1]:
            unfoldedData.append([xdata, ydata])
        return unfoldedData

    def load_simulation_parameters(self):
        pass

    def update_plot(self):
        pass

    def initialize_simulation(self):
        pass

    def launch_simulation(self):
        self.pb_simulate.setEnabled(False)
        self.pb_simulate.clicked.disconnect()
        self.pb_simulate.clicked.connect(self.stop_simulation)
        self.pb_simulate.setText("Stop")
        self.pb_simulate.setEnabled(True)
        args = [
            self.model.populationSize, self.model.initialInfected,
            self.model.simulationTime
        ]
        log.info("Population Size:{}".format(self.model.populationSize))
        log.info("Population: {}".format(
            self.model.simulatorObject.population))
        log.info("Parameters: {}".format(
            self.model.simulatorObject.parameters))
        log.info("Initially Infected: {}".format(self.model.initialInfected))
        self.simulationWorker = Worker(
            self.model.simulatorObject.simulate_from_gui, *args)
        self.simulationThread = QThread()
        self.simulationWorker.moveToThread(self.simulationThread)
        self.simulationThread.started.connect(self.simulationWorker.run)
        self.simulationThread.start()

    def stop_simulation(self):
        self.pb_simulate.setEnabled(False)
        self.pb_simulate.setText("Resume")
        self.simulationThread.setTerminationEnabled(True)
        self.simulationThread.terminate()
        self.pb_simulate.clicked.disconnect()
        self.pb_simulate.clicked.connect(self.resume_simulation)
        self.pb_simulate.setEnabled(True)

    def resume_simulation(self):
        pass
Example #10
0
class MenuChat(Menu):
    def __init__(self):
        Menu.__init__(self, "Chat")

        self.widget = QWidget()

        self.hosts = {}

        qtMainLayout = QGridLayout(self.widget)
        qtText = QTextBrowser()
        qtInput = QLineEdit()

        qtConfigLayout = QVBoxLayout()

        qtPeers = QGroupBox("Recipients")
        qtPeersLayout = QVBoxLayout(qtPeers)

        def onBroadcastChange(state):
            self.setBroadcast(state > 0)

        qtBroadcast = QCheckBox("Broadcast")
        qtBroadcast.stateChanged.connect(onBroadcastChange)

        qtNetworkBox = QGroupBox("Network")
        qtNetworkLayout = QVBoxLayout(qtNetworkBox)

        def onNetworkChange():
            if self.qtNetworkTcp.isChecked():
                self.qtPeers.setEnabled(True)

                self.qtBroadcast.setEnabled(False)
                self.qtBroadcast.setCheckState(0)
            elif self.qtNetworkUdp.isChecked():
                self.qtBroadcast.setEnabled(True)

        qtNetworkTcp = QRadioButton("TCP")
        qtNetworkUdp = QRadioButton("UDP")
        qtNetworkBox.setSizePolicy(
            QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Maximum))

        qtNetworkLayout.addWidget(qtNetworkTcp)
        qtNetworkLayout.addWidget(qtNetworkUdp)

        qtNetworkUdp.toggle()

        qtConfigLayout.addWidget(qtBroadcast)
        qtConfigLayout.addWidget(qtPeers)
        qtConfigLayout.addWidget(qtNetworkBox)

        qtMainLayout.addWidget(qtText, 0, 0, 1, 1)
        qtMainLayout.addWidget(qtInput, 1, 0, 1, 1)
        qtMainLayout.addLayout(qtConfigLayout, 0, 1, 2, 1)

        qtText.setText("")

        qtSettingsLayout = QGridLayout()

        qtNameLabel = QLabel("Name")
        qtName = QLineEdit()
        qtNameLabel.setMaximumWidth(40)
        qtName.setMaximumWidth(100)

        qtAesLabel = QLabel("AES")
        qtAes = QLineEdit()
        qtAesLabel.setMaximumWidth(40)
        qtAes.setMaximumWidth(100)

        qtSettingsLayout.addWidget(qtNameLabel, 0, 0, 1, 1)
        qtSettingsLayout.addWidget(qtName, 0, 1, 1, 1)
        #qtSettingsLayout.addWidget(qtAesLabel,1,0,1,1)
        #qtSettingsLayout.addWidget(qtAes,1,1,1,1)

        qtConfigLayout.addLayout(qtSettingsLayout)

        self.qtInput = qtInput
        self.qtText = qtText
        self.qtPeers = qtPeers
        self.qtNetworkBox = qtNetworkBox
        self.qtNetworkTcp = qtNetworkTcp
        self.qtNetworkUdp = qtNetworkUdp
        self.qtPeersLayout = qtPeersLayout
        self.qtBroadcast = qtBroadcast
        self.qtName = qtName

        def onReturn():
            msg = self.qtInput.text().strip()
            if (msg):
                self.onInput(msg)
            self.qtInput.setText("")

        qtInput.returnPressed.connect(onReturn)
        qtNetworkTcp.toggled.connect(onNetworkChange)
        qtNetworkUdp.toggled.connect(onNetworkChange)

        def aes_update():
            self.aes_key = self.qtAes.text()
            self.chatUdp.loop.call_soon_threadsafe(self.chatUdp.update_aes,
                                                   self.aes_key)

        qtName.editingFinished.connect(
            lambda: self.setName(self.qtName.text().strip()))
        qtAes.editingFinished.connect(aes_update)

        qtBroadcast.setCheckState(2)

        self.local_peer = ChatPeer(local=True)
        self.peers = {}
        self.peers_checkboxes = {}
        self.peers[self.local_peer.uuid] = self.local_peer
        self.aes_key = ""

        self.setupTcp()
        self.setupUdp()

        qtName.setText(socket.gethostname())
        self.local_peer.name = socket.gethostname()

    def setupTcp(self):
        self.chatTcp = ChatTcp(('0.0.0.0', 5012),
                               peers=self.peers,
                               local_peer=self.local_peer)
        self.chatTcp.sig_peer_data.connect(
            lambda peer, data: self.peer_data(peer, data))

        self.chatTcp_thread = QThread()
        self.chatTcp_thread.setTerminationEnabled(False)

        self.chatTcp_thread.started.connect(self.chatTcp.started)
        self.chatTcp_thread.finished.connect(self.chatTcp_thread.deleteLater)

        self.chatTcp.moveToThread(self.chatTcp_thread)

        self.chatTcp_thread.start()

    def tcpSend(self, peer, msg):
        logging.info("tcpSend ")
        self.chatTcp.loop.call_soon_threadsafe(self.chatTcp.message, msg, peer)

    def setupUdp(self):
        self.chatUdp = ChatUdp(('0.0.0.0', 5011),
                               peers=self.peers,
                               local_peer=self.local_peer)
        #self.chatUdp.sig_received.connect(lambda peer, msg: self.encryptedMessage(peer, msg))
        self.chatUdp.sig_peer_new.connect(lambda peer: self.peer_new(peer))
        self.chatUdp.sig_peer_name.connect(
            lambda peer, name: self.peer_name(peer, name))
        self.chatUdp.sig_peer_data.connect(
            lambda peer, data: self.peer_data(peer, data))

        self.chatUdp_thread = QThread()
        self.chatUdp_thread.setTerminationEnabled(False)

        self.chatUdp_thread.started.connect(self.chatUdp.started)
        self.chatUdp_thread.finished.connect(self.chatUdp_thread.deleteLater)

        self.chatUdp.moveToThread(self.chatUdp_thread)

        self.chatUdp_thread.start()

    def udpSend(self, msg, peer=None):
        logging.info("udpSend() ")
        self.chatUdp.loop.call_soon_threadsafe(self.chatUdp.message, msg, peer)

    def setBroadcast(self, state):
        self.qtPeers.setEnabled(not state)
        if state:
            self.qtNetworkUdp.toggle()

    def addMessage(self, peer, msg):
        self.qtText.moveCursor(QTextCursor.End)
        self.qtText.setTextColor(
            QColor(0, 0, 255) if peer ==
            self.local_peer else QColor(255, 0, 0))
        self.qtText.insertPlainText("[{}] ".format(peer.name))
        self.qtText.setTextColor(QColor(0, 0, 0))
        self.qtText.insertPlainText(msg)
        self.qtText.insertPlainText("\n")
        self.qtText.moveCursor(QTextCursor.End)

    def encrytedMessage(self, peer, msg):
        self.addMessage(peer, msg)

    def onInput(self, msg):

        self.addMessage(self.local_peer, msg)

        if self.qtNetworkTcp.isChecked():
            for uuid, peer in self.peers.items():
                if uuid in self.peers_checkboxes and self.peers_checkboxes[
                        uuid].checkState() == 2:
                    self.tcpSend(peer, msg)
        elif self.qtNetworkUdp.isChecked():
            if self.qtBroadcast.checkState() == 2:
                self.udpSend(msg)
            else:
                for uuid, peer in self.peers.items():
                    if uuid in self.peers_checkboxes and self.peers_checkboxes[
                            uuid].checkState() == 2:
                        self.udpSend(msg, peer)

    def setName(self, name):
        logging.info("New name: {}".format(name))
        self.local_peer.name = name
        self.chatUdp.loop.call_soon_threadsafe(self.chatUdp.announce)

    def addHost(self, host, alias=None, ip=None):
        if not alias:
            alias = host

        self.hosts[host] = {
            'host': host,
            'alias': alias,
            'checkbox': checkbox,
            'ip': ip,
        }

    def peer_new(self, peer):
        checkbox = QCheckBox(peer.name)
        self.qtPeersLayout.addWidget(checkbox)
        self.peers[peer.uuid] = peer
        self.peers_checkboxes[peer.uuid] = checkbox

    def peer_name_changed(self, peer):
        if peer.uuid in self.peers_checkboxes:
            self.peers_checkboxes[peer.uuid].setText(peer.name)

    def peer_data(self, peer, data):
        if not peer.uuid in self.peers:
            self.peer_new(peer)

        cmd, *opts = data.decode().split(' ', 1)
        cmd = cmd.upper()
        opts = opts[0] if opts else None

        def CMD_MSG(opts):
            self.addMessage(peer, opts)

        def CMD_ANNOUNCE(opts):
            if opts:
                old_name = peer.name
                peer.name = opts
                if old_name != peer.name:
                    self.peer_name_changed(peer)

        commands = {
            'MSG': CMD_MSG,
            'ANNOUNCE': CMD_ANNOUNCE,
        }

        if cmd in commands:
            commands[cmd](opts)