Exemplo n.º 1
0
    def scannerLookup(self):

        #self.dialog.setModal(True)

        self.uidlg = Ui_Dialog()
        self.uidlg.setupUi(self.dialog)

        self.dialog.show()
class dialogUi(QDialog):
    def __init__(self, parent=None):

        super(dialogUi, self).__init__(parent)
        self.d = Ui_Dialog()
        self.d.setupUi(self)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint) # REMOVING WINDOWS TOP BAR AND MAKING IT FRAMELESS (AS WE HAVE AMDE A CUSTOME FRAME IN THE WINDOW ITSELF)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # MAKING THE WINDOW TRANSPARENT SO THAT TO GET A TRUE FLAT UI

        #############################################################################################                        -------(C1)
        #SINCE THERE IS NO WINDOWS TOPBAR, THE CLOSE MIN, MAX BUTTON ARE ABSENT AND SO THERE IS A NEED FOR THE ALTERNATIVE BUTTONS IN OUR
        #DIALOG BOX, WHICH IS CARRIED OUT BY THE BELOW CODE
        #-----> MINIMIZE BUTTON OF DIALOGBOX
        self.d.bn_min.clicked.connect(lambda: self.showMinimized())

        #-----> CLOSE APPLICATION FUNCTION BUTTON
        self.d.bn_close.clicked.connect(lambda: self.close())

        #-----> THIS FUNCTION WILL CHECKT WEATHER THE BUTRTON ON THE DIALOGBOX IS CLICKED, AND IF SO DIRECTS TO THE FUNCTINON : diag_return()
        self.d.bn_east.clicked.connect(lambda: self.close())
        self.d.bn_west.clicked.connect(lambda: self.close())
        ##############################################################################################

    ##################################################################################################                        ------(C2)
        #SINCE THERE I S NO TOP BAR TO MOVE THE DIALOGBOX OVER THE SCREEN WE HAVE TO DEFINE THE MOUSE EVENT THAT IS RESPONSIBLE FOR THE
        #MOVEMENT. THIS IS CARRIED BY THIS FUNCTION
        #---> MOVING THE WINDOW WHEN LEFT MOUSE PRESSED AND DRAGGED OVER DIALOGBOX TOPBAR
        self.dragPos = self.pos()   #INITIAL POSOTION OF THE DIALOGBOX
        def movedialogWindow(event):
            # MOVE WINDOW
            if event.buttons() == Qt.LeftButton:
                self.move(self.pos() + event.globalPos() - self.dragPos)
                self.dragPos = event.globalPos()
                event.accept()

        # WIDGET TO MOVE
        self.d.frame_top.mouseMoveEvent = movedialogWindow  #CALLING THE FUNCTION TO CJANGE THE POSITION OF THE DIALOGBOX DURING MOUSE DRAG
        ################
    #----> FUNCTION TO CAPTURE THE INITIAL POSITION OF THE MOUSE
    def mousePressEvent(self, event):
        self.dragPos = event.globalPos()
    #################################################################################################

    #################################################################################################                        ------(C3)
    #THE DIALOG BOX IS DESIGNED TO BE CALLED FROM ANY WHERE IN THE UI WITH ABLE TO CHANGE THE STATRE OF THE TEXT SHOWN, BUTTON NAMES E.T.C
    #THIS IS MADE BY CALLING THIS FUNCTION WHICH TAKES: HEADING, MESSAGE, ICON, BUTTON NAME 1, BUTTON NAME 2 AS ARUMENT.
    #EMBED THE GIVEN PROPERT TO THE DIALOGBOX AND FINALLY DISPLAYS IT IN THE WINDOW.
    #-------> SETTING THE DIALOGBOX CONFIGRATION: TEXT IN BUTTON, LABEL, HEADING
    def dialogConstrict(self, heading, message, icon, btn1, btn2):
        self.d.lab_heading.setText(heading)
        self.d.lab_message.setText(message)
        self.d.bn_east.setText(btn2)
        self.d.bn_west.setText(btn1)
        pixmap = QtGui.QPixmap(icon)
        self.d.lab_icon.setPixmap(pixmap)
Exemplo n.º 3
0
    def __init__(self, backend):
        super(DialogWindow, self).__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.listInterfaces = backend.getInterfaces()
        self.backend = backend

        for item in self.listInterfaces:
            tmp = item.get('name') + ' // ' + item.get('mac')
            self.ui.comboBox_interfaces.addItem(tmp)

        self.ui.buttonBox.accepted.connect(self.saveExit)
        self.ui.buttonBox.rejected.connect(self.cancelExit)
Exemplo n.º 4
0
class ProjectsManagementDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        super(ProjectsManagementDialog, self).__init__(parent)

        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.model = QtSql.QSqlTableModel()
        self.model.setTable("projects")
        self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
        self.model.select()
        #self.model.removeColumn(0) # removeColumn() is a BUG of Qt (last tested on v4.7.0)
        self.model.setHeaderData(0, QtCore.Qt.Horizontal, "PID")
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Project")
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Active")

        self.ui.tableView.setModel(self.model)
        self.ui.tableView.setColumnHidden(0, True)  # use this to avoid removeColumn() bug
        self.ui.tableView.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder)
        self.ui.tableView.resizeColumnsToContents()

    @QtCore.Slot()
    def on_btnNew_clicked(self):
        self.model.insertRecord(-1, QtSql.QSqlRecord())

    @QtCore.Slot()
    def on_btnDelete_clicked(self):
        selmodel = self.ui.tableView.selectionModel()
        selected = selmodel.selectedIndexes()
        if len(selected) > 0:
            self.model.removeRows(selected[0].row(), 1)

    @QtCore.Slot()
    def on_btnSubmit_clicked(self):
        self.model.database().transaction()
        if self.model.submitAll():
            self.model.database().commit()
        else:
            self.model.database().rollback()
            QtGui.QMessageBox.warning(self, "Error", "%s" % self.model.lastError().text())

    @QtCore.Slot()
    def on_btnRevert_clicked(self):
        self.model.revertAll()

    @QtCore.Slot()
    def on_btnClose_clicked(self):
        self.close()
Exemplo n.º 5
0
    def __init__(self, parent=None):

        super(dialogUi, self).__init__(parent)
        self.d = Ui_Dialog()
        self.d.setupUi(self)
        self.setWindowFlags(
            Qt.FramelessWindowHint
        )  # REMOVING WINDOWS TOP BAR AND MAKING IT FRAMELESS (AS WE HAVE AMDE A CUSTOME FRAME IN THE WINDOW ITSELF)
        self.setAttribute(
            Qt.WA_TranslucentBackground
        )  # MAKING THE WINDOW TRANSPARENT SO THAT TO GET A TRUE FLAT UI

        #############################################################################################                        -------(C1)
        #SINCE THERE IS NO WINDOWS TOPBAR, THE CLOSE MIN, MAX BUTTON ARE ABSENT AND SO THERE IS A NEED FOR THE ALTERNATIVE BUTTONS IN OUR
        #DIALOG BOX, WHICH IS CARRIED OUT BY THE BELOW CODE
        #-----> MINIMIZE BUTTON OF DIALOGBOX
        self.d.bn_min.clicked.connect(lambda: self.showMinimized())

        #-----> CLOSE APPLICATION FUNCTION BUTTON
        self.d.bn_close.clicked.connect(lambda: self.close())

        #-----> THIS FUNCTION WILL CHECKT WEATHER THE BUTRTON ON THE DIALOGBOX IS CLICKED, AND IF SO DIRECTS TO THE FUNCTINON : diag_return()
        self.d.bn_east.clicked.connect(lambda: self.close())
        self.d.bn_west.clicked.connect(lambda: self.close())
        ##############################################################################################

        ##################################################################################################                        ------(C2)
        #SINCE THERE I S NO TOP BAR TO MOVE THE DIALOGBOX OVER THE SCREEN WE HAVE TO DEFINE THE MOUSE EVENT THAT IS RESPONSIBLE FOR THE
        #MOVEMENT. THIS IS CARRIED BY THIS FUNCTION
        #---> MOVING THE WINDOW WHEN LEFT MOUSE PRESSED AND DRAGGED OVER DIALOGBOX TOPBAR
        self.dragPos = self.pos()  #INITIAL POSOTION OF THE DIALOGBOX

        def movedialogWindow(event):
            # MOVE WINDOW
            if event.buttons() == Qt.LeftButton:
                self.move(self.pos() + event.globalPos() - self.dragPos)
                self.dragPos = event.globalPos()
                event.accept()

        # WIDGET TO MOVE
        self.d.frame_top.mouseMoveEvent = movedialogWindow  #CALLING THE FUNCTION TO CJANGE THE POSITION OF THE DIALOGBOX DURING MOUSE DRAG
Exemplo n.º 6
0
class Dialog(QDialog):
    sendText = Signal(str)

    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self._ui = Ui_Dialog()
        self._ui.setupUi(self)
        self._ui.send.clicked.connect(self.clicked)

    @Slot(str)
    def displayMessage(self, message):
        self._ui.output.appendPlainText(message)

    @Slot()
    def clicked(self):
        text = self._ui.input.text()
        if not text:
            return
        self.sendText.emit(text)
        self.displayMessage("Sent message: {}".format(text))
        self._ui.input.clear()
Exemplo n.º 7
0
class DialogWindow(QtWidgets.QDialog):
    def __init__(self, backend):
        super(DialogWindow, self).__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.listInterfaces = backend.getInterfaces()
        self.backend = backend

        for item in self.listInterfaces:
            tmp = item.get('name') + ' // ' + item.get('mac')
            self.ui.comboBox_interfaces.addItem(tmp)

        self.ui.buttonBox.accepted.connect(self.saveExit)
        self.ui.buttonBox.rejected.connect(self.cancelExit)

    # ^^^ __init__ ^^^

    def saveExit(self):
        self.setResult(self.ui.comboBox_interfaces.currentIndex())
        self.backend.currentInterface.index = self.ui.comboBox_interfaces.currentIndex(
        )
        print(': ' + str(self.backend.currentInterface.index))
        if self.backend.currentInterface.index == -1:
            self.ui.label_currentInterface.setText("Не выбран")
        else:
            self.backend.currentInterface.interface = self.listInterfaces[
                self.ui.comboBox_interfaces.currentIndex()]
            self.ui.label_currentInterface.setText(
                self.backend.currentInterface.interface.get('name') + ' // ' +
                self.backend.currentInterface.interface.get('mac'))
        self.accept()

    # ^^^ saveExit ^^^

    def cancelExit(self):
        self.reject()
Exemplo n.º 8
0
class Dialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

    def accept(self):
        self.make_file()

    def reject(self):
        # self.make_file()
        QtGui.QDialog.reject(self)

    def make_file(self):
        przedm, pen = (
            'jum', 'Czas oddania') if self.ui.radioButton.isChecked() else (
                'jpi', 'Time penalty')
        report = self.ui.raport.value()
        punkty = self.ui.punkty.value()
        student = self.ui.student.text()
        #print dir(self.ui.ocena.document().toPlainText())
        fname = '%s_r%d_%s_%dpkt.txt' % (przedm, report, student, punkty)
        print fname
        komunikat = """%s

%s: -%d pkt

%s""" % (self.ui.temat.text(), pen, self.ui.spozn.value(),
         self.ui.ocena.document().toPlainText())
        print komunikat
        codecs.open(fname, 'wt', locale.getdefaultlocale()[1]).write(komunikat)

    @QtCore.pyqtSignature("int")
    def on_spozn_valueChanged(self, value):
        self.ui.punkty.setMaximum(10 - int(value))
        self.ui.punkty.setValue(10 - int(value))
Exemplo n.º 9
0
    def __init__(self, parent=None):
        super(ProjectsManagementDialog, self).__init__(parent)

        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.model = QtSql.QSqlTableModel()
        self.model.setTable("projects")
        self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
        self.model.select()
        #self.model.removeColumn(0) # removeColumn() is a BUG of Qt (last tested on v4.7.0)
        self.model.setHeaderData(0, QtCore.Qt.Horizontal, "PID")
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Project")
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Active")

        self.ui.tableView.setModel(self.model)
        self.ui.tableView.setColumnHidden(0, True)  # use this to avoid removeColumn() bug
        self.ui.tableView.sortByColumn(0, QtCore.Qt.SortOrder.AscendingOrder)
        self.ui.tableView.resizeColumnsToContents()
Exemplo n.º 10
0
 def __init__(self, parent=None):
     super(Dialog, self).__init__(parent)
     self._ui = Ui_Dialog()
     self._ui.setupUi(self)
     self._ui.send.clicked.connect(self.clicked)
Exemplo n.º 11
0
    def goButtonPressed(self):
        print "Go";
        time.sleep(10);
    def srcListItemClicked(self, item):
        print "Srclist" + item.text();
    def dstListItemClicked(self, item):
        print "dstlist" + item.text();
    def stopButtonPressed(self):
        print "stop";
    def resetButtonPressed(self):
        print "reset";
    def dockButtonPressed(self):
        print "dock";
    def blankButtonPressed(self):
        print "blank";
    def undockButtonPressed(self):
        print "undock";
    def turnButtonPressed(self):
        print "turn";
    def pauseButtonPressed(self):
        print "pause";

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    gui = GUI();
    ui = Ui_Dialog();
    ui.setupUi(gui);
    ui.lineLabel.setText("HELLO")
    gui.show()
    sys.exit(app.exec_())
Exemplo n.º 12
0
 def __init__(self):
     super(Window, self).__init__()
     self.ui = Ui_Dialog()
     self.ui.setupUi(self)
Exemplo n.º 13
0
class Window(QtGui.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
Exemplo n.º 14
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.mode = ['lineart', 'gray', 'color']
        self.resolution = ['75', '100', '150', '200', '300', '600', '1200']
        self.compression = ['None', 'JPEG']
        self.scanFolder = os.getcwd()
        self.ver = sane.init()

        self.ui = uic.loadUi("mainwindow.ui", self)
        #self.ui = Ui_MainWindow()
        #self.ui.setupUi(self)

        self.dialog = QDialog()
        self.message = QMessageBox()

        self.threadpool = QThreadPool()

        self.settings = QSettings("bibuweb.de", "Scan2Folder")

        self.progressBar = None

        self.configWin = ConfigWindow(self)
        self.configWin.ui.scanButton.clicked.connect(self.configScan)

        self.ui.resolutions.addItems(self.resolution)
        self.ui.resolutions.setCurrentIndex(
            self.ui.resolutions.findText('300'))

        self.ui.btnOpenDir.clicked.connect(self.openDir)
        self.ui.btnStartscan.clicked.connect(self.startScanJob)
        self.ui.btnOcr.clicked.connect(self.ocr_startProcess)

        self.ui.actionCalibrate.triggered.connect(self.configureWindow)
        self.configWin.ui.saveButton.clicked.connect(self.saveConfig)

        # Change Color back after error
        self.ui.filename.cursorPositionChanged.connect(self.leditcolor)

        self.ui.scanpath.cursorPositionChanged.connect(self.leditcolor)
        self.ui.scanpath.textChanged.connect(self.scanPathCanged)

        self.is_dev = True
        self.dev_available = False
        self.dev_connected = False
        self.adf = False
        self.dev = None
        self.devices = []
        self.scanStatus = False
        self.btnStyle = ""

        self.contrast = 1
        self.brightness = 1
        self.color = 1
        self.sharpness = 1
        self.scanPath = ""
        self.ocr = False
        self.crop = False
        self.cropSize = {'left': 1, 'top': 1, 'width': 1, 'height': 1}
        self.ocrFiles = []
        self.tempocr = None

        if self.settings.contains("ocr"):
            print("Load: ", self.settings.value('ocr'))
            if self.settings.value('ocr') == 'true':
                self.ocr = True
                self.ui.actionEnable_OCR.setChecked(True)
                self.configWin.ui.OCR_Enabled.setChecked(True)
                self.configWin.ui.OCR_Box.setEnabled(True)

            else:
                self.ui.actionEnable_OCR.setChecked(False)
                self.configWin.ui.OCR_Enabled.setChecked(False)
                self.configWin.ui.OCR_Box.setEnabled(False)
            ## connect Signal here and not before loading settings
            ## if not, you never will get the stored value because QAction is triggered when ever the value changed
            self.configWin.ui.OCR_Enabled.stateChanged.connect(self.ocrConfig)

        if self.settings.contains('crop'):
            if self.settings.value('crop') == 'true':
                self.crop = True
            self.configWin.ui.checkCrop.setChecked(self.crop)

        if self.settings.contains('cropSize'):
            #print(self.settings.value('cropSize'))
            self.cropSize = self.settings.value('cropSize')
            self.configWin.ui.cropX.setValue(self.cropSize['left'])
            self.configWin.ui.cropY.setValue(self.cropSize['top'])
            self.configWin.ui.cropW.setValue(self.cropSize['width'])
            self.configWin.ui.cropH.setValue(self.cropSize['height'])

        if self.settings.contains("path"):
            self.ui.scanpath.setText(self.settings.value("path"))
            self.scanPath = self.settings.value("path")
            self.createCompleter()

        if self.settings.contains('contrast'):
            self.brightness = self.settings.value('brightness')

            self.contrast = self.settings.value('contrast')
            self.configWin.ui.brigthnessLcd.setValue(float(self.brightness))
            self.configWin.ui.brigthnesSlider.setValue(
                int(float(self.brightness) * 10))
            self.configWin.ui.contrastLcd.setValue(float(self.contrast))
            self.configWin.ui.contrastSlider.setValue(
                int(float(self.contrast) * 10))

        if self.settings.contains('color'):
            self.color = self.settings.value('color')
            self.configWin.ui.colorLcd.setValue(float(self.color))
            self.configWin.ui.colorSlider.setValue(int(float(self.color) * 10))

        if self.settings.contains("sharpness"):
            self.sharpness = self.settings.value('sharpness')
            self.configWin.ui.sharpnessLcd.setValue(float(self.sharpness))
            self.configWin.ui.sharpnessSlider.setValue(
                int(float(self.sharpness) * 10))

    def closeEvent(self, event):
        #if not set, process keeps running in background
        self.scanStatus = False

    def openDir(self):
        fileDlg = QFileDialog()
        self.scanFolder = fileDlg.getExistingDirectory(
            self, 'Scan Folder', self.scanFolder,
            QFileDialog.DontUseNativeDialog)
        self.ui.scanpath.setText(self.scanFolder)
        self.settings.setValue("path", self.scanFolder)
        self.settings.sync()

    def startThread(self, fn, resultFn=None, complete=None):
        worker = Worker(
            fn)  # Any other args, kwargs are passed to the run function
        if resultFn is not None:
            worker.signals.result.connect(resultFn)
        if complete is not None:
            worker.signals.finished.connect(complete)
        #worker.signals.progress.connect(self.scannerProgress)
        self.threadpool.start(worker)

    def thread_complete(self):
        self.scannerProgress(100)
        time.sleep(1)
        self.dialog.close()

        if self.dev_available:
            self.show()
        else:
            #TODO: put error dlg here
            self.message.setText(
                "No scanner found\n Check your Configuration!")
            self.message.exec()
            print("Error: No Devices found")

        print("THREAD COMPLETE! ", self.threadpool.activeThreadCount())

    @pyqtSlot(str)
    def scanPathCanged(self, path):
        self.scanPath = path
        self.createCompleter()

    def createCompleter(self):
        ff = glob.glob(self.scanPath + "/*.pdf")
        files = []
        for f in ff:
            files.append(os.path.basename(f).split('.')[0])
        completer = QCompleter(files)
        completer.setCaseSensitivity(Qt.CaseInsensitive)
        self.ui.filename.setCompleter(completer)

    def scannerLookup(self):

        #self.dialog.setModal(True)

        self.uidlg = Ui_Dialog()
        self.uidlg.setupUi(self.dialog)

        self.dialog.show()

    def checkScanMode(self):
        mode = ""
        if self.ui.btnBuW.isChecked():
            mode = self.ui.btnBuW.text()
        elif self.ui.btnGray.isChecked():
            mode = self.ui.btnGray.text()
        elif self.ui.btnColor.isChecked():
            mode = self.ui.btnColor.text()
        print(mode)
        return mode

    def scannerAddToDlg(self, result):
        self.devices = result
        if len(self.devices) > 0:
            self.dev_available = True
            for i, dev in enumerate(result):
                self.ui.comboBox.addItem(dev[i])
        else:
            return

    def scannerProgress(self, val):
        self.uidlg.progressBar.setValue(val)

    def scanners(self):
        self.scannerLookup()
        self.startThread(sane.get_devices, self.scannerAddToDlg,
                         self.thread_complete)

    def scannerCheck(self):
        self.statusBar().showMessage("looking up for scanner ....")
        print(self.devices[0])
        count = 0
        while self.is_dev:

            try:
                #ToDo: check index from

                self.dev = sane.open(self.devices[0][0])

            except:
                print("no scanner connected, waiting...", self.dev)
            if self.dev is not None:
                self.is_dev = False
                self.dev_connected = True
                print("scanner connected")
            time.sleep(3)
            ## Stop process after 3 times to avoid endless loop if no device is available
            ## due started as thread
            count += 1
            if count > 2:
                self.is_dev = False
                self.statusBar().showMessage("No Scanner connected!")

    def commonThreadEnd(self):
        print("Thread ended")

    def scanDocThreadEnded(self):
        self.statusBar().showMessage("Job stopped")
        self.scanStatus = False
        self.setLedStatus()

    def scannerCheckThreadEnd(self):
        print("Lookup Thread ended")

        if self.dev_connected:
            self.startThread(self.scanDocuments, None, self.scanDocThreadEnded)

    def setScannerStatus(self):
        if self.dev_connected:
            self.setLedStatus()
            self.statusBar().showMessage("Scanner connected", 10)
            self.setScanButton("running")
        else:
            self.setScanButton('stopped')

    def setLedStatus(self):
        if self.scanStatus:
            pix = QPixmap(":/images/square_green.svg")
        else:
            pix = QPixmap(":/images/square_red.svg")

        self.ui.statusLed.setPixmap(pix)

    def scanDocuments(self):
        ip = self.devices[0][0].split('=')[1]
        print(ip)
        url = 'http://' + ip + XML_PATH
        self.dev.mode = self.checkScanMode()
        self.dev.resolution = int(self.ui.resolutions.currentText())
        imgNr = 0
        savePath = self.ui.scanpath.text() + "/"
        imgPrefix = self.ui.filename.text() + "_"
        #self.dev.contrast = 900
        #self.dev.brightness = self.brightness
        while self.scanStatus:
            btnreq = urlopen(url)
            soup = bs4.BeautifulSoup(str(btnreq.read()), 'lxml')
            if soup.startscan.string == str(1):
                #print("Pressed")
                if soup.adfloaded.string == str(1):
                    self.adf = True
                    print("ADF Source")
                    self.dev.source = 'ADF'
                    imIter = self.dev.multi_scan()

                    while self.adf:
                        try:
                            im = imIter.next()
                            imgNr = imgNr + 1
                            img = imgPrefix + str(imgNr) + ".png"
                            im.save(savePath + img)
                            if self.ocr:
                                self.ocrFiles.append(savePath + img)
                        except:
                            self.adf = False
                            break
                else:
                    self.adf = False
                    imgNr = imgNr + 1
                    img = imgPrefix + str(imgNr) + ".png"
                    self.dev.start()
                    im = self.dev.snap()
                    self.enhanceImage(im, savePath, img)
                    if self.ocr:
                        self.ocrFiles.append(savePath + img)
            time.sleep(3)

    def enhanceImage(self, image, path, pf):
        brightness = ImageEnhance.Brightness(image)
        image = brightness.enhance(float(self.brightness))
        contrast = ImageEnhance.Contrast(image)
        image = contrast.enhance(float(self.contrast))
        colour = ImageEnhance.Color(image)
        image = colour.enhance(float(self.color))
        sharpness = ImageEnhance.Sharpness(image)
        image = sharpness.enhance(float(self.sharpness))
        print("image saved ", self.ui.scanpath.text() + "/" + pf)
        image.save(path + pf)

    @pyqtSlot()
    def leditcolor(self):
        self.ui.scanpath.setStyleSheet("background-color:rgb(255, 255, 255)")
        self.ui.filename.setStyleSheet("background-color:rgb(255, 255, 255)")

    def startScanJob(self):

        # print("Path: ",self.scanpath.text())
        # print("Mode: ",mode)
        # print("Resolution: ", self.resolutions.currentText())
        # print("File: ", self.filename.text())

        if len(self.ui.scanpath.text()) == 0:
            msg = QMessageBox()
            msg.setText("Please enter file path!")
            msg.exec()
            self.ui.scanpath.setStyleSheet(
                "background-color:rgb(255, 170, 127)")
            return

        if len(self.ui.filename.text()) == 0:
            msg = QMessageBox()
            msg.setText("Please enter file name prefix!")
            msg.exec()
            self.ui.filename.setStyleSheet(
                "background-color:rgb(255, 170, 127)")
            return

        if not self.scanStatus:
            self.setScanButton("starting")
            self.startThread(self.scannerCheck, self.setScannerStatus,
                             self.scannerCheckThreadEnd)
            self.scanStatus = True
            self.ui.scanpath.setEnabled(False)
            self.ui.filename.setEnabled(False)
        else:
            self.scanStatus = False
            self.setScanButton("stopped")
            self.ui.scanpath.setEnabled(True)
            self.ui.filename.setEnabled(True)
            self.ui.filename.clear()

            if self.ocr and len(self.ocrFiles) > 0:
                self.ui.btnOcr.setEnabled(True)
                self.tempocr = tempfile.NamedTemporaryFile(delete=False)
                for f in self.ocrFiles:
                    self.tempocr.write(str(f + "\n").encode())
                self.tempocr.close()

    def setScanButton(self, status):

        if status == "starting":
            self.btnStyle = self.ui.btnStartscan.styleSheet()

            self.ui.btnStartscan.setStyleSheet("background-color: yellow")
            self.ui.btnStartscan.setText("Starting...")

        if status == "running":
            self.ui.btnStartscan.setStyleSheet("background-color: red")
            self.ui.btnStartscan.setText("Stop")
            self.statusBar().showMessage("Scan job is running..")

        if status == "stopped":
            self.ui.btnStartscan.setText("Sart Scan")
            self.ui.btnStartscan.setStyleSheet(self.btnStyle)

    def configureWindow(self):

        if self.dev is not None:
            self.configWin.ui.scanButton.setEnabled(True)
            self.configWin.ui.scanButton.setText("Start Scan")
        else:
            self.configWin.ui.scanButton.setEnabled(False)
            self.configWin.ui.scanButton.setText("Sart Scan Service first")

        self.configWin.show()

    def ocr_startProcess(self):
        self.progressDlg = QProgressDialog(self)
        self.progressDlg.setWindowTitle("OCR Process")
        self.progressDlg.setLabelText("OCR Process in Progress ...")
        self.progressDlg.setAutoClose(False)
        self.progressDlg.setAutoReset(False)
        self.progressDlg.setModal(True)
        self.startThread(self.ocr_process, None, self.ocr_stopped)

    def ocr_process(self):

        if len(self.ocrFiles) > 0:

            val = 0
            ### add one more for pdf create process
            max = len(self.ocrFiles) + 1
            self.progressDlg.setRange(0, max)

            for f in self.ocrFiles:
                val += 1

                self.progressDlg.setValue(val)

                #TODO: if is checked
                ocrt.deskew(f)
                #TODO: if is checked
                #NOTE: this is crop and resize in one step
                #      size and dpi are predifined to A4 300
                print(self.cropSize)
                if self.cropSize['width'] > 1:
                    ocrt.crop_resize(f, self.cropSize["left"],
                                     self.cropSize["top"],
                                     self.cropSize["width"],
                                     self.cropSize["height"])
                #TODO: if is checked
                ocrt.check_orientation(f)

            print(self.tempocr.name)
            ## works in python 3.9+
            #pdfname = self.ocrFiles[0].removesuffix("_1.png")
            pdfname, suff = self.ocrFiles[0].rsplit("_1.png")
            print(pdfname)
            ### this runs in its own process
            self.progressDlg.setLabelText("OCR Process finishing ...")
            ocrt.create_pdf(self.tempocr.name, pdfname)
            ####
            ## Workaround to get a correct finished process
            ## while pytesseract uses subprocces which can not be handled in this thread
            ####
            while not os.path.isfile(pdfname + ".pdf"):
                time.sleep(3)
            self.progressDlg.setValue(val + 1)
            os.unlink(self.tempocr.name)
            self.ocrFiles.clear()
        else:
            return

    def ocr_stopped(self):
        print("OCR finished")
        self.progressDlg.close()

    def configScan(self):
        self.dev.resolution = int(self.ui.resolutions.currentText())
        self.dev.mode = self.checkScanMode()
        self.dev.start()
        im = self.dev.snap()
        pix = ImageQt.ImageQt(im.convert('RGBA'))
        #self.configWin.im = im
        #self.configWin.ui.view.setPixmap(self.configWin.pixmap.fromImage(pix))
        self.configWin.pixmapItem.setPixmap(QPixmap.fromImage(pix))
        self.configWin.ui.view.fitInView(self.configWin.pixmapItem,
                                         Qt.KeepAspectRatio)
        self.configWin.pixmapItem.grabMouse()
        self.configWin.setBufferImage()
        self.configWin.enhanceImage()
        #im = None

    @pyqtSlot()
    def saveConfig(self):
        self.brightness = self.configWin.ui.brigthnessLcd.value()
        self.contrast = self.configWin.ui.contrastLcd.value()
        self.color = self.configWin.ui.colorLcd.value()
        self.sharpness = self.configWin.ui.sharpnessLcd.value()
        self.crop = self.configWin.ui.checkCrop.isChecked()

        self.settings.setValue('brightness', self.brightness)
        self.settings.setValue('contrast', self.contrast)
        self.settings.setValue('color', self.color)
        self.settings.setValue('sharpness', self.sharpness)
        self.settings.setValue('ocr', self.ocr)
        self.settings.setValue('crop', self.crop)
        self.settings.setValue('cropSize', self.cropSize)
        self.settings.sync()
        self.configWin.close()

    @pyqtSlot(int)
    def ocrConfig(self, state):
        if state == Qt.Checked:
            self.ocr = True
            self.configWin.ui.OCR_Box.setEnabled(True)
        else:
            self.ocr = False
            self.configWin.ui.OCR_Box.setEnabled(False)

    def closeEvent(self, e):
        if self.tempocr is not None:
            if os.path.exists(self.tempocr.name):
                os.unlink(self.tempocr.name)
        if self.configWin.isVisible():
            self.configWin.close()

        e.accept()
Exemplo n.º 15
0
 def __init__(self, parent=None):
     QtGui.QDialog.__init__(self, parent)
     self.ui = Ui_Dialog()
     self.ui.setupUi(self)