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)
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()
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()
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()
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))
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_())
class Window(QtGui.QMainWindow): def __init__(self): super(Window, self).__init__() self.ui = Ui_Dialog() self.ui.setupUi(self)
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()