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