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.
|