Thread: [Pycodeocr-main] SF.net SVN: pycodeocr:[66] branches/redesign
Status: Beta
Brought to you by:
drtrigon
From: <la...@us...> - 2014-08-26 13:08:10
|
Revision: 66 http://sourceforge.net/p/pycodeocr/code/66 Author: laserb Date: 2014-08-26 13:07:59 +0000 (Tue, 26 Aug 2014) Log Message: ----------- Get some basic GUI to work. Modified Paths: -------------- branches/redesign/PyCodeOCR.py branches/redesign/Recognition/ESR.py branches/redesign/Recognition/ImageRecognition.py branches/redesign/gtkGUI/ImagePreview.py branches/redesign/gtkGUI/ProgressBar.py branches/redesign/gtkGUI/__init__.py Removed Paths: ------------- branches/redesign/blacklist branches/redesign/tests/ branches/redesign/utils/checksum.py branches/redesign/utils/ocr.py Modified: branches/redesign/PyCodeOCR.py =================================================================== --- branches/redesign/PyCodeOCR.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/PyCodeOCR.py 2014-08-26 13:07:59 UTC (rev 66) @@ -43,27 +43,80 @@ # @include "./CHANGES" # +import gtk, time import Source import Recognition +import gtkGUI +import threading class PyCodeOCR(object): def __init__(self): - self.sources = Source.Sources() - self.sources.searchScanner() + + srcs = Source.Sources() + srcs.searchScanner() + self.source = srcs.getSources()[0] + + self.win = gtk.Window() + self.win.set_border_width(5) + self.win.set_title('PyCodeOCR') + self.win.connect('delete-event', gtk.main_quit) + + hbox = gtk.HBox() + self.win.add(hbox) + + vboxImage = gtk.VBox() + self.imagePreview = gtkGUI.ImagePreview() + self.progressbar = gtkGUI.ProgressBar(4) + vboxImage.pack_start(self.imagePreview,True,True,0) + vboxImage.pack_end(self.progressbar,False,False,0) + + hbox.add(vboxImage) + + vboxProperties = gtk.VBox() + hbox.add(vboxProperties) + + button = gtk.Button("Scan") + button.connect("pressed",self.on_button_pressed) + vboxProperties.pack_end(button, False, False, 0) + + self.win.show_all() + def __call__(self): - self.runRecognition() + gtk.main() + - def runRecognition(self): - source = self.sources.getSources()[0] - imageRecognition = Recognition.ESR() - imageRecognition.setRotate([180]) + ## Refresh window during running processes. + def refresh(self): + self.win.queue_draw() + time.sleep(0.1) # give also some time to the user... :) + while gtk.events_pending(): + gtk.main_iteration() + + + def on_button_pressed(self, event): + self.imageRecognition = Recognition.ESR() + self.imageRecognition.setRotate([180]) + stdScannerData = Source.StdScannerData() scannerData = stdScannerData.getStdScannerData("180 deg") - runRecognition = Recognition.RunRecognition(source, scannerData, imageRecognition) - (check, msg) = runRecognition() - print msg - + + runRecognition = Recognition.RunRecognition(self.source, scannerData, self.imageRecognition) + runRecognition.connect("updateRecognition", self.onProgressUpdate) + runRecognition.connect("recognized", self.on_recognized) + t = threading.Thread(target=runRecognition) + t.start() + #gtk.threads_enter() + #self.imagePreview.setRecognitionData(esr.getRecognitionData()) + #gtk.threads_leave() + + def on_recognized(self, runRecognition): + self.imagePreview.setRecognitionData(self.imageRecognition.getRecognitionData()) + + def onProgressUpdate(self, runRecognition, message): + self.progressbar.nextProgress(message) + if __name__ == '__main__': + gtk.threads_init() main = PyCodeOCR() main() Modified: branches/redesign/Recognition/ESR.py =================================================================== --- branches/redesign/Recognition/ESR.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/Recognition/ESR.py 2014-08-26 13:07:59 UTC (rev 66) @@ -32,7 +32,7 @@ self.valid_code_len = [ 53, 43, 42, 32 ] # valid code lenghts ## @overwrite verification - def verify(self): + def doVerification(self): # correct for common char recognition errors self.recognitionData.setContent(self.char_correction(self.recognitionData.getContent())) @@ -69,6 +69,11 @@ # @see http://www.bundesbank.de/zahlungsverkehr/zahlungsverkehr_pruefziffernberechnung.php # @return True if checksum is valid, false otherwise def checksum(self, number): + try: + int(number) + except: + return False + tabelle = [0,9,4,6,8,2,7,1,3,5] uebertrag = 0 Modified: branches/redesign/Recognition/ImageRecognition.py =================================================================== --- branches/redesign/Recognition/ImageRecognition.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/Recognition/ImageRecognition.py 2014-08-26 13:07:59 UTC (rev 66) @@ -19,7 +19,8 @@ # @li Modules: utils # -import os, gtk +import os, gtk, threading, gobject +import pyperclip from PIL import Image import utils @@ -31,6 +32,7 @@ self.name = name self.depth = 8 self.rotate = [0,90,90,90] + self.recognitionData = None ## Verify if data is valid. # @pre image acquired and recognized @@ -38,7 +40,9 @@ # @return (boolean, data) True if data is valid, false otherwise # if data is valid return data, otherwise return error message def verify(self): - return (True, "") + (check, msg) = self.doVerification() + self.recognitionData.setValid(check) + return (True, msg) ## get image and associated data # @pre image recognized @@ -89,6 +93,7 @@ self.image = image self.temp_name = "image_object_temp_file" self.content = "" + self.valid = None ## get image # @return image @@ -118,29 +123,35 @@ # @pre image recognized # @param information from image # @post information set - def setContent(self, content): + def setContent(self, content, valid = None): self.content = content + self.valid = valid ## get information associated with image # @return information content def getContent(self): return self.content + def setValid(self, valid): + self.valid = valid + + def isValid(self): + return self.valid + ## save content to clipboard # @pre information set # @post information saved in clipboard def saveClipboard(self): - # get the clipboard - clipboard = gtk.clipboard_get() # set the clipboard text data - clipboard.set_text(self.content) + pyperclip.setcb(self.content) # make our data available to other applications - clipboard.store() + pyperclip.getcb() ## Run the recognition and verify the information -class RunRecognition(object): +class RunRecognition(gobject.GObject): ## init def __init__(self, source, data, imageRecognition): + self.__gobject_init__() self.source = source self.data = data self.imageRecognition = imageRecognition @@ -149,6 +160,7 @@ # @return (boolean, data), True if data is valid, False otherwise # data if the acquired data is image, error-message otherwise def __call__(self): + self.emit("updateRecognition","Get Image ...") image = self.source.getImage(self.data) return self.recognize(image) @@ -157,15 +169,24 @@ # data if the acquired data is image, error message otherwise def recognize(self, image): # do recognition + self.emit("updateRecognition","Recognize image ...") self.imageRecognition.recognizeImage(image) # verify data + self.emit("updateRecognition","Verify data ...") (check, msg) = self.imageRecognition.verify() # if data is valid, save to clipboard and return data + self.emit("recognized") if check: + self.emit("updateRecognition","Data is valid. Save to clipboard.") self.imageRecognition.getRecognitionData().saveClipboard() return (True, self.imageRecognition.getRecognitionData().getContent()) # if data is invalid return error message - return (False, msg) \ No newline at end of file + self.emit("updateRecognition","Data is not valid.") + return (False, msg) + +gobject.type_register(RunRecognition) +gobject.signal_new("recognized", RunRecognition, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()) +gobject.signal_new("updateRecognition", RunRecognition, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_STRING,)) Deleted: branches/redesign/blacklist =================================================================== --- branches/redesign/blacklist 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/blacklist 2014-08-26 13:07:59 UTC (rev 66) @@ -1 +0,0 @@ -Printer Name Modified: branches/redesign/gtkGUI/ImagePreview.py =================================================================== --- branches/redesign/gtkGUI/ImagePreview.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/gtkGUI/ImagePreview.py 2014-08-26 13:07:59 UTC (rev 66) @@ -3,20 +3,29 @@ # PIL/Pillow image library and it's SANE bindings from PIL import Image +import Recognition -class ImagePreview(gtk.Widget): +class ImagePreview(gtk.VBox): def __init__(self): - #Initialize the Widget - gtk.Widget.__init__(self) + #Initialize the VBox + gtk.VBox.__init__(self,False,0) + self.res_color = { True: gtk.gdk.color_parse("#00FF00"), + False: gtk.gdk.color_parse("#FF0000"), + None: gtk.gdk.color_parse("#FFFFFF"), } + # # retrieve widgets # # main_window - main window # ## gladefile raw_path.glade - self.gladefile = raw_path + ".glade" + self.gladefile = "/home/rf/Testing/pycodeocr/gtkGUI/ImagePreview.glade" # open GTKBuilder self.builder = gtk.Builder() self.builder.add_from_file(self.gladefile) # connect signal handlers self.builder.connect_signals(self) + + ## label + self.scanned_code_label = self.builder.get_object('scanned_code_label') + ## event box for image self.main_image_eventbox = self.builder.get_object('main_image_eventbox') ## event box for image window @@ -27,26 +36,37 @@ self.popup_image = self.builder.get_object('popup_image') ## image window self.img_popup = self.builder.get_object('img_popup') + + ## output line + self.output = self.builder.get_object('output') + # connect eventbox to close image window (self.new_width, self.new_height ) = (0,0) - self.main_image.set_tooltip_text("Click for bigger image") - self.popup_image.set_tooltip_text("Leave window to close") + self.main_image.set_tooltip_text("Click for original image") + #self.main_image.connect('expose-event', self.on_image_resize, "") # high cpu usage + self.popup_image.set_tooltip_text("Click to close") - + self.pack_start(self.scanned_code_label,False,False,0) + self.pack_start(self.main_image_eventbox,True,True,0) + self.pack_end(self.output,False,False,0) - def on_eventbox_button_press_event(self, source=None, event=None): + self.show_all() + + def on_popup_image_eventbox_button_press_event(self, source=None, event=None): if self.img_popup.get_visible(): # hide window self.img_popup.hide() + + def on_main_image_eventbox_button_press_event(self, source=None, event=None): + if self.img_popup.get_visible(): + # hide window + self.img_popup.hide() else: - pixbuf = self.image_to_pixbuf(self.image.getImage()) + image = self.recognitionData.getImage() + pixbuf = self.image_to_pixbuf(image) image = gtk.Image() image.set_from_pixbuf(pixbuf) - - scaled_pixbuf = pixbuf.scale_simple(300,300,gtk.gdk.INTERP_BILINEAR) - - # set image - self.popup_image.set_from_pixbuf( scaled_pixbuf ) + self.popup_image.set_from_pixbuf( pixbuf ) # show window self.img_popup.show() @@ -57,25 +77,73 @@ # @see http://www.daniweb.com/code/snippet216637.html # @see http://www.pythonware.com/products/pil/index.htm def setImage(self, image): - self.image = image - pixbuf = self.image_to_pixbuf(self.image.getImage()) + self.recognitionData = Recognition.RecognitionData(image) + self.setImageHelper() + + + def setImageHelper(self): + image = self.recognitionData.getImage() + pixbuf = self.image_to_pixbuf(image) image = gtk.Image() image.set_from_pixbuf(pixbuf) + + self.main_image.set_from_pixbuf( pixbuf ) + self.on_image_resize(self.main_image, "", "") - scaled_pixbuf = pixbuf.scale_simple(150,150,gtk.gdk.INTERP_BILINEAR) + def setOutput(self, output, mode = None): + self.recognitionData.setContent(output, mode) + self.setOutputHelper() + + def setOutputHelper(self): + self.output.set_text(self.recognitionData.getContent()) + mode = self.recognitionData.isValid() + + # widget color + self.output.modify_base(gtk.STATE_NORMAL, self.res_color[mode]) - - self.main_image.set_from_pixbuf( scaled_pixbuf ) + def setRecognitionData(self, recognitionData): + self.recognitionData = recognitionData + self.setImageHelper() + self.setOutputHelper() - - def image_to_pixbuf(self): + # @see http://stackoverflow.com/questions/7906814/converting-pil-image-to-gtk-pixbuf + def image_to_pixbuf(self, image): fd = StringIO.StringIO() - self.image.getImage().save(fd, "ppm") + self.recognitionData.getImage().save(fd, "png") contents = fd.getvalue() fd.close() - loader = gtk.gdk.PixbufLoader("pnm") + loader = gtk.gdk.PixbufLoader("png") loader.write(contents, len(contents)) pixbuf = loader.get_pixbuf() loader.close() return pixbuf + + def on_image_resize(self, widget, event, window): + allocation = widget.get_allocation() + image = self.recognitionData.getImage() + pixbuf = self.image_to_pixbuf(image) + image = gtk.Image() + image.set_from_pixbuf(pixbuf) + + width = pixbuf.get_width() + height = pixbuf.get_height() + if height != allocation.height or width != allocation.width: + # min width and height should be 10px + target_width = max(100,allocation.width) + target_height = max(100,allocation.height) + + # get current width and height + width, height = pixbuf.get_width(), pixbuf.get_height() + + # get scale for width and height + scale_width, scale_height = float(target_width)/width, float(target_height)/height + + # target scale is minimum scale for width and height + scale = min(scale_width,scale_height) + + # scale pixbuf + pixbuf = pixbuf.scale_simple(int(width*scale), int(height*scale), gtk.gdk.INTERP_BILINEAR) + + # set new pixbuf + widget.set_from_pixbuf(pixbuf) \ No newline at end of file Modified: branches/redesign/gtkGUI/ProgressBar.py =================================================================== --- branches/redesign/gtkGUI/ProgressBar.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/gtkGUI/ProgressBar.py 2014-08-26 13:07:59 UTC (rev 66) @@ -1,24 +1,23 @@ import gtk -class ProgressBar(gtk.Widget): +# @see http://bytes.com/topic/python/answers/579827-pygtk-custom-widgets +class ProgressBar(gtk.HBox): def __init__(self,maximum): - gtk.Widget.__init(self) -# # retrieve widgets -# # main_window - main window -# ## gladefile raw_path.glade - self.gladefile = raw_path + ".glade" - # open GTKBuilder - self.builder = gtk.Builder() - self.builder.add_from_file(self.gladefile) - # connect signal handlers - self.builder.connect_signals(self) - ## progressbar - self.progressbar = self.builder.get_object('progressbar') - self.progress = 0 - self.maximum = maximum + gtk.HBox.__init__(self,False,0) + self.maximum = 1.0*maximum + + self.set_border_width(2) + + # progressbar + self.progressbar = gtk.ProgressBar() + self.progress = 0.0 + self.pack_start(self.progressbar,True,True,0) + + self.show_all() def nextProgress(self, message): - self.progress += 1 + if self.progress < self.maximum: + self.progress += 1 self.setProgress(message) def resetProgress(self, message): @@ -28,10 +27,10 @@ def setProgress(self, message): self.progressbar.set_fraction(self.progress/self.maximum) self.progressbar.set_text(message) - self.refresh() +# self.refresh() def setMaximum(self, maximum): - self.maximum = maximum + self.maximum = 1.0*maximum self.progressbar.set_fraction(self.progress/self.maximum) def getMaximum(self): Modified: branches/redesign/gtkGUI/__init__.py =================================================================== --- branches/redesign/gtkGUI/__init__.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/gtkGUI/__init__.py 2014-08-26 13:07:59 UTC (rev 66) @@ -1,3 +1,3 @@ -import ImagePreview -import ProgressBar +from ImagePreview import ImagePreview +from ProgressBar import ProgressBar import ScanProperties \ No newline at end of file Deleted: branches/redesign/utils/checksum.py =================================================================== --- branches/redesign/utils/checksum.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/utils/checksum.py 2014-08-26 13:07:59 UTC (rev 66) @@ -1,47 +0,0 @@ -## -# @file utils/checksum.py -# @namespace utils::checksum -# @authors laserb, drtrigon -# @version 1.1 -# @brief Modulo 10 checksum for e-banking codes. -# -# @test Add unittest to check correct operation of this important module. -# -# $Id$ -# -# @section Description -# -# Modulo 10 checksum for e-banking codes -# - -class modulo10: - # thanks to http://www.hosang.ch/modulo10.aspx - # much more details http://www.sic.ch/de/dl_tkicch_dta.pdf ( page 51 ) - # @see http://www.bundesbank.de/download/zahlungsverkehr/zv_pz201012.pdf - # @see http://www.bundesbank.de/zahlungsverkehr/zahlungsverkehr_pruefziffernberechnung.php - def __init__(self, amount, account, reference): - self.tabelle = [0,9,4,6,8,2,7,1,3,5] - - self.account = account - self.reference = reference - - self.checksum_b = self._checksum(amount) - self.checksum_k = self._checksum(account) - self.checksum_r = self._checksum(reference) - self.checksum = self.checksum_b and self.checksum_k and self.checksum_r - - try: - self.amount = str(int(amount[2:-1])/100.) - except ValueError: - self.amount = amount + " [ERROR!]" - - def _run(self, nr): - self.uebertrag = 0 - # iterate over each character - for i in range(len(nr)): - self.uebertrag = self.tabelle[(self.uebertrag + int(nr[i]) )%10] - - return (10-self.uebertrag)%10 - - def _checksum(self, value): - return (int(value[-1]) == self._run(value[:-1]) ) Deleted: branches/redesign/utils/ocr.py =================================================================== --- branches/redesign/utils/ocr.py 2014-08-24 10:19:30 UTC (rev 65) +++ branches/redesign/utils/ocr.py 2014-08-26 13:07:59 UTC (rev 66) @@ -1,272 +0,0 @@ -# -*- coding: utf-8 -*- -## -# @file utils/ocr.py -# @namespace utils::ocr -# @authors laserb, drtrigon -# @version 1.1 -# @brief Character recogition (OCR) functions and classes. -# -# $Id$ -# -# @section Description -# -# Character recogition (OCR) functions. -# - -# python standard modules -import os, re, sys, subprocess, gobject, threading, gtk -from logging import logging - -# PIL image library and it's SANE bindings -import sane # f12: 'python-imaging-sane' - - -## Character correction after recogition (on basis that there should be numbers and few special chars). -# -# @test Add unittest to check correct operation of this important module/function. -# -def char_correction(data): - data = re.sub("\n", "", data) - print data - corrections = [ - # Zero - ("O", "0"), ("D", "0"), ("U", "0"), ("Q", "0"), ("\(\)", "0"), ("G", "0"), ("o", "0"), - # Two - ("Z", "2"), - # Three - ("\?>", "3"), - # Four - ("l\.", "4"), ("A", "4"), ("l»", "4"), ("h", "4"), ("i»", "4"), ("l\xe2\x80\xa2", "4"), ("&", "4"), ("l\+", "4"), - # Five - ("S", "5"), - # Six - ("c>", "6"), - # Seven - #("\?", "7"), - # One (critical, therefore done as last; has also Overlapps e.g. with Four) - (chr(226)+chr(128)+chr(153)+"I", "1"), - (chr(226)+chr(128)+chr(153)+"\|", "1"), - (chr(226)+chr(128)+chr(152)+"\|", "1"), - (chr(226)+chr(128)+chr(152)+"I", "1"), - (chr(39)+"I", "1"), - ("I", "1"), - (chr(153)+"l", "1"), - (chr(39)+"l", "1"), - ("l", "1"), - (chr(39)+"!", "1"), - (chr(39)+"\|", "1"), - ("'\|", "1"), - ("\|", "1"), - ("'\]", "1"), - ("'\}", "1"), - (r'\\', "1"), - # non-numbers - (" ", ""), - ("\xe2", ""), - ("\x80", ""), - ("\xbb", ""), - ("\x99", ""), - ("\x98", ""), - ("\x5f", ""), - ("\x60", ""), - ("'", ""), - #('\xbb', 187)('\x99', 153)('\x98', 152) - ("\+", "+ "), - ("\)", ">"), - ("\x92", "1"), # post correction - ] - for item in corrections: - olddata = data - data = re.sub(item[0], item[1], data) - if not (data == olddata): print 'subst: "%s" => "%s"' % (item[0], item[1]) - - return data - -## SANE/PIL interface python wrapper/bindings. -class RunSANE(threading.Thread): - # "scanimage --format=tif --resolution 300 --mode Gray > %s.tif" - # "scanimage --format=tif --resolution 600 --mode Gray -t 82 -y 20 -l 60 -x 155.9 > %s.tif" - #cmd_scan = "scanimage --format=tif --resolution 600 --mode Gray -t %d -l %d -y %d -x %d > %s.tif" - - resolution = 600 - - ## Init of sane interface -> device. - def __init__(self, notebook, progress, device_chooser_button, BlacklistMgr,device_chooser_event,device_info_text): - print "init sane python interface ..." - self.device_chooser_event = device_chooser_event - self.notebook = notebook - self.progress = progress - self.device_chooser_button = device_chooser_button - self.BlacklistMgr = BlacklistMgr - self.device_info_text = device_info_text - - threading.Thread.__init__(self) - - def run(self): - - # get blacklist - self.blacklist = self.BlacklistMgr.read_blacklist() - - # init SANE - self.n = 4. - self.progress(0.,"init sane python interface ...") - try: - self.version = sane.init() - self.progress(1./self.n,"init sane python interface ... search devices") - # get sane devices - self.devices = sane.get_devices() - - # filter blacklisted devices - if len(self.devices) > 0 : - self.devices = self.BlacklistMgr.filter_devices(self.devices) - - # check how many devices we found - if len(self.devices) == 0: - self.progress(0./self.n,"No device found.") - self.device_chooser_button.set_visible(False) - self.found_scanner = False - gtk.gdk.threads_leave() - return - elif len(self.devices) > 1: - # simply continue and select device in GUI ( see init_sane ) - self.progress(2./self.n,"More than one device found.") - self.device_chooser_button.set_visible(True) - self.notebook.set_show_tabs(False) - self.found_scanner = None - self.BlacklistMgr.device_treeview.set_cursor(0) - - # show tab with device list - # choose device and press ok to initialize scanner - self.notebook.set_current_page(2) - - - gtk.gdk.threads_leave() - self.device_chooser_event.wait() - - # show main tab again - self.notebook.set_show_tabs(True) - self.notebook.set_current_page(0) - - # get selection from treeview - self.devnr = self.BlacklistMgr.device_treeview.get_cursor()[0][0] - - else: - # only one device found, continue - self.progress(2./self.n,"Device: %s" % self.devices[0][1]+" "+self.devices[0][2]) - self.device_chooser_button.set_visible(False) - self.devnr = 0 - - except: - # No device found at all - self.found_scanner = False - self.device_chooser_button.set_visible(False) - print "No sane device found. Retry again." - self.progress(0./self.n,"No sane device found. Retry again.") - gtk.gdk.threads_leave() - return - - - ## Init of sane interface -> scanner - print "Use device number: "+str(self.devnr) - try: - # finish init device - self.dev = self.devices[self.devnr][0] # choose device - print "%s" % self.dev - self.progress(3./self.n,"Device initialized. Open scanner...") - - # open scanner device - self.scanner = sane.open(self.dev) - self.params = self.scanner.get_parameters() - self.opts = self.scanner.get_options() - - self.found_scanner = True - - self.progress(4./self.n,"Ready: %s" % self.devices[self.devnr][1]+" "+self.devices[self.devnr][2]) -# self.info() - self.device_chooser_button.set_visible(False) - print "done." - - except: - # init scanner failed. maybe device has no scanner - self.found_scanner = False - print "Loading sane device failed. Retry again." - self.progress(0./self.n,"Loading sane device failed. Retry again.") - gtk.gdk.threads_leave() - - - self.info() - gtk.gdk.threads_leave() - - - ## Not init of sane and scanner, but of scan operation. - def post_init(self, coords, out_filename): - self.coords = coords - self.out_filename = out_filename - #self.info() - - ## call - def __call__(self): - (self.error, self.stdout, self.stderr) = self._run() - return self.error - - ## Scan and save the PIL image object to file. - # @see http://mail.python.org/pipermail/image-sig/1997-June/000307.html - # @see http://sane-pygtk.sourceforge.net/) - def _run(self): - try: - # Set scan parameters (also with higher resolution!) - (t, l, y, x) = self.coords - self.scanner.tl_y = float(t) - self.scanner.tl_x = float(l) - self.scanner.br_y = (float(y) + self.scanner.tl_y) - self.scanner.br_x = (float(x) + self.scanner.tl_x) - self.scanner.resolution = self.resolution - self.scanner.mode = "Gray" - - # Initiate the scan - self.scanner.start() - - # Get an Image object containing the scanned image - im = self.scanner.snap() - - # Write the image out as a TIFF file (or whatever) - im.save(self.out_filename) - - #self.scanner.stop() - except: - return (True, "error", sys.exc_info()[1]) - - return (False, "ok", "") - - ## Show some info about the scanner and SANE. - def info(self): - entrybuffer = self.device_info_text.get_buffer() - entrybuffer.delete(entrybuffer.get_start_iter(),entrybuffer.get_end_iter()) - # redirect print to device textbuffer - logdev = logging(entrybuffer) - sys.stdout = logdev - - print 'SANE version: %s' % repr(self.version).replace('array',' ') - print "\n" - print 'Available devices:' - for device in self.devices: - print device[1]+" "+device[2] - print "\n" - print 'Selected device: '+self.devices[self.devnr][1]+" "+self.devices[self.devnr][2] - print "\n" - print 'SaneDev object= %s' % self.scanner - print "\n" - print 'Device parameters: %s' % repr(self.params).replace('array',' ') - print "\n" - print 'Device options:' - for opt in self.opts: - print "%s: %s" % (opt[2], opt[3]) - - - def retry(self): - try: - self.scanner.close() - except: - pass - sane.exit() - self.run() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2014-08-26 18:12:07
|
Revision: 67 http://sourceforge.net/p/pycodeocr/code/67 Author: laserb Date: 2014-08-26 18:12:03 +0000 (Tue, 26 Aug 2014) Log Message: ----------- Add source and recognition selection. Modified Paths: -------------- branches/redesign/PyCodeOCR.py branches/redesign/Recognition/Barcode.py branches/redesign/Recognition/DTMX.py branches/redesign/Recognition/DataMatrix.py branches/redesign/Recognition/ESR.py branches/redesign/Recognition/ImageRecognition.py branches/redesign/Recognition/PDF417.py branches/redesign/Source/File.py branches/redesign/Source/Scanner.py branches/redesign/Source/SourceBase.py branches/redesign/Source/__init__.py branches/redesign/gtkGUI/__init__.py Modified: branches/redesign/PyCodeOCR.py =================================================================== --- branches/redesign/PyCodeOCR.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/PyCodeOCR.py 2014-08-26 18:12:03 UTC (rev 67) @@ -52,10 +52,6 @@ class PyCodeOCR(object): def __init__(self): - srcs = Source.Sources() - srcs.searchScanner() - self.source = srcs.getSources()[0] - self.win = gtk.Window() self.win.set_border_width(5) self.win.set_title('PyCodeOCR') @@ -76,6 +72,20 @@ vboxProperties = gtk.VBox() hbox.add(vboxProperties) + sourceFrame = gtk.Frame("Source") + sourceVBox = gtk.VBox() + sourceFrame.add(sourceVBox) + self.sourceChooser = gtkGUI.Chooser(Source, ["SourceBase","ScannerData","StdScannerData"]) + sourceVBox.pack_start(self.sourceChooser,False,False,0) + vboxProperties.pack_start(sourceFrame, True,True,0) + + recognitionFrame = gtk.Frame("Recognition") + recognitionVBox = gtk.VBox() + recognitionFrame.add(recognitionVBox) + self.recognitionChooser = gtkGUI.Chooser(Recognition, ["ImageRecognition","ImageRecognitionBase","RecognitionData","RunRecognition"]) + recognitionVBox.pack_start(self.recognitionChooser,False,False,0) + vboxProperties.pack_start(recognitionFrame, True,True,0) + button = gtk.Button("Scan") button.connect("pressed",self.on_button_pressed) vboxProperties.pack_end(button, False, False, 0) @@ -95,21 +105,25 @@ def on_button_pressed(self, event): - self.imageRecognition = Recognition.ESR() + # get image recognition and initialize + self.imageRecognition = self.recognitionChooser.getSelection() + option = self.recognitionChooser.getOption() self.imageRecognition.setRotate([180]) + # get source and initialize + self.source = self.sourceChooser.getSelection() + self.source.setAddress(self.source.scanners[0][0]) stdScannerData = Source.StdScannerData() scannerData = stdScannerData.getStdScannerData("180 deg") + # run recognition runRecognition = Recognition.RunRecognition(self.source, scannerData, self.imageRecognition) runRecognition.connect("updateRecognition", self.onProgressUpdate) runRecognition.connect("recognized", self.on_recognized) t = threading.Thread(target=runRecognition) t.start() - #gtk.threads_enter() - #self.imagePreview.setRecognitionData(esr.getRecognitionData()) - #gtk.threads_leave() + def on_recognized(self, runRecognition): self.imagePreview.setRecognitionData(self.imageRecognition.getRecognitionData()) Modified: branches/redesign/Recognition/Barcode.py =================================================================== --- branches/redesign/Recognition/Barcode.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/Recognition/Barcode.py 2014-08-26 18:12:03 UTC (rev 67) @@ -2,7 +2,7 @@ class Barcode(ImageRecognition.ImageRecognitionBase): def __init__(self): - super(Barcode,self).__init("Barcode") + super(Barcode,self).__init__("Barcode") def verify(self): data = self.content.getContent() Modified: branches/redesign/Recognition/DTMX.py =================================================================== --- branches/redesign/Recognition/DTMX.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/Recognition/DTMX.py 2014-08-26 18:12:03 UTC (rev 67) @@ -2,7 +2,7 @@ class DTMX(ImageRecognition.ImageRecognitionBase): def __init__(self): - super(DTMX,self).__init("DTMX") + super(DTMX,self).__init__("DTMX") def verify(self): pass Modified: branches/redesign/Recognition/DataMatrix.py =================================================================== --- branches/redesign/Recognition/DataMatrix.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/Recognition/DataMatrix.py 2014-08-26 18:12:03 UTC (rev 67) @@ -2,7 +2,7 @@ class DataMatrix(ImageRecognition.ImageRecognitionBase): def __init__(self): - super(DataMatrix,self).__init("DataMatrix") + super(DataMatrix,self).__init__("DataMatrix") def verify(self): return True Modified: branches/redesign/Recognition/ESR.py =================================================================== --- branches/redesign/Recognition/ESR.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/Recognition/ESR.py 2014-08-26 18:12:03 UTC (rev 67) @@ -21,7 +21,7 @@ from Recognition import ImageRecognition import utils -import re, os +import re, os, gtk ## Extract information from ESR class ESR(ImageRecognition.ImageRecognitionBase): @@ -126,6 +126,9 @@ # return the data return self.recognitionData.getContent() + def activated(self): + return ["0 deg", "90 deg", "180 deg", "270 deg"] + ## Character correction after recogition (on basis that there should be numbers and few special chars). # # @test Add unittest to check correct operation of this important module/function. Modified: branches/redesign/Recognition/ImageRecognition.py =================================================================== --- branches/redesign/Recognition/ImageRecognition.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/Recognition/ImageRecognition.py 2014-08-26 18:12:03 UTC (rev 67) @@ -60,6 +60,9 @@ self.recognitionData = recognitionData return self.recognitionData.getContent() + def activated(self): + print "is activated" + ## get name # @return name def getName(self): Modified: branches/redesign/Recognition/PDF417.py =================================================================== --- branches/redesign/Recognition/PDF417.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/Recognition/PDF417.py 2014-08-26 18:12:03 UTC (rev 67) @@ -2,7 +2,7 @@ class PDF417(ImageRecognition.ImageRecognitionBase): def __init__(self): - super(PDF417,self).__init("PDF417") + super(PDF417,self).__init__("PDF417") def verify(self): return (True, "") Modified: branches/redesign/Source/File.py =================================================================== --- branches/redesign/Source/File.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/Source/File.py 2014-08-26 18:12:03 UTC (rev 67) @@ -23,8 +23,8 @@ from PIL import Image class File(SourceBase): - def __init__(self,address, name, typename): - super(File,self).__init__(address, name, typename) + def __init__(self): + super(File,self).__init__() ## get a new image from file # @return image Modified: branches/redesign/Source/Scanner.py =================================================================== --- branches/redesign/Source/Scanner.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/Source/Scanner.py 2014-08-26 18:12:03 UTC (rev 67) @@ -25,25 +25,32 @@ class Scanner(SourceBase): ## init - def __init__(self, dev): - super(Scanner,self).__init__(dev[0],dev[1],dev[3]) - - # open scanner - self.scanner=sane.open(self.address) - - # get parameters from scanner - parameters = self.scanner.get_parameters() - for i in range(len(parameters)): - self.addParameter(str(i), parameters[i]) + def __init__(self): + super(Scanner,self).__init__() + self.scanners = [] + self.searchScanner() +# +# # open scanner +# self.scanner = sane.open(self.address) +# +# # get parameters from scanner +# parameters = self.scanner.get_parameters() +# for i in range(len(parameters)): +# self.addParameter(str(i), parameters[i]) +# +# # get options from options +# options = self.scanner.get_options() +# for option in options: +# self.addOption(option[1], option) +# +# # close scanner +# self.scanner.close() + + + def searchScanner(self): + sane.init() + self.scanners = sane.get_devices() - # get options from options - options = self.scanner.get_options() - for option in options: - self.addOption(option[1], option) - - # close scanner - self.scanner.close() - ## get a new image from a sane device # @param size and position of the image # @return image @@ -87,6 +94,12 @@ self.scanner.close() return sys.exc_info()[1] + + def activated(self): + scanner_names = [] + for scanner in self.scanners: + scanner_names.append(scanner[1]) + return scanner_names ## Modified: branches/redesign/Source/SourceBase.py =================================================================== --- branches/redesign/Source/SourceBase.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/Source/SourceBase.py 2014-08-26 18:12:03 UTC (rev 67) @@ -21,18 +21,47 @@ class SourceBase(object): ## init - def __init__(self,address, name, typename): - self.address = address - self.name = name - self.type = typename + def __init__(self): + self.address = "" + self.name = "" + self.type = "" self.parameters = {} self.options = {} + ## get a new image + # @param additional data required to get the image + # @return image + def getImage(self,data = None): + image = "" + return image + + def activated(self): + print "is activated" + ## return name of source # @return name def getName(self): return self.name + def setName(self, name): + self.name = name + + ## return address of source + # @return address + def getAddress(self): + return self.address + + def setAddress(self, address): + self.address = address + + ## return type of source + # @return type + def getType(self): + return self.type + + def setType(self, typename): + self.type = typename + ## set parameters for source # @param parameters dictionary # @post parameters set @@ -79,16 +108,6 @@ def getOption(self, optionName): return self.options[optionName] - ## return address of source - # @return address - def getAddress(self): - return self.address - - ## return type of source - # @return type - def getType(self): - return self.type - ## test if two sources are equal # two sources are equal, if address, name and type are equal # @param another source @@ -102,13 +121,6 @@ return False return True - ## get a new image - # @param additional data required to get the image - # @return image - def getImage(self,data = None): - image = "" - return image - ## print some info to the source # def printInfo(self): Modified: branches/redesign/Source/__init__.py =================================================================== --- branches/redesign/Source/__init__.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/Source/__init__.py 2014-08-26 18:12:03 UTC (rev 67) @@ -3,4 +3,3 @@ from Source.Scanner import StdScannerData from Source.SourceBase import SourceBase from Source.File import File -from Source.Sources import Sources Modified: branches/redesign/gtkGUI/__init__.py =================================================================== --- branches/redesign/gtkGUI/__init__.py 2014-08-26 13:07:59 UTC (rev 66) +++ branches/redesign/gtkGUI/__init__.py 2014-08-26 18:12:03 UTC (rev 67) @@ -1,3 +1,4 @@ from ImagePreview import ImagePreview from ProgressBar import ProgressBar +from Chooser import Chooser import ScanProperties \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2014-08-27 06:55:59
|
Revision: 68 http://sourceforge.net/p/pycodeocr/code/68 Author: laserb Date: 2014-08-27 06:55:49 +0000 (Wed, 27 Aug 2014) Log Message: ----------- Add options for source and recognition. Modified Paths: -------------- branches/redesign/PyCodeOCR.py branches/redesign/Recognition/ESR.py branches/redesign/Recognition/ImageRecognition.py branches/redesign/Recognition/__init__.py branches/redesign/Source/File.py branches/redesign/Source/Scanner.py branches/redesign/Source/SourceBase.py branches/redesign/gtkGUI/ImagePreview.py Modified: branches/redesign/PyCodeOCR.py =================================================================== --- branches/redesign/PyCodeOCR.py 2014-08-26 18:12:03 UTC (rev 67) +++ branches/redesign/PyCodeOCR.py 2014-08-27 06:55:49 UTC (rev 68) @@ -107,17 +107,15 @@ def on_button_pressed(self, event): # get image recognition and initialize self.imageRecognition = self.recognitionChooser.getSelection() - option = self.recognitionChooser.getOption() - self.imageRecognition.setRotate([180]) + recognitionProperties = self.recognitionChooser.getProperties() # get source and initialize self.source = self.sourceChooser.getSelection() - self.source.setAddress(self.source.scanners[0][0]) - stdScannerData = Source.StdScannerData() - scannerData = stdScannerData.getStdScannerData("180 deg") + sourceProperties = self.sourceChooser.getProperties() # run recognition - runRecognition = Recognition.RunRecognition(self.source, scannerData, self.imageRecognition) + self.progressbar.resetProgress("") + runRecognition = Recognition.RunRecognition(self.source, sourceProperties, self.imageRecognition, recognitionProperties) runRecognition.connect("updateRecognition", self.onProgressUpdate) runRecognition.connect("recognized", self.on_recognized) t = threading.Thread(target=runRecognition) Modified: branches/redesign/Recognition/ESR.py =================================================================== --- branches/redesign/Recognition/ESR.py 2014-08-26 18:12:03 UTC (rev 67) +++ branches/redesign/Recognition/ESR.py 2014-08-27 06:55:49 UTC (rev 68) @@ -87,12 +87,9 @@ return str(uebertrag) == number[-1] # @overwrite recognizeImage - def recognizeImage(self, image, rotate = None): - super(ESR,self).recognizeImage(image) - - # if no rotation is set, use default: [0, 90, 90, 90] - if rotate == None: - rotate = self.rotate + def recognizeImage(self, image, recognitionProperties): + rotate = self.rotate + super(ESR,self).recognizeImage(image, recognitionProperties) # try all rotation and test if data is valid for angle in rotate: @@ -126,9 +123,6 @@ # return the data return self.recognitionData.getContent() - def activated(self): - return ["0 deg", "90 deg", "180 deg", "270 deg"] - ## Character correction after recogition (on basis that there should be numbers and few special chars). # # @test Add unittest to check correct operation of this important module/function. Modified: branches/redesign/Recognition/ImageRecognition.py =================================================================== --- branches/redesign/Recognition/ImageRecognition.py 2014-08-26 18:12:03 UTC (rev 67) +++ branches/redesign/Recognition/ImageRecognition.py 2014-08-27 06:55:49 UTC (rev 68) @@ -33,7 +33,7 @@ self.depth = 8 self.rotate = [0,90,90,90] self.recognitionData = None - + ## Verify if data is valid. # @pre image acquired and recognized # @post information extracted @@ -42,7 +42,7 @@ def verify(self): (check, msg) = self.doVerification() self.recognitionData.setValid(check) - return (True, msg) + return (check, msg) ## get image and associated data # @pre image recognized @@ -55,13 +55,13 @@ # @param image # @post information is extracted # @return extracted information - def recognizeImage(self,image): + def recognizeImage(self,image, recognitionProperties): recognitionData = RecognitionData(image) self.recognitionData = recognitionData return self.recognitionData.getContent() def activated(self): - print "is activated" + return [] ## get name # @return name @@ -153,10 +153,11 @@ ## Run the recognition and verify the information class RunRecognition(gobject.GObject): ## init - def __init__(self, source, data, imageRecognition): + def __init__(self, source, sourceProperties, imageRecognition, recognitionProperties): self.__gobject_init__() self.source = source - self.data = data + self.sourceProperties = sourceProperties + self.recognitionProperties = recognitionProperties self.imageRecognition = imageRecognition ## call @@ -164,7 +165,7 @@ # data if the acquired data is image, error-message otherwise def __call__(self): self.emit("updateRecognition","Get Image ...") - image = self.source.getImage(self.data) + image = self.source.getImage(self.sourceProperties) return self.recognize(image) ## recognize image @@ -173,7 +174,7 @@ def recognize(self, image): # do recognition self.emit("updateRecognition","Recognize image ...") - self.imageRecognition.recognizeImage(image) + self.imageRecognition.recognizeImage(image, self.recognitionProperties) # verify data self.emit("updateRecognition","Verify data ...") @@ -187,7 +188,7 @@ return (True, self.imageRecognition.getRecognitionData().getContent()) # if data is invalid return error message - self.emit("updateRecognition","Data is not valid.") + self.emit("updateRecognition","Data is not valid. "+msg) return (False, msg) gobject.type_register(RunRecognition) Modified: branches/redesign/Recognition/__init__.py =================================================================== --- branches/redesign/Recognition/__init__.py 2014-08-26 18:12:03 UTC (rev 67) +++ branches/redesign/Recognition/__init__.py 2014-08-27 06:55:49 UTC (rev 68) @@ -1,5 +1,3 @@ -from Recognition.ImageRecognition import ImageRecognitionBase -from Recognition.ImageRecognition import RecognitionData from Recognition.ImageRecognition import RunRecognition from Recognition.Barcode import Barcode from Recognition.DataMatrix import DataMatrix Modified: branches/redesign/Source/File.py =================================================================== --- branches/redesign/Source/File.py 2014-08-26 18:12:03 UTC (rev 67) +++ branches/redesign/Source/File.py 2014-08-27 06:55:49 UTC (rev 68) @@ -28,5 +28,9 @@ ## get a new image from file # @return image - def getImage(self,data = None): + def getImage(self, data): + self.address = data[0] return Image.open(self.address) + + def activated(self): + return [["Filechooser",[]]] Modified: branches/redesign/Source/Scanner.py =================================================================== --- branches/redesign/Source/Scanner.py 2014-08-26 18:12:03 UTC (rev 67) +++ branches/redesign/Source/Scanner.py 2014-08-27 06:55:49 UTC (rev 68) @@ -50,18 +50,22 @@ def searchScanner(self): sane.init() self.scanners = sane.get_devices() + + def getScanner(self,name): + for scanner in self.scanners: + if scanner[1] == name: + return scanner[0] + return None ## get a new image from a sane device # @param size and position of the image # @return image - def getImage(self,scannerData = None): - # if no data is given use predefined default. - if not scannerData: - stdScannerData = StdScannerData() - scannerData = stdScannerData.getStdScannerData("default") + def getImage(self, properties): + name = properties[0] + scannerData = properties[1] # open scanner - self.scanner=sane.open(self.address) + self.scanner=sane.open(self.getScanner(name)) # get an image, return an error if it failed try: @@ -95,11 +99,12 @@ return sys.exc_info()[1] + def activated(self): scanner_names = [] for scanner in self.scanners: scanner_names.append(scanner[1]) - return scanner_names + return [["ListChooser",scanner_names],["Coordinates",["Bottom", "Left", "Top", "Right"]]] ## @@ -120,6 +125,7 @@ self.size = [100,100] self.color = 'gray' self.resolution = 600 + self.rotation = 0 ## get name # @return name @@ -169,6 +175,12 @@ # @return resolution def getResolution(self): return self.resolution + + def setRotation(self, rotation): + self.rotation = rotation + + def getRotation(self): + return self.rotation ## @@ -184,7 +196,7 @@ # init def __init__(self): ## default scanning coordinates - self.stdScannerData = [ScannerData("default"),ScannerData("0 deg"),ScannerData("90 deg"),ScannerData("180 deg"),ScannerData("270 deg"),ScannerData("A4")] + self.stdScannerData = [ScannerData("default"),ScannerData("Bottom"),ScannerData("Left"),ScannerData("Top"),ScannerData("Right"),ScannerData("A4")] self.setInitialParameters() ## Generate a set of default scanning properties @@ -192,14 +204,17 @@ def setInitialParameters(self): self.getStdScannerData("default").setPosition(60,82) self.getStdScannerData("default").setSize(155,20) - self.getStdScannerData("0 deg").setPosition(60,82) - self.getStdScannerData("0 deg").setSize(155,20) - self.getStdScannerData("90 deg").setPosition(82,1) - self.getStdScannerData("90 deg").setSize(20,150) - self.getStdScannerData("180 deg").setPosition(1,3) - self.getStdScannerData("180 deg").setSize(150,20) - self.getStdScannerData("270 deg").setPosition(3,60) - self.getStdScannerData("270 deg").setSize(20,150) + self.getStdScannerData("Bottom").setPosition(60,82) + self.getStdScannerData("Bottom").setSize(155,20) + self.getStdScannerData("Left").setPosition(82,1) + self.getStdScannerData("Left").setSize(20,150) + self.getStdScannerData("Left").setRotation(90) + self.getStdScannerData("Top").setPosition(1,3) + self.getStdScannerData("Top").setSize(150,20) + self.getStdScannerData("Top").setRotation(180) + self.getStdScannerData("Right").setPosition(3,60) + self.getStdScannerData("Right").setSize(20,150) + self.getStdScannerData("Right").setRotation(270) # scan whole range (A4: http://www.cl.cam.ac.uk/~mgk25/iso-paper.html) self.getStdScannerData("A4").setPosition(0,0) self.getStdScannerData("A4").setSize(215,296) Modified: branches/redesign/Source/SourceBase.py =================================================================== --- branches/redesign/Source/SourceBase.py 2014-08-26 18:12:03 UTC (rev 67) +++ branches/redesign/Source/SourceBase.py 2014-08-27 06:55:49 UTC (rev 68) @@ -36,7 +36,7 @@ return image def activated(self): - print "is activated" + return [] ## return name of source # @return name Modified: branches/redesign/gtkGUI/ImagePreview.py =================================================================== --- branches/redesign/gtkGUI/ImagePreview.py 2014-08-26 18:12:03 UTC (rev 67) +++ branches/redesign/gtkGUI/ImagePreview.py 2014-08-27 06:55:49 UTC (rev 68) @@ -86,6 +86,24 @@ pixbuf = self.image_to_pixbuf(image) image = gtk.Image() image.set_from_pixbuf(pixbuf) + + width = pixbuf.get_width() + height = pixbuf.get_height() + + target_width = 300 + target_height = 50 + + # get current width and height + width, height = pixbuf.get_width(), pixbuf.get_height() + + # get scale for width and height + scale_width, scale_height = float(target_width)/width, float(target_height)/height + + # target scale is minimum scale for width and height + scale = min(scale_width,scale_height) + + # scale pixbuf + pixbuf = pixbuf.scale_simple(int(width*scale), int(height*scale), gtk.gdk.INTERP_BILINEAR) self.main_image.set_from_pixbuf( pixbuf ) self.on_image_resize(self.main_image, "", "") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2014-08-28 14:37:11
|
Revision: 69 http://sourceforge.net/p/pycodeocr/code/69 Author: laserb Date: 2014-08-28 14:37:06 +0000 (Thu, 28 Aug 2014) Log Message: ----------- Add possibility to have more than one output. Modified Paths: -------------- branches/redesign/Recognition/ESR.py branches/redesign/Recognition/ImageRecognition.py branches/redesign/gtkGUI/ImagePreview.py Modified: branches/redesign/Recognition/ESR.py =================================================================== --- branches/redesign/Recognition/ESR.py 2014-08-27 06:55:49 UTC (rev 68) +++ branches/redesign/Recognition/ESR.py 2014-08-28 14:37:06 UTC (rev 69) @@ -33,25 +33,22 @@ ## @overwrite verification def doVerification(self): - # correct for common char recognition errors - self.recognitionData.setContent(self.char_correction(self.recognitionData.getContent())) - # get data data = self.recognitionData.getContent() + code = data[0][1] + # correct for common char recognition errors + code = self.char_correction(code) + + # check for invalid characters - check = (not "?" in data) or (not "!" in data) # any unrecognized char in code? - check = check and ( len(data) in self.valid_code_len ) # correct code len? + check = (not "?" in code) or (not "!" in code) # any unrecognized char in code? + check = check and ( len(code) in self.valid_code_len ) # correct code len? if not check: return (False, "Invalid length or invalid characters") - # extract amount, reference and account from codeline - tmp = data[:-1].split(">") - amount = tmp[0] - tmp = tmp[1].split("+ ") - reference = tmp[0] - account = tmp[1] - + (amount, reference, account) = self.split(code) + # do checksum for amount, reference and account if not self.checksum(amount): return (False, "Checksum for amount failed.") @@ -60,9 +57,27 @@ if not self.checksum(account): return (False, "Checksum for account failed.") + # save data in split form + account = account[0:2]+"-"+account[2:-1]+"-"+account[-1] + amount = str(float(amount[2:-1])/100) + self.setContent(code, account, amount, reference) + # return true if all checks are positive return (True, "") + def split(self, data): + try: + # extract amount, reference and account from codeline + tmp = data[:-1].split(">") + amount = tmp[0] + tmp = tmp[1].split("+ ") + reference = tmp[0] + account = tmp[1] + return (amount, reference, account) + except: + return ("","","") + + # thanks to http://www.hosang.ch/modulo10.aspx # much more details http://www.sic.ch/de/dl_tkicch_dta.pdf ( page 51 ) # @see http://www.bundesbank.de/download/zahlungsverkehr/zv_pz201012.pdf @@ -112,8 +127,10 @@ os.remove(self.temp_name + "tesseract.txt") # clean-up os.remove(self.temp_name + ".png") # clean-up + # set content - self.recognitionData.setContent(data) + (amount, reference, account) = self.split(data) + self.setContent(data, account, amount, reference) # check if data is valid (check, msg) = self.verify() @@ -123,6 +140,11 @@ # return the data return self.recognitionData.getContent() + def setContent(self, all, account, amount, reference): + data = [["All",all],["Account",account],["Amount",amount],["Reference",reference]] + self.recognitionData.setContent(data) + + ## Character correction after recogition (on basis that there should be numbers and few special chars). # # @test Add unittest to check correct operation of this important module/function. Modified: branches/redesign/Recognition/ImageRecognition.py =================================================================== --- branches/redesign/Recognition/ImageRecognition.py 2014-08-27 06:55:49 UTC (rev 68) +++ branches/redesign/Recognition/ImageRecognition.py 2014-08-28 14:37:06 UTC (rev 69) @@ -95,7 +95,7 @@ def __init__(self, image): self.image = image self.temp_name = "image_object_temp_file" - self.content = "" + self.content = [] self.valid = None ## get image @@ -135,6 +135,15 @@ def getContent(self): return self.content + def getContentString(self): + if isinstance(self.content, list): + content = "" + for i in len(self.content): + content += " "+str(self.content[i][1]) + return content + return self.content + + def setValid(self, valid): self.valid = valid @@ -144,11 +153,18 @@ ## save content to clipboard # @pre information set # @post information saved in clipboard - def saveClipboard(self): - # set the clipboard text data - pyperclip.setcb(self.content) - # make our data available to other applications - pyperclip.getcb() + def saveClipboard(self): + if isinstance(self.content, list): + for content in self.content: + # set the clipboard text data + pyperclip.setcb(content[1]) + # make our data available to other applications + pyperclip.getcb() + else: + # set the clipboard text data + pyperclip.setcb(self.content) + # make our data available to other applications + pyperclip.getcb() ## Run the recognition and verify the information class RunRecognition(gobject.GObject): @@ -183,7 +199,7 @@ # if data is valid, save to clipboard and return data self.emit("recognized") if check: - self.emit("updateRecognition","Data is valid. Save to clipboard.") + self.emit("updateRecognition","Data is valid. Click to save to clipboard.") self.imageRecognition.getRecognitionData().saveClipboard() return (True, self.imageRecognition.getRecognitionData().getContent()) Modified: branches/redesign/gtkGUI/ImagePreview.py =================================================================== --- branches/redesign/gtkGUI/ImagePreview.py 2014-08-27 06:55:49 UTC (rev 68) +++ branches/redesign/gtkGUI/ImagePreview.py 2014-08-28 14:37:06 UTC (rev 69) @@ -1,4 +1,4 @@ -import gtk, os +import gtk, os, pyperclip, pango import StringIO # PIL/Pillow image library and it's SANE bindings @@ -9,8 +9,10 @@ def __init__(self): #Initialize the VBox gtk.VBox.__init__(self,False,0) - self.res_color = { True: gtk.gdk.color_parse("#00FF00"), - False: gtk.gdk.color_parse("#FF0000"), + self.recognitionData = None + + self.res_color = { True: gtk.gdk.color_parse("#006600"), + False: gtk.gdk.color_parse("#660000"), None: gtk.gdk.color_parse("#FFFFFF"), } # # retrieve widgets @@ -38,12 +40,12 @@ self.img_popup = self.builder.get_object('img_popup') ## output line - self.output = self.builder.get_object('output') + self.output = Output() # connect eventbox to close image window (self.new_width, self.new_height ) = (0,0) self.main_image.set_tooltip_text("Click for original image") - #self.main_image.connect('expose-event', self.on_image_resize, "") # high cpu usage + #self.main_image.connect('motion-notify-event', self.on_image_resize, "") # high cpu usage self.popup_image.set_tooltip_text("Click to close") self.pack_start(self.scanned_code_label,False,False,0) @@ -113,11 +115,13 @@ self.setOutputHelper() def setOutputHelper(self): - self.output.set_text(self.recognitionData.getContent()) + content = self.recognitionData.getContent() mode = self.recognitionData.isValid() - - # widget color - self.output.modify_base(gtk.STATE_NORMAL, self.res_color[mode]) + if isinstance(content, list): + for text in content: + self.output.addText(text, self.res_color[mode]) + else: + self.output.addText(content, self.res_color[mode]) def setRecognitionData(self, recognitionData): self.recognitionData = recognitionData @@ -138,6 +142,8 @@ def on_image_resize(self, widget, event, window): allocation = widget.get_allocation() + if not self.recognitionData: + return image = self.recognitionData.getImage() pixbuf = self.image_to_pixbuf(image) image = gtk.Image() @@ -164,4 +170,39 @@ # set new pixbuf widget.set_from_pixbuf(pixbuf) + +class Output(gtk.HBox): + def __init__(self): + #Initialize the VBox + gtk.HBox.__init__(self,False,0) + self.button = {} + + def addText(self, text, color): + labelText = text[0] + "\n" + text[1] + button = gtk.Button(labelText) + label = button.get_child() + label.set_ellipsize(pango.ELLIPSIZE_MIDDLE) + label.modify_fg(gtk.STATE_NORMAL, color) + button.connect("clicked",self.copyClipboard) + self.button[text[0]] = [button, text] + self.add(button) + self.show_all() + + def removeText(self, text): + self.remove(self.button[text]) + + def removeAll(self): + for button in self.button: + self.remove(button[0]) + + def copyClipboard(self, widget): + label = widget.get_label() + label = label.split("\n")[0] + text = self.button[label][1][1] + # set the clipboard text data + pyperclip.setcb(text) + # make our data available to other applications + pyperclip.getcb() + + \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2014-08-28 14:57:09
|
Revision: 70 http://sourceforge.net/p/pycodeocr/code/70 Author: laserb Date: 2014-08-28 14:57:01 +0000 (Thu, 28 Aug 2014) Log Message: ----------- Update tests and add missing files. Modified Paths: -------------- branches/redesign/Recognition/__init__.py branches/redesign/Test/Tests.py Added Paths: ----------- branches/redesign/Test/TestGUI.py branches/redesign/Test/TestScannerGUI.py branches/redesign/gtkGUI/Chooser.py branches/redesign/gtkGUI/ImagePreview.glade branches/redesign/gtkGUI/PropertyWidgets/ branches/redesign/gtkGUI/PropertyWidgets/Coordinates.py branches/redesign/gtkGUI/PropertyWidgets/Filechooser.py branches/redesign/gtkGUI/PropertyWidgets/ListChooser.py branches/redesign/gtkGUI/PropertyWidgets/PropertyWidgetBase.py branches/redesign/gtkGUI/PropertyWidgets/__init__.py branches/redesign/gtkGUI/test.py Removed Paths: ------------- branches/redesign/Source/Sources.py Modified: branches/redesign/Recognition/__init__.py =================================================================== --- branches/redesign/Recognition/__init__.py 2014-08-28 14:37:06 UTC (rev 69) +++ branches/redesign/Recognition/__init__.py 2014-08-28 14:57:01 UTC (rev 70) @@ -1,4 +1,5 @@ from Recognition.ImageRecognition import RunRecognition +from Recognition.ImageRecognition import RecognitionData from Recognition.Barcode import Barcode from Recognition.DataMatrix import DataMatrix from Recognition.DTMX import DTMX Deleted: branches/redesign/Source/Sources.py =================================================================== --- branches/redesign/Source/Sources.py 2014-08-28 14:37:06 UTC (rev 69) +++ branches/redesign/Source/Sources.py 2014-08-28 14:57:01 UTC (rev 70) @@ -1,33 +0,0 @@ -# -*- coding: utf8 -*- - -import sane -from Source import Scanner - -class Sources(object): - def __init__(self): - self.sources = [] - - def searchScanner(self): - sane.init() - srcs = sane.get_devices() - for src in srcs: - self.sources.append(Scanner(src)) - - def getSources(self): - return self.sources - - def getSource(self, name): - for src in self.sources: - if src.getName() == name: - return src - - def addSource(self, source): - self.sources.append(source) - - def removeSource(self, source): - i = 0 - for src in self.sources: - if src.equals(source): - self.sources.pop(i); - return - i = i + 1 Added: branches/redesign/Test/TestGUI.py =================================================================== --- branches/redesign/Test/TestGUI.py (rev 0) +++ branches/redesign/Test/TestGUI.py 2014-08-28 14:57:01 UTC (rev 70) @@ -0,0 +1,114 @@ +# @see http://www.python-kurs.eu/threads.php + +import gtk +from gtkGUI.ProgressBar import ProgressBar +from gtkGUI.ImagePreview import ImagePreview +import threading, time +from PIL import Image +import Recognition + + +class TestGUI(threading.Thread): + def __init__(self, widget, on_button_pressed): + threading.Thread.__init__(self) + self.widget = widget + self.on_button_pressed = on_button_pressed + + # @see https://git.gnome.org/browse/pygtk/tree/examples/gtk/widget.py + def run(self): + self.win = gtk.Window() + self.win.set_border_width(5) + self.win.set_title('Widget test') + self.win.connect('delete-event', gtk.main_quit) + + frame = gtk.Frame("Example frame") + self.win.add(frame) + + hbox = gtk.HBox() + frame.add(hbox) + + button = gtk.Button("Click") + button.connect("pressed",self.on_button_pressed) + hbox.add(button) + hbox.add(self.widget) + + self.win.show_all() + gtk.main() + + + ## Refresh window during running processes. + def refresh(self): + self.win.queue_draw() + time.sleep(0.1) # give also some time to the user... :) + while gtk.events_pending(): + gtk.main_iteration() + +def progressbar_on_button_pressed(event): + for i in range(10): + progressbar.nextProgress("clicked " + str(progressbar.getProgress())) + t.refresh() + print progressbar.getProgress() == 10 + progressbar.resetProgress("reset") + print progressbar.getProgress() == 0 + + +def imagePreview_on_button_pressed(event): + imagePreview.setOutput("Recognition failed.", False) + for i in range(10): + t.refresh() + imagePreview.setOutput("Success", True) + for i in range(10): + t.refresh() + imagePreview.setOutput("Reset") + +def complete_on_button_pressed(event): + imagePreview.setOutput("Recognition failed.", False) + for i in range(10): + progressbar.nextProgress("clicked " + str(progressbar.getProgress())) + t.refresh() + imagePreview.setOutput("Success", True) + for i in range(10): + t.refresh() + imagePreview.setOutput("Reset") + progressbar.resetProgress("reset") + for i in range(10): + t.refresh() + + image = Image.open("/home/rf/Firefox_wallpaper.png") + recognitionData = Recognition.RecognitionData(image) + recognitionData.setContent("Data recognized", True) + imagePreview.setRecognitionData(recognitionData) + + +# main routin +if __name__ == '__main__': + errors = 0 + # init tests + progressbar = ProgressBar(10) + t = TestGUI(progressbar, progressbar_on_button_pressed) + t.start() + t.join() + + # init tests + imagePreview = ImagePreview() + image = Image.open("/home/rf/bin/pyCodeOCR/PyCodeOCR.png") + imagePreview.setImage(image) + t = TestGUI(imagePreview, imagePreview_on_button_pressed) + t.start() + t.join() + + vbox = gtk.VBox() + imagePreview = ImagePreview() + image = Image.open("/home/rf/bin/pyCodeOCR/PyCodeOCR.png") + imagePreview.setImage(image) + progressbar = ProgressBar(10) + vbox.pack_start(imagePreview,True,True,0) + vbox.pack_end(progressbar,False,False,0) + vbox.show_all() + t = TestGUI(vbox, complete_on_button_pressed) + t.start() + t.join() + + + + Added: branches/redesign/Test/TestScannerGUI.py =================================================================== --- branches/redesign/Test/TestScannerGUI.py (rev 0) +++ branches/redesign/Test/TestScannerGUI.py 2014-08-28 14:57:01 UTC (rev 70) @@ -0,0 +1,81 @@ +# @see http://www.python-kurs.eu/threads.php + +import gtk +from gtkGUI.ProgressBar import ProgressBar +from gtkGUI.ImagePreview import ImagePreview +import threading, time +from PIL import Image +import Recognition, Source + + +class TestGUI(threading.Thread): + def __init__(self): + threading.Thread.__init__(self) + + # @see https://git.gnome.org/browse/pygtk/tree/examples/gtk/widget.py + def run(self): + srcs = Source.Scanner() + srcs.searchScanner() + self.source = srcs.activated()[0][1] + + self.win = gtk.Window() + self.win.set_border_width(5) + self.win.set_title('Widget test') + self.win.connect('delete-event', gtk.main_quit) + + frame = gtk.Frame("Example frame") + self.win.add(frame) + + hbox = gtk.HBox() + frame.add(hbox) + + button = gtk.Button("Click") + button.connect("pressed",self.on_button_pressed) + hbox.add(button) + + vbox = gtk.VBox() + self.imagePreview = ImagePreview() + self.progressbar = ProgressBar(10) + vbox.pack_start(self.imagePreview,True,True,0) + vbox.pack_end(self.progressbar,False,False,0) + + hbox.add(vbox) + + self.win.show_all() + gtk.main() + + + ## Refresh window during running processes. + def refresh(self): + self.win.queue_draw() + time.sleep(0.1) # give also some time to the user... :) + while gtk.events_pending(): + gtk.main_iteration() + + def on_button_pressed(self, event): + esr = Recognition.ESR() + esr.setRotate([180]) + + stdScannerData = Source.StdScannerData() + scannerData = stdScannerData.getStdScannerData("180 deg") + + + runRecognition = Recognition.RunRecognition(self.source, scannerData, esr) + runRecognition() + self.imagePreview.setRecognitionData(esr.getRecognitionData()) + + +# main routin +if __name__ == '__main__': + errors = 0 + # init tests + + + + t = TestGUI() + t.start() + t.join() + + + + Modified: branches/redesign/Test/Tests.py =================================================================== --- branches/redesign/Test/Tests.py 2014-08-28 14:37:06 UTC (rev 69) +++ branches/redesign/Test/Tests.py 2014-08-28 14:57:01 UTC (rev 70) @@ -43,9 +43,9 @@ ## Look for some scanners. def Scanners(self): print "Test search scanners ..." - srcs = Source.Sources() + srcs = Source.Scanner() srcs.searchScanner() - if len(srcs.getSources()) == 0: + if len(srcs.activated()[0][1]) == 0: print "Test failed." return False else: @@ -91,8 +91,9 @@ def TestRecognition(self, source, imageRecognition, image, expected): print "Test image recognition from file for %s ..." % imageRecognition.getName() scannerData = Source.ScannerData("default") - runRecognition = Recognition.RunRecognition(source, scannerData, imageRecognition) + runRecognition = Recognition.RunRecognition(source, scannerData, imageRecognition, "") (check, text) = runRecognition.recognize(image) + text = text[0][1] if check and text == expected: print "Test passed." return True @@ -105,9 +106,9 @@ # @pre A source, an imageRecognition and some parameters # @post The image gets scanned by the source and recognized by the method specified in imageRecognition. # The result is checked with what we expected. - def TestRunRecognition(self, source, parameters, imageRecognition): + def TestRunRecognition(self, source, parameters, imageRecognition, recognitionParameters): print "Test image recognition from %s for %s ..." % (source.getName(),imageRecognition.getName()) - runRecognition = Recognition.RunRecognition(source, parameters, imageRecognition) + runRecognition = Recognition.RunRecognition(source, parameters, imageRecognition, recognitionParameters) (check, msg) = runRecognition() if check: print "Test passed." @@ -130,16 +131,6 @@ if not tests.Scanners(): exit() - # test reading and storing of scanner properties - srcs = Source.Sources() - srcs.searchScanner() - source = srcs.getSources()[0] - errors += not tests.SourceProperties(source) - - # test adding another source to the source-list - fileSource = Source.File("./TestImage.jpg","TestImage","file") - errors += not tests.AddSource(fileSource, "TestImage", "./TestImage.jpg") - # test image recognition without using source esr = Recognition.ESR() image = Image.open("./TestImage.jpg") @@ -150,14 +141,14 @@ # test image recognition with ESR from file source esr = Recognition.ESR() stdScannerData = Source.StdScannerData() - errors += not tests.TestRunRecognition(fileSource, "", esr) + fileSource = Source.File() + errors += not tests.TestRunRecognition(fileSource, ["./TestImage.jpg"], esr, "") # test image recognition with ESR form scanner source # esr = Recognition.ESR() -# esr.setRotate([180]) # stdScannerData = Source.StdScannerData() # scannerData = stdScannerData.getStdScannerData("180 deg") -# errors += not tests.TestRunRecognition(source, scannerData, esr) +# errors += not tests.TestRunRecognition(source, scannerData, esr, "") print "All test done." print "Errors: %s" % errors Added: branches/redesign/gtkGUI/Chooser.py =================================================================== --- branches/redesign/gtkGUI/Chooser.py (rev 0) +++ branches/redesign/gtkGUI/Chooser.py 2014-08-28 14:57:01 UTC (rev 70) @@ -0,0 +1,82 @@ +import inspect +import gtk +import PropertyWidgets + +class Chooser(gtk.VBox): + def __init__(self, members, ignore): + #Initialize the VBox + gtk.VBox.__init__(self,False,0) + self.combobox = gtk.ComboBox() + self.add(self.combobox) + self.selection = None + self.members = members + self.ignore = ignore + self.list = {} + + self.selectionWidgets = [] + self.propertyVBox = gtk.VBox() + self.add(self.propertyVBox) + + self.propertyWidgets = {} + for name, obj in inspect.getmembers(PropertyWidgets): + self.propertyWidgets[name] = obj + + + # init ComboBox + self.initComboBox() + + # get list of available classes + self.getList() + + def initComboBox(self): + self.liststore = gtk.ListStore(str) + self.cell = gtk.CellRendererText() + self.combobox.set_model(self.liststore) + self.combobox.pack_start(self.cell, True) + self.combobox.add_attribute(self.cell, 'text', 0) + self.combobox.connect("changed", self.getActive) + + + def getSelection(self): + return self.selection + + def getProperties(self): + properties = [] + for widget in self.selectionWidgets: + properties.append(widget.getSelection()) + return properties + + def getList(self): + self.list = {} + self.liststore.clear() + for name, obj in inspect.getmembers(self.members): + if name[0] != '_' and not name in self.ignore: + self.list[name] = obj + + keys = self.list.keys() + keys.sort() + for key in keys: + self.liststore.append([key]) + self.combobox.set_active(0) + return self.list + + def getActive(self, widget = None): + text = self.combobox.get_active_text() + self.selection = self.list[text] + self.selection = self.selection() + + for widget in self.selectionWidgets: + self.propertyVBox.remove(widget) + + self.selectionWidgets = [] + widgets = self.selection.activated() + if widgets: + for options in widgets: + if options[0] in self.propertyWidgets.keys(): + widget = self.propertyWidgets[options[0]] + widget = widget(options[1]) + self.selectionWidgets.append(widget) + self.propertyVBox.add(widget) + widget.show_all() + return self.selection + \ No newline at end of file Added: branches/redesign/gtkGUI/ImagePreview.glade =================================================================== (Binary files differ) Index: branches/redesign/gtkGUI/ImagePreview.glade =================================================================== --- branches/redesign/gtkGUI/ImagePreview.glade 2014-08-28 14:37:06 UTC (rev 69) +++ branches/redesign/gtkGUI/ImagePreview.glade 2014-08-28 14:57:01 UTC (rev 70) Property changes on: branches/redesign/gtkGUI/ImagePreview.glade ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/xml \ No newline at end of property Added: branches/redesign/gtkGUI/PropertyWidgets/Coordinates.py =================================================================== --- branches/redesign/gtkGUI/PropertyWidgets/Coordinates.py (rev 0) +++ branches/redesign/gtkGUI/PropertyWidgets/Coordinates.py 2014-08-28 14:57:01 UTC (rev 70) @@ -0,0 +1,94 @@ +from PropertyWidgetBase import PropertyWidgetBase +from Source.Scanner import ScannerData +from Source.Scanner import StdScannerData +import gtk + +class Coordinates(PropertyWidgetBase): + def __init__(self, options): + super(Coordinates,self).__init__(options) + self.stdScannerData = StdScannerData() + + self.profile = gtk.HBox() + self.position = gtk.HBox() + self.size = gtk.HBox() + self.rotation = gtk.HBox() + + self.add(self.profile) + self.add(self.position) + self.add(self.size) + self.add(self.rotation) + + self.initPosition() + self.initSize() + self.initRotation() + self.initprofile() + + self.setProfile("default") + + def initprofile(self): + label = gtk.Label("Profiles") + self.profileCombobox = gtk.ComboBox() + self.liststore = gtk.ListStore(str) + self.cell = gtk.CellRendererText() + self.profileCombobox.set_model(self.liststore) + self.profileCombobox.pack_start(self.cell, True) + self.profileCombobox.add_attribute(self.cell, 'text', 0) + self.liststore.clear() + for data in self.stdScannerData.getStdScannerDatas(): + self.liststore.append([data.getName()]) + self.profileCombobox.set_active(0) + self.profileCombobox.connect("changed",self.on_profile_changed) + + self.profile.add(label) + self.profile.add(self.profileCombobox) + + def on_profile_changed(self, widget = None): + profile = self.profileCombobox.get_active_text() + self.setProfile(profile) + + def initPosition(self): + label = gtk.Label("Position") + self.position_x = gtk.SpinButton(None,1,0) + self.position_x.get_adjustment().set_all(0,0,1000,1,10,0) + self.position_y = gtk.SpinButton(None,1,0) + self.position_y.get_adjustment().set_all(0,0,1000,1,10,0) + + self.position.add(label) + self.position.add(self.position_x) + self.position.add(self.position_y) + + def initSize(self): + label = gtk.Label("Size") + self.size_x = gtk.SpinButton(None,1,0) + self.size_x.get_adjustment().set_all(0,0,1000,1,10,0) + self.size_y = gtk.SpinButton(None,1,0) + self.size_y.get_adjustment().set_all(0,0,1000,1,10,0) + + self.size.add(label) + self.size.add(self.size_x) + self.size.add(self.size_y) + + def initRotation(self): + label = gtk.Label("Rotation") + self.rotate = gtk.SpinButton(None,1,0) + self.rotate.get_adjustment().set_all(0,0,360,10,90,0) + + self.rotation.add(label) + self.rotation.add(self.rotate) + + def setProfile(self, profile): + self.scannerData = self.stdScannerData.getStdScannerData(profile) + (position_x, position_y) = self.scannerData.getPosition() + (size_x, size_y) = self.scannerData.getSize() + self.position_x.set_value(position_x) + self.position_y.set_value(position_y) + self.size_x.set_value(size_x) + self.size_y.set_value(size_y) + self.rotate.set_value(self.scannerData.getRotation()) + + def getSelection(self): + selection = ScannerData("custom") + selection.setPosition(self.position_x.get_value_as_int(), self.position_y.get_value_as_int()) + selection.setSize(self.size_x.get_value_as_int(), self.size_y.get_value_as_int()) + selection.setRotation(self.rotate.get_value_as_int()) + return selection \ No newline at end of file Added: branches/redesign/gtkGUI/PropertyWidgets/Filechooser.py =================================================================== --- branches/redesign/gtkGUI/PropertyWidgets/Filechooser.py (rev 0) +++ branches/redesign/gtkGUI/PropertyWidgets/Filechooser.py 2014-08-28 14:57:01 UTC (rev 70) @@ -0,0 +1,13 @@ +from PropertyWidgetBase import PropertyWidgetBase +import gtk + +class Filechooser(PropertyWidgetBase): + def __init__(self, options): + super(Filechooser,self).__init__(options) + self.widget = gtk.FileChooserButton("File") + self.widget.set_action(gtk.FILE_CHOOSER_ACTION_OPEN) + #self.widget = gtk.Label("test") + self.add(self.widget) + + def getSelection(self): + return self.widget.get_filename() \ No newline at end of file Added: branches/redesign/gtkGUI/PropertyWidgets/ListChooser.py =================================================================== --- branches/redesign/gtkGUI/PropertyWidgets/ListChooser.py (rev 0) +++ branches/redesign/gtkGUI/PropertyWidgets/ListChooser.py 2014-08-28 14:57:01 UTC (rev 70) @@ -0,0 +1,30 @@ +from PropertyWidgetBase import PropertyWidgetBase +import gtk + +class ListChooser(PropertyWidgetBase): + def __init__(self, options): + super(ListChooser,self).__init__(options) + self.combobox = gtk.ComboBox() + self.add(self.combobox) + + self.initComboBox() + self.getList() + + def initComboBox(self): + self.liststore = gtk.ListStore(str) + self.cell = gtk.CellRendererText() + self.combobox.set_model(self.liststore) + self.combobox.pack_start(self.cell, True) + self.combobox.add_attribute(self.cell, 'text', 0) + + + def getList(self): + self.liststore.clear() + for option in self.options: + self.liststore.append([option]) + self.combobox.set_active(0) + return + + def getSelection(self): + selection = self.combobox.get_active_text() + return selection \ No newline at end of file Added: branches/redesign/gtkGUI/PropertyWidgets/PropertyWidgetBase.py =================================================================== --- branches/redesign/gtkGUI/PropertyWidgets/PropertyWidgetBase.py (rev 0) +++ branches/redesign/gtkGUI/PropertyWidgets/PropertyWidgetBase.py 2014-08-28 14:57:01 UTC (rev 70) @@ -0,0 +1,10 @@ +import gtk + +class PropertyWidgetBase(gtk.VBox): + def __init__(self, options): + #Initialize the VBox + gtk.VBox.__init__(self,False,0) + self.options = options + + def getSelection(self): + pass \ No newline at end of file Added: branches/redesign/gtkGUI/PropertyWidgets/__init__.py =================================================================== --- branches/redesign/gtkGUI/PropertyWidgets/__init__.py (rev 0) +++ branches/redesign/gtkGUI/PropertyWidgets/__init__.py 2014-08-28 14:57:01 UTC (rev 70) @@ -0,0 +1,3 @@ +from Filechooser import Filechooser +from Coordinates import Coordinates +from ListChooser import ListChooser \ No newline at end of file Added: branches/redesign/gtkGUI/test.py =================================================================== --- branches/redesign/gtkGUI/test.py (rev 0) +++ branches/redesign/gtkGUI/test.py 2014-08-28 14:57:01 UTC (rev 70) @@ -0,0 +1,81 @@ +import gtk, sys + +class ComboButton(gtk.HBox): + + def __init__(self,menuitems): + gtk.HBox.__init__(self,False,0) + """ + if( !(isinstance(menuitems,types.TupleType) or + isinstance(menuitems,type.ListType))): + raise(ComboButtonException()) + """ + self.set_border_width(2) + self.entry = gtk.Entry() + menu = gtk.Menu() + for i in menuitems: + item = gtk.MenuItem(i) + item.show() + menu.append(item) + item.connect( "activate",self.menu_response,i) + + button = gtk.Button() + arrow = gtk.Arrow(gtk.ARROW_DOWN,gtk.SHADOW_IN) + button.add(arrow) + self.progressbar = gtk.ProgressBar() + self.pack_start(button,False,False,0) + self.pack_end(self.entry,True,True,0) + self.pack_end(self.progressbar,True,True,0) + + button.connect("event",self.button_popup,menu) + + + self.show_all() + + def button_popup(self,widget,event,menu): + if event.type == gtk.gdk.BUTTON_PRESS: + menu.popup(None,None,None,event.button,event.time) + return True + return False + + def menu_response(self,widget,str): + print "%s was clicked" % str + buffer = self.entry.get_text() + self.entry.set_text(buffer + str ) + + + def entry_call(self,widget,event): + print "event is of %s type" % event.type + + def set_active(self,number): + pass + + def get_text(self): + return self.entry.get_text() + + def set_text(self,text): + self.entry.set_text(text) + +def main(args): + win = gtk.Window() + win.set_border_width(5) + win.set_title('Widget test') + win.connect('delete-event', gtk.main_quit) + + frame = gtk.Frame("Example frame") + win.add(frame) + + w = ComboButton(["a","b"]) + frame.add(w) + + win.show_all() + + gtk.main() + + + +# main routin +if __name__ == '__main__': + errors = 0 + + # init tests + sys.exit(main(sys.argv)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2014-09-05 08:08:04
|
Revision: 71 http://sourceforge.net/p/pycodeocr/code/71 Author: laserb Date: 2014-09-05 08:08:01 +0000 (Fri, 05 Sep 2014) Log Message: ----------- Fix old output not removed. Modified Paths: -------------- branches/redesign/PyCodeOCR.py branches/redesign/gtkGUI/ImagePreview.py Modified: branches/redesign/PyCodeOCR.py =================================================================== --- branches/redesign/PyCodeOCR.py 2014-08-28 14:57:01 UTC (rev 70) +++ branches/redesign/PyCodeOCR.py 2014-09-05 08:08:01 UTC (rev 71) @@ -115,6 +115,7 @@ # run recognition self.progressbar.resetProgress("") + self.imagePreview.removeAll() runRecognition = Recognition.RunRecognition(self.source, sourceProperties, self.imageRecognition, recognitionProperties) runRecognition.connect("updateRecognition", self.onProgressUpdate) runRecognition.connect("recognized", self.on_recognized) Modified: branches/redesign/gtkGUI/ImagePreview.py =================================================================== --- branches/redesign/gtkGUI/ImagePreview.py 2014-08-28 14:57:01 UTC (rev 70) +++ branches/redesign/gtkGUI/ImagePreview.py 2014-09-05 08:08:01 UTC (rev 71) @@ -122,6 +122,10 @@ self.output.addText(text, self.res_color[mode]) else: self.output.addText(content, self.res_color[mode]) + + def removeAll(self): + self.output.removeAll() + self.main_image.set_from_file( "PyCodeOCR.png" ) def setRecognitionData(self, recognitionData): self.recognitionData = recognitionData @@ -131,7 +135,7 @@ # @see http://stackoverflow.com/questions/7906814/converting-pil-image-to-gtk-pixbuf def image_to_pixbuf(self, image): fd = StringIO.StringIO() - self.recognitionData.getImage().save(fd, "png") + image.save(fd, "png") contents = fd.getvalue() fd.close() loader = gtk.gdk.PixbufLoader("png") @@ -192,9 +196,11 @@ self.remove(self.button[text]) def removeAll(self): - for button in self.button: - self.remove(button[0]) - + children = self.get_children() + for child in children: + self.remove(child) + self.button = {} + def copyClipboard(self, widget): label = widget.get_label() label = label.split("\n")[0] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |