diff --git a/pixelocr/gui/__init__.py b/pixelocr/gui/__init__.py index 315605e..cb0847f 100644 --- a/pixelocr/gui/__init__.py +++ b/pixelocr/gui/__init__.py @@ -16,17 +16,22 @@ import sys import signal +from threading import Thread import sip sip.setapi('QString', 2) -from .window import MainWindow - +from PyQt4 import QtCore +QtCore.signal = QtCore.pyqtSignal +QtCore.slot = QtCore.pyqtSlot from PyQt4.QtGui import ( QApplication, ) +from .window import MainWindow +from .ocrengine import OCREngine + def main(): app = QApplication(sys.argv) @@ -37,9 +42,11 @@ def main(): win = MainWindow() win.show() - from ..page import Page - from ..image import Image - win.pageScene.setPage(Page(Image.fromfile(sys.argv[1]).unframe(10))) + ocr = OCREngine(sys.argv[1:]) + ocr.pageChanged.connect(win.pageScene.setPage) + ocr.unknownLetter.connect(win.unknownLetter) + win.letterEntered.connect(ocr.give_help) + ocr.start() signal.signal(signal.SIGINT, signal.SIG_DFL) sys.exit(app.exec_()) diff --git a/pixelocr/gui/pageview.py b/pixelocr/gui/pageview.py index 3671f1b..d0fe025 100644 --- a/pixelocr/gui/pageview.py +++ b/pixelocr/gui/pageview.py @@ -14,12 +14,17 @@ # along with this program. If not, see . -from PyQt4.QtCore import Qt +from PyQt4.QtCore import ( + signal, + slot, +) + from PyQt4.QtGui import ( QBrush, QColor, QFrame, QGraphicsDropShadowEffect, + QGraphicsItem, QGraphicsScene, QGraphicsView, QImage, @@ -45,11 +50,21 @@ class PageScene(QGraphicsScene): page = None pageItem = None + letterPen = QColor(0, 0, 0, 80) + letterBrush = QColor(255, 255, 0, 80) + spacePen = QColor(0, 0, 0, 80) + spaceBrush = QColor(0, 0, 255, 20) + linePen = QColor(255, 50, 50, 100) + + pageItemChanged = signal([QGraphicsItem]) + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self.highlightedLetters = {} self.setBackgroundBrush(self.palette().window()) def setPage(self, page): + self.highlightedLetters.clear() for item in self.items(): self.remoteItem(item) self.page = page @@ -59,27 +74,36 @@ class PageScene(QGraphicsScene): shadow.setBlurRadius(20) shadow.setOffset(2, 2) self.pageItem.setGraphicsEffect(shadow) + self.pageItemChanged.emit(self.pageItem) - letterPen = QColor(0, 0, 0, 80) - letterBrush = QColor(255, 255, 0, 80) - spacePen = QColor(0, 0, 0, 80) - spaceBrush = QColor(0, 0, 255, 20) - linePen = QColor(255, 50, 50, 100) + def highlightAll(self): for line in page: for letter in line: if not letter.image.isspace: - self.addRect(letter.x - 1, letter.y - 1, letter.width + 1, letter.height + 1, letterPen, letterBrush) + self.addRect(letter.x - 1, letter.y - 1, letter.width + 1, letter.height + 1, self.letterPen, self.letterBrush) else: - self.addRect(letter.x - 1, letter.y - 1, letter.width + 1, letter.height + 1, spacePen, spaceBrush) - self.addLine(line.left, line.baseline, line.right, line.baseline, linePen) + self.addRect(letter.x - 1, letter.y - 1, letter.width + 1, letter.height + 1, self.spacePen, self.spaceBrush) + self.addLine(line.left, line.baseline, line.right, line.baseline, self.linePen) def addPage(self, page): qimage = ndimage2qimage(page.image.data) graphicsitem = self.addPixmap(QPixmap.fromImage(qimage)) return graphicsitem + def highlightLetter(self, letter): + rect = self.addRect(letter.x - 1, letter.y - 1, letter.width + 1, letter.height + 1, self.letterPen, self.letterBrush) + self.highlightedLetters[letter] = rect + + def clearHighlight(self): + for item in self.highlightedLetters.values(): + self.removeItem(item) + self.highlightedLetters.clear() + class PageView(QGraphicsView): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setFrameShape(self.NoFrame) + + def centerOnPage(self, pageItem): + self.centerOn(pageItem) diff --git a/pixelocr/gui/window.py b/pixelocr/gui/window.py index 09ece52..cff172f 100644 --- a/pixelocr/gui/window.py +++ b/pixelocr/gui/window.py @@ -15,6 +15,8 @@ from PyQt4.QtCore import ( + signal, + slot, Qt, QSettings, QSize, @@ -28,9 +30,12 @@ from PyQt4.QtGui import ( ) from .pageview import PageScene, PageView +from .glyphedit import GlyphEdit class MainWindow(QMainWindow): + letterEntered = signal([str]) + def __init__(self): super().__init__() self.setWindowTitle('PixelOCR') @@ -39,10 +44,16 @@ class MainWindow(QMainWindow): self.setCentralWidget(centralWidget) self.pageScene = PageScene(self) self.page = PageView(self.pageScene, centralWidget) + self.pageScene.pageItemChanged.connect(self.page.centerOnPage) + self.glyphEdit = GlyphEdit(centralWidget) + self.glyphEdit.letterEntered.connect(self.letterEntered) + self.glyphEdit.letterEntered.connect(self.pageScene.clearHighlight) layout = QVBoxLayout(centralWidget) - layout.addWidget(self.page) + layout.setSpacing(0) layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(self.page) + layout.addWidget(self.glyphEdit) self.readSettings() @@ -63,3 +74,8 @@ class MainWindow(QMainWindow): self.restoreGeometry(settings.value("windowGeometry") or b'') self.restoreState(settings.value("windowState") or b'') + def unknownLetter(self, letter): + self.pageScene.highlightLetter(letter) + self.glyphEdit.setEnabled(True) + self.glyphEdit.text.clear() + self.glyphEdit.text.setFocus()