pycodeocr-main Mailing List for PyCodeOCR (Page 2)
Status: Beta
Brought to you by:
drtrigon
You can subscribe to this list here.
2010 |
Jan
|
Feb
|
Mar
(3) |
Apr
(8) |
May
|
Jun
(3) |
Jul
|
Aug
|
Sep
(9) |
Oct
(1) |
Nov
(2) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2011 |
Jan
|
Feb
(8) |
Mar
(4) |
Apr
(9) |
May
|
Jun
|
Jul
(4) |
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
(2) |
2013 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(8) |
Sep
(1) |
Oct
|
Nov
|
Dec
|
From: <drt...@us...> - 2011-04-26 21:19:47
|
Revision: 43 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=43&view=rev Author: drtrigon Date: 2011-04-26 21:19:41 +0000 (Tue, 26 Apr 2011) Log Message: ----------- followup to r24: 'Device selection' improved to Dialog, default action/button does not work yet Modified Paths: -------------- PyCodeOCR.glade Modified: PyCodeOCR.glade =================================================================== --- PyCodeOCR.glade 2011-03-16 21:07:35 UTC (rev 42) +++ PyCodeOCR.glade 2011-04-26 21:19:41 UTC (rev 43) @@ -1,10 +1,10 @@ -<?xml version="1.0" encoding="UTF-8"?> +<?xml version="1.0"?> <glade-interface> <!-- interface-requires gtk+ 2.16 --> <!-- interface-naming-policy toplevel-contextual --> <widget class="GtkWindow" id="window1"> - <property name="width_request">786</property> - <property name="height_request">242</property> + <property name="width_request">798</property> + <property name="height_request">246</property> <property name="visible">True</property> <property name="title" translatable="yes">PyCodeOCR</property> <property name="resizable">False</property> @@ -31,7 +31,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="editable">False</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </widget> <packing> <property name="x">16</property> @@ -329,9 +329,17 @@ </child> </widget> <widget class="GtkWindow" id="window2"> + <property name="width_request">470</property> + <property name="height_request">190</property> + <property name="title" translatable="yes">Device selection</property> <property name="resizable">False</property> + <property name="modal">True</property> <property name="window_position">center</property> <property name="destroy_with_parent">True</property> + <property name="type_hint">dialog</property> + <property name="urgency_hint">True</property> + <property name="deletable">False</property> + <property name="transient_for">window1</property> <signal name="destroy" handler="on_window2_destroy"/> <child> <widget class="GtkFixed" id="fixed1"> @@ -356,7 +364,8 @@ <property name="height_request">29</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can_default">True</property> + <property name="receives_default">False</property> <signal name="clicked" handler="on_button3_clicked"/> </widget> <packing> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-03-16 21:07:41
|
Revision: 42 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=42&view=rev Author: laserb Date: 2011-03-16 21:07:35 +0000 (Wed, 16 Mar 2011) Log Message: ----------- split files / make RunSane threaded Modified Paths: -------------- branches/laserb/PyCodeOCR.py Modified: branches/laserb/PyCodeOCR.py =================================================================== --- branches/laserb/PyCodeOCR.py 2011-03-16 21:07:17 UTC (rev 41) +++ branches/laserb/PyCodeOCR.py 2011-03-16 21:07:35 UTC (rev 42) @@ -15,11 +15,12 @@ pygtk.require('2.0') import gtk, gtk.glade import gobject +import threading # import Modules from Modules.checksum import modulo10 -#from Modules.blacklist_manager import blacklist_manager -#from Modules.RunSane import RunSANE +from Modules.blacklist_manager import blacklist_manager +from Modules.RunSane import RunSANE from Modules.RunExternal import RunExternal #from Modules.RunMagickWand import RunMagickWand #from Modules.RunLibdmtx import RunLibdmtx @@ -27,7 +28,7 @@ # PIL image library and it's SANE bindings import Image, ImageDraw #from PIL import Image -import sane # f12: 'python-imaging-sane' +#import sane # f12: 'python-imaging-sane' from time import gmtime, strftime @@ -223,9 +224,10 @@ # init sane when idle, hopefully this is right after GUI is loaded - gobject.idle_add(self.init_sane) +# gobject.idle_add(self.init_sane) + # display window self.main_window.show() @@ -233,46 +235,23 @@ ## Run gtk mainloop and with it THIS APP. def run(self): - gtk.main() - - - - ## initialize sane - # - def init_sane(self, source=None): - # lock window - self.main_window.set_sensitive(False) - # init sane - self.run_sane = RunSANE() + gtk.gdk.threads_init() - # select device if more than one is found - if self.run_sane.found_scanner == None: - # set default row to first - self.device_treeview.set_cursor(0) - - # show tab with device list - # choose device and press ok to initialize scanner - self.notebook.set_current_page(2) - # unlock window - self.main_window.set_sensitive(True) - else: - # unlock window - self.main_window.set_sensitive(True) - # set sensitivity - self.init_sensitivity() + self.device_chooser_event = threading.Event() - # return false, otherwise gobject runs it again - return False + ## initialize sane + self.run_sane = RunSANE(self.notebook, self.progress, self.device_chooser_button, BlacklistMgr,self.device_chooser_event) + self.run_sane.start() + gtk.main() + + def on_device_chooser_button_clicked(self, source=None): self.device_chooser_button.set_visible(False) - # get selection from treeview - devnr = self.device_treeview.get_cursor()[0][0] - # init scanner - self.run_sane.init_scanner(devnr) - # set sensitivity - self.init_sensitivity() + self.device_chooser_event.set() + + ## set sensitivity of buttons the first time def init_sensitivity(self): # set sensitivity @@ -424,12 +403,8 @@ ## exit and restart def on_retry_button_clicked(self, source=None, event=None): - try: - self.run_sane.scanner.close() - except: - pass - sane.exit() - self.init_sane() + self.device_chooser_event.clear() + self.run_sane.retry() # os.execv(sys.argv[0],sys.argv) # self.on_main_window_destroy() @@ -836,240 +811,12 @@ if not (data == olddata): print 'subst: "%s" => "%s"' % (item[0], item[1]) return data - -## sSANE/PIL interface python wrapper/bindings. -class RunSANE: - # "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): - print "init sane python interface ..." - - # Get the path set up properly - #sys.path.append('.') - # get blacklist - self.blacklist = BlacklistMgr.read_blacklist() - # init SANE - self.n = 4. - main.progress(0.,"init sane python interface ...") - try: - self.version = sane.init() - main.progress(1./self.n,"init sane python interface ... search devices") - # get sane devices - self.devices = sane.get_devices() - # filter blacklisted devices - self.devices = BlacklistMgr.filter_devices(self.devices) - # check how many devices we found - if len(self.devices) == 0: - main.progress(0./self.n,"No device found.") - main.device_chooser_button.set_visible(False) - self.found_scanner = False - elif len(self.devices) > 1: - # simply continue and select device in GUI ( see init_sane ) - main.progress(2./self.n,"More than one device found.") - main.device_chooser_button.set_visible(True) - self.found_scanner = None - - else: - # only one device found, continue - main.progress(2./self.n,"Device: %s" % self.devices[0][1]+" "+self.devices[0][2]) - main.device_chooser_button.set_visible(False) - # continue to init scanner - self.init_scanner(0) - - except: - # No device found at all - self.found_scanner = False - main.device_chooser_button.set_visible(False) - print "No sane device found. Retry again." - main.progress(0./self.n,"No sane device found. Retry again.") - - ## iInit of sane interface -> scanner - def init_scanner(self, devnr): - print "Use device number: "+str(devnr) - try: - # finish init device - self.dev = self.devices[devnr][0] # choose device - print "%s" % self.dev - main.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 - - main.progress(4./self.n,"Ready: %s" % self.devices[devnr][1]+" "+self.devices[devnr][2]) - self.info() - - main.notebook.set_current_page(0) - main.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." - main.progress(0./self.n,"Loading sane device failed. Retry again.") - - - - ## 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 - - ## 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): -# print self.entry3.get_text() - entrybuffer = main.entry3.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 -#Selected device= %s -#SaneDev object= %s -#""" % ( self.version ,self.dev,self.scanner ) -# enditer = entrybuffer.get_end_iter() -# entrybuffer.insert(enditer,"test") - print 'SANE version: %s' % repr(self.version).replace('array',' ') - print 'Available devices= %s' % repr(self.devices).replace('array',' ') - print 'Selected device= %s' % self.dev - - print 'SaneDev object= %s' % self.scanner - print 'Device parameters: %s' % repr(self.params).replace('array',' ') - print 'Device options:', "\n",self.opts - - # redirect print again to old textbuffer - #sys.stdout = main.logging - -class blacklist_manager: - def __init__(self): - pass - - def post_init(self, device_treeview, blacklist_treeview, local_path): - self.device_treeview = device_treeview - self.blacklist_treeview = blacklist_treeview - self.local_path = local_path - - # create self.treeview things - self.list_store = gtk.ListStore(gobject.TYPE_STRING) - self.device_treeview.set_model(self.list_store) - col = gtk.TreeViewColumn("Select Device to use:", gtk.CellRendererText(),text=0) - self.device_treeview.append_column(col) - - # create self.treeview things - self.blacklist_store = gtk.ListStore(gobject.TYPE_STRING) - self.blacklist_treeview.set_model(self.blacklist_store) - blackcol = gtk.TreeViewColumn("Blacklisted Devices:", gtk.CellRendererText(),text=0) - self.blacklist_treeview.append_column(blackcol) - return - - def filter_devices(self, devices1): - # init filtered list - devices = [] - - print "\n" - # add found devices to self.treeview - self.list_store.clear() - for i in range(len(devices1)): - # filter devices: remove blacklisted devices - if not devices1[i][1]+" "+devices1[i][2] in self.blacklist: - devices.append(devices1[i]) - print str(i)+": "+devices1[i][1]+" "+devices1[i][2] - self.list_store.append([devices1[i][1]+" "+devices1[i][2]]) - - return devices - - ## get blacklisted devices - def read_blacklist(self): - self.blacklist_store.clear() - - bl = open('%s/blacklist' % self.local_path, 'r' ) - temp = bl.readlines() - bl.close - self.blacklist = [] - for line in temp: - self.blacklist.append(line.strip()) - self.blacklist_store.append([line.strip()]) - return self.blacklist - - ## write blacklisted devices - # @todo add UI way to blacklist device - def write_blacklist(self): - bl = open('%s/blacklist' % self.local_path, 'w' ) - - model= self.blacklist_treeview.get_model() - iter = model.get_iter_first() - while( iter != None): - data = model.get_value(iter, 0) - bl.write(data+"\n") - iter = model.iter_next(iter) - bl.close() - - ## add device to blacklist - def blacklist_add(self, widget=None): - treeselection = self.device_treeview.get_selection() - model, iter = treeselection.get_selected() - data = model.get_value(iter, 0) - self.blacklist_store.append([data]) - self.list_store.remove(iter) - self.write_blacklist() - - ## remove device from blacklist - def blacklist_remove(self, widget=None): - treeselection = self.blacklist_treeview.get_selection() - model, iter =treeselection.get_selected() - data = model.get_value(iter, 0) - self.list_store.append([data]) - self.blacklist_store.remove(iter) - self.write_blacklist() - - - if __name__ == '__main__': + global BlacklistMgr + global main ## initialize Blacklist Manager BlacklistMgr = blacklist_manager() ## run main application This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-03-16 21:07:24
|
Revision: 41 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=41&view=rev Author: laserb Date: 2011-03-16 21:07:17 +0000 (Wed, 16 Mar 2011) Log Message: ----------- split files / make RunSane threaded Added Paths: ----------- branches/laserb/Modules/RunSane.py branches/laserb/Modules/blacklist_manager.py Added: branches/laserb/Modules/RunSane.py =================================================================== --- branches/laserb/Modules/RunSane.py (rev 0) +++ branches/laserb/Modules/RunSane.py 2011-03-16 21:07:17 UTC (rev 41) @@ -0,0 +1,176 @@ +import sane, threading, time, gtk.gdk +from Modules.blacklist_manager import blacklist_manager + +## sSANE/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): + 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 + + threading.Thread.__init__(self) + # Get the path set up properly + #sys.path.append('.') + + 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 + 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 + 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.found_scanner = None + self.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() + + self.devnr = self.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.") + 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.notebook.set_current_page(0) + 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() + + + + ## 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 + + ## 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): +# print self.entry3.get_text() + entrybuffer = self.entry3.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 +#Selected device= %s +#SaneDev object= %s +#""" % ( self.version ,self.dev,self.scanner ) +# enditer = entrybuffer.get_end_iter() +# entrybuffer.insert(enditer,"test") + print 'SANE version: %s' % repr(self.version).replace('array',' ') + print 'Available devices= %s' % repr(self.devices).replace('array',' ') + print 'Selected device= %s' % self.dev + + print 'SaneDev object= %s' % self.scanner + print 'Device parameters: %s' % repr(self.params).replace('array',' ') + print 'Device options:', "\n",self.opts + + # redirect print again to old textbuffer + #sys.stdout = self.logging + + def retry(self): + try: + self.scanner.close() + except: + pass + sane.exit() + self.run() Added: branches/laserb/Modules/blacklist_manager.py =================================================================== --- branches/laserb/Modules/blacklist_manager.py (rev 0) +++ branches/laserb/Modules/blacklist_manager.py 2011-03-16 21:07:17 UTC (rev 41) @@ -0,0 +1,83 @@ +import gtk, gobject + +class blacklist_manager: + def __init__(self): + pass + + def post_init(self, device_treeview, blacklist_treeview, local_path): + self.device_treeview = device_treeview + self.blacklist_treeview = blacklist_treeview + self.local_path = local_path + + # create self.treeview things + self.list_store = gtk.ListStore(gobject.TYPE_STRING) + self.device_treeview.set_model(self.list_store) + col = gtk.TreeViewColumn("Select Device to use:", gtk.CellRendererText(),text=0) + self.device_treeview.append_column(col) + + # create self.treeview things + self.blacklist_store = gtk.ListStore(gobject.TYPE_STRING) + self.blacklist_treeview.set_model(self.blacklist_store) + blackcol = gtk.TreeViewColumn("Blacklisted Devices:", gtk.CellRendererText(),text=0) + self.blacklist_treeview.append_column(blackcol) + return + + def filter_devices(self, devices1): + # init filtered list + devices = [] + + print "\n" + # add found devices to self.treeview + self.list_store.clear() + for i in range(len(devices1)): + # filter devices: remove blacklisted devices + if not devices1[i][1]+" "+devices1[i][2] in self.blacklist: + devices.append(devices1[i]) + print str(i)+": "+devices1[i][1]+" "+devices1[i][2] + self.list_store.append([devices1[i][1]+" "+devices1[i][2]]) + + return devices + + ## get blacklisted devices + def read_blacklist(self): + self.blacklist_store.clear() + + bl = open('%s/blacklist' % self.local_path, 'r' ) + temp = bl.readlines() + bl.close + self.blacklist = [] + for line in temp: + self.blacklist.append(line.strip()) + self.blacklist_store.append([line.strip()]) + return self.blacklist + + ## write blacklisted devices + # @todo add UI way to blacklist device + def write_blacklist(self): + bl = open('%s/blacklist' % self.local_path, 'w' ) + + model= self.blacklist_treeview.get_model() + iter = model.get_iter_first() + while( iter != None): + data = model.get_value(iter, 0) + bl.write(data+"\n") + iter = model.iter_next(iter) + bl.close() + + ## add device to blacklist + def blacklist_add(self, widget=None): + treeselection = self.device_treeview.get_selection() + model, iter = treeselection.get_selected() + data = model.get_value(iter, 0) + self.blacklist_store.append([data]) + self.list_store.remove(iter) + self.write_blacklist() + + ## remove device from blacklist + def blacklist_remove(self, widget=None): + treeselection = self.blacklist_treeview.get_selection() + model, iter =treeselection.get_selected() + data = model.get_value(iter, 0) + self.list_store.append([data]) + self.blacklist_store.remove(iter) + self.write_blacklist() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-03-01 16:56:37
|
Revision: 40 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=40&view=rev Author: laserb Date: 2011-03-01 16:56:31 +0000 (Tue, 01 Mar 2011) Log Message: ----------- make it runable Added Paths: ----------- branches/laserb/Modules/RunExternal.py branches/laserb/Modules/__init__.py branches/laserb/Modules/checksum.py Added: branches/laserb/Modules/RunExternal.py =================================================================== --- branches/laserb/Modules/RunExternal.py (rev 0) +++ branches/laserb/Modules/RunExternal.py 2011-03-01 16:56:31 UTC (rev 40) @@ -0,0 +1,29 @@ +## Run external shell command/application. +import subprocess +class RunExternal: + + error_msg = [ "/bin/sh: " ] + + ## initialize + def __init__(self, cmd, error_msg): + self.cmd = cmd + self.error_msg += error_msg + + ## call + def __call__(self): + (self.error, self.stdout, self.stderr) = self._run() + return self.error + + ## Execute external shell command. + def _run(self, piped=True): + if piped: + run = subprocess.Popen( self.cmd, + stdin =subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True ) + (stdoutdata, stderrdata) = run.communicate() + return ((max(map(stderrdata.find, self.error_msg)) != -1), stdoutdata, stderrdata) + else: + os.system( self.cmd ) + return (False, "", "") Added: branches/laserb/Modules/__init__.py =================================================================== Added: branches/laserb/Modules/checksum.py =================================================================== --- branches/laserb/Modules/checksum.py (rev 0) +++ branches/laserb/Modules/checksum.py 2011-03-01 16:56:31 UTC (rev 40) @@ -0,0 +1,19 @@ +## @file checksum.py +# 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): + self.tabelle = [0,9,4,6,8,2,7,1,3,5] + + 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 + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-03-01 16:55:33
|
Revision: 39 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=39&view=rev Author: laserb Date: 2011-03-01 16:55:25 +0000 (Tue, 01 Mar 2011) Log Message: ----------- make it runable Modified Paths: -------------- branches/laserb/PyCodeOCR.glade branches/laserb/PyCodeOCR.py Added Paths: ----------- branches/laserb/Modules/ Modified: branches/laserb/PyCodeOCR.glade =================================================================== --- branches/laserb/PyCodeOCR.glade 2011-02-11 11:33:53 UTC (rev 38) +++ branches/laserb/PyCodeOCR.glade 2011-03-01 16:55:25 UTC (rev 39) @@ -2,13 +2,13 @@ <glade-interface> <!-- interface-requires gtk+ 2.16 --> <!-- interface-naming-policy toplevel-contextual --> - <widget class="GtkWindow" id="window1"> + <widget class="GtkWindow" id="main_window"> <property name="width_request">786</property> <property name="height_request">242</property> <signal name="motion_notify_event" handler="on_pointer_motion"/> - <signal name="destroy" handler="on_window1_destroy"/> + <signal name="destroy" handler="on_main_window_destroy"/> <child> - <widget class="GtkNotebook" id="notebook1"> + <widget class="GtkNotebook" id="notebook"> <property name="width_request">786</property> <property name="height_request">242</property> <property name="visible">True</property> @@ -27,7 +27,7 @@ <property name="height_request">32</property> <property name="visible">True</property> <child> - <widget class="GtkComboBox" id="combobox2"> + <widget class="GtkComboBox" id="mode_combobox"> <property name="width_request">200</property> <property name="height_request">29</property> <property name="visible">True</property> @@ -36,7 +36,7 @@ DataMatrix optical recogn. (beta) PDF417 bc. optical recogn. (beta) </property> - <signal name="changed" handler="on_combobox2_changed"/> + <signal name="changed" handler="on_mode_changed"/> </widget> <packing> <property name="expand">False</property> @@ -52,7 +52,7 @@ <property name="visible">True</property> <property name="spacing">11</property> <child> - <widget class="GtkRadioButton" id="radiobutton1"> + <widget class="GtkRadioButton" id="file_input_button"> <property name="width_request">21</property> <property name="height_request">21</property> <property name="visible">True</property> @@ -60,8 +60,8 @@ <property name="receives_default">False</property> <property name="use_underline">True</property> <property name="draw_indicator">True</property> - <property name="group">radiobutton2</property> - <signal name="toggled" handler="on_combobox2_changed"/> + <property name="group">sane_input_button</property> + <signal name="toggled" handler="on_file_input_button_toggled"/> </widget> <packing> <property name="expand">False</property> @@ -71,12 +71,12 @@ </packing> </child> <child> - <widget class="GtkFileChooserButton" id="filechooserbutton1"> + <widget class="GtkFileChooserButton" id="filechooserbutton"> <property name="width_request">168</property> <property name="height_request">29</property> <property name="visible">True</property> <property name="do_overwrite_confirmation">True</property> - <signal name="file_set" handler="on_filechooserbutton1_file_set"/> + <signal name="file_set" handler="on_filechooserbutton_file_set"/> </widget> <packing> <property name="expand">False</property> @@ -103,7 +103,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label9"> + <widget class="GtkLabel" id="scanned_code_label"> <property name="width_request">102</property> <property name="height_request">17</property> <property name="visible">True</property> @@ -117,11 +117,11 @@ </packing> </child> <child> - <widget class="GtkEventBox" id="eventbox2"> + <widget class="GtkEventBox" id="main_image_eventbox"> <property name="visible">True</property> - <signal name="button_press_event" handler="on_eventbox2_button_press_event"/> + <signal name="button_press_event" handler="on_main_image_eventbox_button_press_event"/> <child> - <widget class="GtkImage" id="image1"> + <widget class="GtkImage" id="main_image"> <property name="visible">True</property> </widget> </child> @@ -132,7 +132,7 @@ </packing> </child> <child> - <widget class="GtkEntry" id="entry1"> + <widget class="GtkEntry" id="output"> <property name="width_request">504</property> <property name="height_request">27</property> <property name="visible">True</property> @@ -148,7 +148,7 @@ </packing> </child> <child> - <widget class="GtkProgressBar" id="progressbar1"> + <widget class="GtkProgressBar" id="progressbar"> <property name="width_request">504</property> <property name="height_request">20</property> <property name="visible">True</property> @@ -174,7 +174,7 @@ <property name="height_request">30</property> <property name="visible">True</property> <child> - <widget class="GtkRadioButton" id="radiobutton2"> + <widget class="GtkRadioButton" id="sane_input_button"> <property name="label" translatable="yes">Standard SANE Interface</property> <property name="width_request">224</property> <property name="height_request">21</property> @@ -184,7 +184,7 @@ <property name="use_underline">True</property> <property name="active">True</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_combobox2_changed"/> + <signal name="toggled" handler="on_sane_input_button_toggled"/> </widget> <packing> <property name="expand">False</property> @@ -194,13 +194,13 @@ </packing> </child> <child> - <widget class="GtkButton" id="button1"> + <widget class="GtkButton" id="retry_button"> <property name="label" translatable="yes">Retry</property> <property name="width_request">60</property> <property name="height_request">29</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_button1_clicked"/> + <signal name="clicked" handler="on_retry_button_clicked"/> </widget> <packing> <property name="expand">False</property> @@ -218,7 +218,7 @@ </packing> </child> <child> - <widget class="GtkFrame" id="frame1"> + <widget class="GtkFrame" id="placement_frame"> <property name="visible">True</property> <property name="label_xalign">0</property> <child> @@ -229,7 +229,7 @@ <widget class="GtkFixed" id="fixed2"> <property name="visible">True</property> <child> - <widget class="GtkLabel" id="label2"> + <widget class="GtkLabel" id="position_label"> <property name="width_request">72</property> <property name="height_request">17</property> <property name="visible">True</property> @@ -240,7 +240,7 @@ </packing> </child> <child> - <widget class="GtkSpinButton" id="spinbutton1"> + <widget class="GtkSpinButton" id="position_x"> <property name="width_request">56</property> <property name="height_request">27</property> <property name="visible">True</property> @@ -248,14 +248,14 @@ <property name="adjustment">1 0 200 1 10 0</property> <property name="climb_rate">1</property> <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> + <signal name="value_changed" handler="on_placement_value_changed"/> </widget> <packing> <property name="x">80</property> </packing> </child> <child> - <widget class="GtkSpinButton" id="spinbutton2"> + <widget class="GtkSpinButton" id="position_y"> <property name="width_request">56</property> <property name="height_request">27</property> <property name="visible">True</property> @@ -263,14 +263,14 @@ <property name="adjustment">1 0 200 1 10 0</property> <property name="climb_rate">1</property> <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> + <signal name="value_changed" handler="on_placement_value_changed"/> </widget> <packing> <property name="x">144</property> </packing> </child> <child> - <widget class="GtkSpinButton" id="spinbutton3"> + <widget class="GtkSpinButton" id="size_x"> <property name="width_request">56</property> <property name="height_request">27</property> <property name="visible">True</property> @@ -278,7 +278,7 @@ <property name="adjustment">1 0 200 1 10 0</property> <property name="climb_rate">1</property> <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> + <signal name="value_changed" handler="on_placement_value_changed"/> </widget> <packing> <property name="x">80</property> @@ -286,7 +286,7 @@ </packing> </child> <child> - <widget class="GtkSpinButton" id="spinbutton4"> + <widget class="GtkSpinButton" id="size_y"> <property name="width_request">56</property> <property name="height_request">27</property> <property name="visible">True</property> @@ -294,7 +294,7 @@ <property name="adjustment">1 0 200 1 10 0</property> <property name="climb_rate">1</property> <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> + <signal name="value_changed" handler="on_placement_value_changed"/> </widget> <packing> <property name="x">144</property> @@ -302,7 +302,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label3"> + <widget class="GtkLabel" id="size_label"> <property name="width_request">72</property> <property name="height_request">17</property> <property name="visible">True</property> @@ -317,7 +317,7 @@ </widget> </child> <child> - <widget class="GtkLabel" id="label1"> + <widget class="GtkLabel" id="placement_label"> <property name="visible">True</property> <property name="label" translatable="yes">Placement</property> <property name="use_markup">True</property> @@ -340,7 +340,7 @@ <property name="height_request">30</property> <property name="visible">True</property> <child> - <widget class="GtkLabel" id="label5"> + <widget class="GtkLabel" id="orientation_label"> <property name="width_request">92</property> <property name="height_request">21</property> <property name="visible">True</property> @@ -354,7 +354,7 @@ </packing> </child> <child> - <widget class="GtkComboBox" id="combobox1"> + <widget class="GtkComboBox" id="orientation"> <property name="width_request">90</property> <property name="height_request">29</property> <property name="visible">True</property> @@ -362,7 +362,7 @@ 90 deg 180 deg 270 deg</property> - <signal name="changed" handler="on_combobox1_changed"/> + <signal name="changed" handler="on_orientation_changed"/> </widget> <packing> <property name="expand">False</property> @@ -392,7 +392,7 @@ <property name="height_request">31</property> <property name="visible">True</property> <child> - <widget class="GtkToggleButton" id="togglebutton1"> + <widget class="GtkToggleButton" id="scan_button"> <property name="label" translatable="yes">scan</property> <property name="width_request">90</property> <property name="height_request">29</property> @@ -400,7 +400,7 @@ <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_underline">True</property> - <signal name="toggled" handler="on_togglebutton1_toggled"/> + <signal name="toggled" handler="on_scan_button_clicked"/> </widget> <packing> <property name="fill">False</property> @@ -408,7 +408,7 @@ </packing> </child> <child> - <widget class="GtkButton" id="button2"> + <widget class="GtkButton" id="exit_button"> <property name="label" translatable="yes">exit</property> <property name="width_request">90</property> <property name="height_request">19</property> @@ -416,7 +416,7 @@ <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_button2_clicked"/> + <signal name="clicked" handler="on_exit_button_clicked"/> </widget> <packing> <property name="fill">False</property> @@ -441,7 +441,7 @@ </widget> </child> <child> - <widget class="GtkLabel" id="label4"> + <widget class="GtkLabel" id="scan_label"> <property name="visible">True</property> <property name="label" translatable="yes">SCAN</property> </widget> @@ -458,14 +458,14 @@ <property name="visible">True</property> <property name="resize_mode">immediate</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow3"> + <widget class="GtkScrolledWindow" id="device_info_scrolled"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">automatic</property> <property name="window_placement_set">True</property> <child> - <widget class="GtkTextView" id="textview3"> + <widget class="GtkTextView" id="device_info_text"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="editable">False</property> @@ -483,7 +483,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label6"> + <widget class="GtkLabel" id="device_info_label"> <property name="visible">True</property> <property name="label" translatable="yes">Device Info</property> </widget> @@ -504,7 +504,7 @@ <property name="height_request">80</property> <property name="visible">True</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow2"> + <widget class="GtkScrolledWindow" id="device_list_scrolled"> <property name="width_request">740</property> <property name="height_request">140</property> <property name="visible">True</property> @@ -512,7 +512,7 @@ <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">automatic</property> <child> - <widget class="GtkTreeView" id="treeview1"> + <widget class="GtkTreeView" id="device_treeview"> <property name="width_request">740</property> <property name="height_request">140</property> <property name="visible">True</property> @@ -526,14 +526,14 @@ </packing> </child> <child> - <widget class="GtkButton" id="button3"> + <widget class="GtkButton" id="device_chooser_button"> <property name="label" translatable="yes">OK</property> <property name="width_request">90</property> <property name="height_request">29</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_button3_clicked"/> + <signal name="clicked" handler="on_device_chooser_button_clicked"/> </widget> <packing> <property name="expand">False</property> @@ -559,7 +559,7 @@ </packing> </child> <child> - <widget class="GtkButton" id="button5"> + <widget class="GtkButton" id="blacklist_add_button"> <property name="label" translatable="yes">--></property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -573,7 +573,7 @@ </packing> </child> <child> - <widget class="GtkButton" id="button4"> + <widget class="GtkButton" id="blacklist_remove_button"> <property name="label" translatable="yes"><--</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -608,7 +608,7 @@ <property name="height_request">80</property> <property name="visible">True</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow4"> + <widget class="GtkScrolledWindow" id="blacklist_scrolled"> <property name="width_request">740</property> <property name="height_request">140</property> <property name="visible">True</property> @@ -616,7 +616,7 @@ <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">automatic</property> <child> - <widget class="GtkTreeView" id="treeview2"> + <widget class="GtkTreeView" id="blacklist_treeview"> <property name="width_request">740</property> <property name="height_request">140</property> <property name="visible">True</property> @@ -640,7 +640,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label7"> + <widget class="GtkLabel" id="blacklist_label"> <property name="visible">True</property> <property name="label" translatable="yes">Blacklist</property> </widget> @@ -655,14 +655,14 @@ <property name="visible">True</property> <property name="resize_mode">immediate</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow1"> + <widget class="GtkScrolledWindow" id="log_scrolled"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">automatic</property> <property name="window_placement_set">True</property> <child> - <widget class="GtkTextView" id="textview1"> + <widget class="GtkTextView" id="log_text"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="editable">False</property> @@ -680,7 +680,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label10"> + <widget class="GtkLabel" id="log_label"> <property name="visible">True</property> <property name="label" translatable="yes">Log</property> </widget> @@ -693,7 +693,7 @@ </widget> </child> </widget> - <widget class="GtkWindow" id="window3"> + <widget class="GtkWindow" id="img_popup"> <property name="type">popup</property> <property name="window_position">mouse</property> <property name="destroy_with_parent">True</property> @@ -702,13 +702,13 @@ <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <child> - <widget class="GtkEventBox" id="eventbox1"> + <widget class="GtkEventBox" id="popup_image_eventbox"> <property name="visible">True</property> <property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_PROXIMITY_IN_MASK | GDK_PROXIMITY_OUT_MASK | GDK_SUBSTRUCTURE_MASK | GDK_SCROLL_MASK</property> <property name="extension_events">all</property> <property name="visible_window">False</property> <child> - <widget class="GtkImage" id="image2"> + <widget class="GtkImage" id="popup_image"> <property name="visible">True</property> </widget> </child> Modified: branches/laserb/PyCodeOCR.py =================================================================== --- branches/laserb/PyCodeOCR.py 2011-02-11 11:33:53 UTC (rev 38) +++ branches/laserb/PyCodeOCR.py 2011-03-01 16:55:25 UTC (rev 39) @@ -7,7 +7,7 @@ # for many unix (and also windows) platforms. # python standard modules -import os, re, sys, subprocess, time, gobject, string, struct +import os, re, sys, time, gobject, string, struct # GTK, PyGTK, GLADE (GNOME) modules @@ -16,7 +16,13 @@ import gtk, gtk.glade import gobject -from checksum import modulo10 +# import Modules +from Modules.checksum import modulo10 +#from Modules.blacklist_manager import blacklist_manager +#from Modules.RunSane import RunSANE +from Modules.RunExternal import RunExternal +#from Modules.RunMagickWand import RunMagickWand +#from Modules.RunLibdmtx import RunLibdmtx # PIL image library and it's SANE bindings import Image, ImageDraw @@ -112,175 +118,214 @@ ## Initialize def __init__(self): # retrieve widgets - # window1 - main window + # main_window - main window ## gladefile raw_path.glade self.gladefile = raw_path + ".glade" ## get xml from gladefile self.xml = gtk.glade.XML(self.gladefile) ## main window - self.window1 = self.xml.get_widget('window1') + self.main_window = self.xml.get_widget('main_window') ## notebok - self.notebook = self.xml.get_widget('notebook1') + self.notebook = self.xml.get_widget('notebook') ## image window - self.window3 = self.xml.get_widget('window3') + self.img_popup = self.xml.get_widget('img_popup') ## scan button - self.togglebutton1 = self.xml.get_widget('togglebutton1') + self.scan_button = self.xml.get_widget('scan_button') ## restart button - self.button1 = self.xml.get_widget('button1') + self.retry_button = self.xml.get_widget('retry_button') ## exit button - self.button2 = self.xml.get_widget('button2') + self.exit_button = self.xml.get_widget('exit_button') ## placement frame - self.frame1 = self.xml.get_widget('frame1') + self.placement_frame = self.xml.get_widget('placement_frame') ## image - self.image1 = self.xml.get_widget('image1') + self.main_image = self.xml.get_widget('main_image') ## image - self.image2 = self.xml.get_widget('image2') + self.popup_image = self.xml.get_widget('popup_image') ## output line - self.entry1 = self.xml.get_widget('entry1') - self.textview1 = self.xml.get_widget('textview1') - self.textbuffer = self.textview1.get_buffer() - self.entry3 = self.xml.get_widget('textview3') + self.output = self.xml.get_widget('output') + self.log_text = self.xml.get_widget('log_text') + self.textbuffer = self.log_text.get_buffer() + self.entry3 = self.xml.get_widget('device_info_text') ## progressbar - self.progressbar1 = self.xml.get_widget('progressbar1') + self.progressbar = self.xml.get_widget('progressbar') ## Orientation label - self.label5 = self.xml.get_widget('label5') + self.placement_label = self.xml.get_widget('placement_label') ## Orientation combobox - self.combobox1 = self.xml.get_widget('combobox1') + self.orientation = self.xml.get_widget('orientation') ## mode combobox - self.combobox2 = self.xml.get_widget('combobox2') + self.mode_combobox = self.xml.get_widget('mode_combobox') ## x-position - self.spinbutton1 = self.xml.get_widget('spinbutton1') + self.position_x = self.xml.get_widget('position_x') ## y-position - self.spinbutton2 = self.xml.get_widget('spinbutton2') + self.position_y = self.xml.get_widget('position_y') ## x-size - self.spinbutton3 = self.xml.get_widget('spinbutton3') + self.size_x = self.xml.get_widget('size_x') ## y-size - self.spinbutton4 = self.xml.get_widget('spinbutton4') + self.size_y = self.xml.get_widget('size_y') ## file input - self.radiobutton1 = self.xml.get_widget('radiobutton1') + self.file_input_button = self.xml.get_widget('file_input_button') ## sane input - self.radiobutton2 = self.xml.get_widget('radiobutton2') + self.sane_input_button = self.xml.get_widget('sane_input_button') ## choose file - self.filechooserbutton1 = self.xml.get_widget('filechooserbutton1') + self.filechooserbutton = self.xml.get_widget('filechooserbutton') ## device list - self.treeview1 = self.xml.get_widget('treeview1') + self.device_treeview = self.xml.get_widget('device_treeview') ## blacklisted device list - self.treeview2 = self.xml.get_widget('treeview2') + self.blacklist_treeview = self.xml.get_widget('blacklist_treeview') ## OK button - self.button3 = self.xml.get_widget('button3') + self.device_chooser_button = self.xml.get_widget('device_chooser_button') ## event box for image - self.eventbox2 = self.xml.get_widget('eventbox2') + self.main_image_eventbox = self.xml.get_widget('main_image_eventbox') ## event box for image window - self.eventbox1 = self.xml.get_widget('eventbox1') - - # redirect print - self.logging = logging(self.textbuffer) - #sys.stdout = self.logging - #sys.stderr = self.logging - - print "---------",strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()),"----------" + self.popup_image_eventbox = self.xml.get_widget('popup_image_eventbox') # initiate orientation and position - self.combobox1.set_active(0) - self.spinbutton1.set_value(self.scan_koords[0]) - self.spinbutton2.set_value(self.scan_koords[1]) - self.spinbutton3.set_value(self.scan_koords[2]) - self.spinbutton4.set_value(self.scan_koords[3]) - self.combobox2.set_active(0) + self.orientation.set_active(0) + self.position_x.set_value(self.scan_koords[0]) + self.position_y.set_value(self.scan_koords[1]) + self.size_x.set_value(self.scan_koords[2]) + self.size_y.set_value(self.scan_koords[3]) + self.mode_combobox.set_active(0) if "gocr" not in pakages: - self.combobox2.remove_text(1) - self.combobox2.insert_text(1, "< not installed >") + self.mode_combobox.remove_text(1) + self.mode_combobox.insert_text(1, "< not installed >") if "libdmtx" not in pakages: - self.combobox2.remove_text(2) - self.combobox2.insert_text(2, "< not installed >") + self.mode_combobox.remove_text(2) + self.mode_combobox.insert_text(2, "< not installed >") if "pdf417decode" not in pakages: - self.combobox2.remove_text(3) - self.combobox2.insert_text(3, "< not installed >") - #self.on_radiobutton1_toggled() + self.mode_combobox.remove_text(3) + self.mode_combobox.insert_text(3, "< not installed >") # connect signal handlers self.xml.signal_autoconnect( self ) # connect eventbox to close image window -# self.eventbox1.connect('button_press_event', self.on_eventbox2_button_press_event) -# self.window1.connect('motion_notify_event', self.on_pointer_motion) -# self.window3.connect('leave-notify-event', self.on_leave_window) (self.new_width, self.new_height ) = (0,0) # set tooltips - self.button1.set_tooltip_text("Restart PyCodeOCR to search for a SANE device.") - self.button1.set_visible(True) - self.image1.set_tooltip_text("Click for bigger image") - self.image2.set_tooltip_text("Leave window to close") + self.retry_button.set_tooltip_text("Restart PyCodeOCR to search for a SANE device.") + self.retry_button.set_visible(True) + self.main_image.set_tooltip_text("Click for bigger image") + self.popup_image.set_tooltip_text("Leave window to close") - # take some time to init sane - #self.init_sane() + # redirect print + self.logging = logging(self.textbuffer) + #sys.stdout = self.logging + #sys.stderr = self.logging + + + # initialize treeviews in Blacklist Manager + BlacklistMgr.post_init(self.device_treeview, self.blacklist_treeview, local_path) + + print "---------",strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()),"----------" + + # init sane when idle, hopefully this is right after GUI is loaded gobject.idle_add(self.init_sane) # display window - self.window1.show() + self.main_window.show() return + ## Run gtk mainloop and with it THIS APP. + def run(self): + gtk.main() + + + ## initialize sane + # def init_sane(self, source=None): # lock window - self.window1.set_sensitive(False) + self.main_window.set_sensitive(False) # init sane - self.run_sane = RunSANE(self) + self.run_sane = RunSANE() - # try to set sensitivity, fails if no scanner is initialized yet - try: - self.init_sensitivity() - except: + # select device if more than one is found + if self.run_sane.found_scanner == None: # set default row to first - self.treeview1.set_cursor(0) + self.device_treeview.set_cursor(0) # show tab with device list # choose device and press ok to initialize scanner -# self.window2.show() self.notebook.set_current_page(2) + # unlock window + self.main_window.set_sensitive(True) + else: + # unlock window + self.main_window.set_sensitive(True) + # set sensitivity + self.init_sensitivity() + # return false, otherwise gobject runs it again return False + + def on_device_chooser_button_clicked(self, source=None): + self.device_chooser_button.set_visible(False) + # get selection from treeview + devnr = self.device_treeview.get_cursor()[0][0] + # init scanner + self.run_sane.init_scanner(devnr) + # set sensitivity + self.init_sensitivity() + ## set sensitivity of buttons the first time + def init_sensitivity(self): + # set sensitivity + if self.run_sane.found_scanner: + self.sane_input_button.set_active(True) + self.sane_input_button.set_sensitive(True) + else: + self.file_input_button.set_active(True) + self.sane_input_button.set_sensitive(False) + + # Try to set orientation and placement sensitive + self.toggle_orientation_sensitive(True) + self.toggle_placement_sensitive(True) + + ## toggle orientation sensitivity + def toggle_orientation_sensitive(self, value): + self.placement_label.set_sensitive(value) + self.orientation.set_sensitive(value) - ## Run gtk mainloop and with it THIS APP. - def run(self): - gtk.main() + ## toggle placement sensitivity + def toggle_placement_sensitive(self, value): + if self.sane_input_button.get_active(): + self.placement_frame.set_sensitive(value) + else: + self.placement_frame.set_sensitive(False) + + + ## signals / glade callbacks # - def on_leave_window(self, source=None, event=None): - if self.window3.get_visible(): - self.on_eventbox2_button_press_event() - self.notebook.set_current_page(3) - def on_pointer_motion(self, source=None, event=None): pass -# (x,y,state) = self.window1.window.get_pointer() -# (wxim, wyim ) = self.image1.get_size_request() +# (x,y,state) = self.main_window.window.get_pointer() +# (wxim, wyim ) = self.main_image.get_size_request() # if x > 16+(wxim-self.new_width)/2 and x < 16+(wxim+self.new_width)/2 and y > 75+(wyim-self.new_height)/2 and y < 75+(wyim+self.new_height)/2: -# if not self.window3.get_visible(): -# self.on_eventbox2_button_press_event() +# if not self.img_popup.get_visible(): +# self.on_main_image_eventbox_button_press_event() - def on_eventbox2_button_press_event(self, source=None, event=None): - if self.window3.get_visible(): + def on_main_image_eventbox_button_press_event(self, source=None, event=None): + if self.img_popup.get_visible(): # clean-up os.remove( self.image_file_big ) # hide window - self.window3.hide() + self.img_popup.hide() else: # load original image im1 = Image.open(self.imageFile) # adjust width and height to your needs and keep ratio (im_width, im_height) = im1.size #get image size # get size of shown image - width = self.image1.allocation.width - height = self.image1.allocation.height + width = self.main_image.allocation.width + height = self.main_image.allocation.height # make it bigger in window # size should be at least 600 @@ -302,80 +347,39 @@ self.image_file_big = self.temp+"06.jpg" im.save( self.image_file_big ) # set image - self.image2.set_from_file( self.image_file_big ) + self.popup_image.set_from_file( self.image_file_big ) # show window - self.window3.show() - - def on_button3_clicked(self, source=None): - self.button3.set_visible(False) - # get selection from treeview - devnr = self.treeview1.get_cursor()[0][0] - # hide window -# self.window2.hide() - # init scanner - self.run_sane.init_scanner(devnr) - # set sensitivity - self.init_sensitivity() + self.img_popup.show() + ## add device to blacklist def blacklist_add(self, widget=None): - treeselection = self.treeview1.get_selection() - model, iter =treeselection.get_selected() - data = model.get_value(iter, 0) - self.run_sane.blacklist_store.append([data]) - self.run_sane.list_store.remove(iter) - self.run_sane.write_blacklist() - + BlacklistMgr.blacklist_add() + ## remove device from blacklist def blacklist_remove(self, widget=None): - treeselection = self.treeview2.get_selection() - model, iter =treeselection.get_selected() - data = model.get_value(iter, 0) - self.run_sane.list_store.append([data]) - self.run_sane.blacklist_store.remove(iter) - self.run_sane.write_blacklist() + BlacklistMgr.blacklist_remove() - ## set sensitivity of buttons the first time - def init_sensitivity(self): - # set sensitivity - if len(self.run_sane.devices) == 0: - if self.run_sane.found_scanner: - self.radiobutton2.set_active(True) - self.radiobutton2.set_sensitive(True) - else: - self.radiobutton1.set_active(True) - self.radiobutton2.set_sensitive(False) - #self.on_radiobutton1_toggled() - self.progress(0.,"No SANE device found. Use file input instead.") - self.button1.set_visible(True) - - # unlock window - self.window1.set_sensitive(True) - - # Try to set orientation and placement sensitive. Will fail if no device is found - self.toggle_orientation_sensitive(True) - self.toggle_placement_sensitive(True) - ## one of the placement coordinates changed - def on_spinbutton_value_changed(self, source=None, event=None): - self.scan_koords = (self.spinbutton1.get_value(),self.spinbutton2.get_value(), - self.spinbutton3.get_value(),self.spinbutton4.get_value()) + def on_placement_value_changed(self, source=None, event=None): + self.scan_koords = (self.position_x.get_value(),self.position_y.get_value(), + self.size_x.get_value(),self.size_y.get_value()) ## Orientation changed - def on_combobox1_changed(self, source=None, event=None): - orient = self.combobox1.get_model()[self.combobox1.get_active()][0] + def on_orientation_changed(self, source=None, event=None): + orient = self.orientation.get_model()[self.orientation.get_active()][0] - self.spinbutton1.set_value(std_scan_koords[orient][0][0]) - self.spinbutton2.set_value(std_scan_koords[orient][0][1]) - self.spinbutton3.set_value(std_scan_koords[orient][0][2]) - self.spinbutton4.set_value(std_scan_koords[orient][0][3]) + self.position_x.set_value(std_scan_koords[orient][0][0]) + self.position_y.set_value(std_scan_koords[orient][0][1]) + self.size_x.set_value(std_scan_koords[orient][0][2]) + self.size_y.set_value(std_scan_koords[orient][0][3]) self.mode = std_scan_koords[orient][1] ## mode changed - def on_combobox2_changed(self, source=None): - op_mode = self.combobox2.get_active() + def on_mode_changed(self, source=None): + op_mode = self.mode_combobox.get_active() if (op_mode == self.MDE['invoices']): self.toggle_placement_sensitive(True) self.toggle_orientation_sensitive(True) @@ -390,12 +394,12 @@ self.toggle_orientation_sensitive(True) ## ToggleButton: 'scan'/'stop'. - def on_togglebutton1_toggled(self, source=None, event=None, *a): - if self.togglebutton1.get_active(): # scan ! - self.togglebutton1.set_label("stop") + def on_scan_button_clicked(self, source=None, event=None, *a): + if self.scan_button.get_active(): # scan ! + self.scan_button.set_label("stop") self.__stop = False - self.entry1.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color + self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color self.refresh() for i in range(self.max_retry): @@ -403,23 +407,23 @@ if check or (check == None) or self.__stop: break if self.__stop: return - self.entry1.modify_base(gtk.STATE_NORMAL, self.res_color[check]) # widget color + self.output.modify_base(gtk.STATE_NORMAL, self.res_color[check]) # widget color self.refresh() self.__stop = True # other way around; to be able to decide if it was stopped or ended correctly - self.togglebutton1.set_active(False) # (since this triggers THIS function again) + self.scan_button.set_active(False) # (since this triggers THIS function again) else: # stop/abort ! - self.togglebutton1.set_label("scan") + self.scan_button.set_label("scan") if self.__stop: return self.__stop = True - self.entry1.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color - self.progressbar1.set_text("Stopped by user!") + self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color + self.progressbar.set_text("Stopped by user!") self.refresh() return ## exit and restart - def on_button1_clicked(self, source=None, event=None): + def on_retry_button_clicked(self, source=None, event=None): try: self.run_sane.scanner.close() except: @@ -427,14 +431,14 @@ sane.exit() self.init_sane() # os.execv(sys.argv[0],sys.argv) -# self.on_window1_destroy() +# self.on_main_window_destroy() ## exit - def on_button2_clicked(self, source=None, event=None): - self.on_window1_destroy() + def on_exit_button_clicked(self, source=None, event=None): + self.on_main_window_destroy() ## press x-button on window - def on_window1_destroy(self, source=None, event=None): + def on_main_window_destroy(self, source=None, event=None): try: os.remove( self.temp+"04.jpg" ) # clean-up os.remove( self.image_file_small ) @@ -443,35 +447,16 @@ # exit gtk.main_quit() -# ## press x-button on device select window -# def on_window2_destroy(self, source=None): -# # when windows is closed by pressing the x-button -# # choose first device -# devnr = 0 -# # init scanner -# self.run_sane.init_scanner(self.progress, self.window2, self.treeview1, devnr) -# # set sensitivity -# self.init_sensitivity() ## file selected - def on_filechooserbutton1_file_set(self, source=None): - self.radiobutton1.set_active(True) - self.inp_file = self.filechooserbutton1.get_filename() + def on_filechooserbutton_file_set(self, source=None): + self.file_input_button.set_active(True) + self.inp_file = self.filechooserbutton.get_filename() if not os.path.exists(self.inp_file): self.progress(0., "File not found!") return None - ## toggle orientation sensitivity - def toggle_orientation_sensitive(self, value): - self.label5.set_sensitive(value) - self.combobox1.set_sensitive(value) - ## toggle placement sensitivity - def toggle_placement_sensitive(self, value): - if self.radiobutton2.get_active(): - self.frame1.set_sensitive(value) - else: - self.frame1.set_sensitive(False) # helpers # @@ -481,11 +466,11 @@ # (0/7) self.progress(0., "") max_steps = 7 - op_mode = self.combobox2.get_active() - source_mode = self.radiobutton2.get_active() + op_mode = self.mode_combobox.get_active() + source_mode = self.sane_input_button.get_active() if (op_mode == self.MDE['invoices']): # 0: invoices (tesser) - self.on_spinbutton_value_changed() # scan selected range - self.on_combobox1_changed() # orientation mode + self.on_placement_value_changed() # scan selected range + self.on_orientation_changed() # orientation mode opt = { 'tmp_file': "02.tif", 'recog_class': RunExternal, 'recog_cmd': self.cmd_tesser % (self.temp+"02", self.temp+"03"), @@ -493,7 +478,7 @@ 'valid_code_len': self.valid_code_len, 'resolution': 600, } elif (op_mode == self.MDE['barcode']): # 1: barcode (gocr) - self.on_combobox1_changed() # orientation mode + self.on_orientation_changed() # orientation mode self.scan_koords = std_scan_koords["A4"][0] #self.mode = std_scan_koords["A4"][1] opt = { 'tmp_file': "02.pnm", @@ -503,7 +488,7 @@ 'valid_code_len': [ 13, 10, 9 ], 'resolution': 300, } elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx) - #self.on_combobox1_changed() # orientation mode + #self.on_orientation_changed() # orientation mode self.scan_koords = std_scan_koords["A4"][0] self.mode = std_scan_koords["A4"][1] #pydmtx recognition @@ -523,8 +508,8 @@ # 'recog_cmd': (self.temp+"02.png", [ None ], RunLibdmtx), } # 'resolution': 150, } elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine) - self.on_spinbutton_value_changed() # scan selected range - self.on_combobox1_changed() # orientation mode + self.on_placement_value_changed() # scan selected range + self.on_orientation_changed() # orientation mode opt = { 'tmp_file': "02.png", 'recog_class': RunExternal, 'recog_cmd': self.cmd_pdf417dec % (self.temp+"02",), @@ -550,7 +535,7 @@ #del self.run_sane else: # direct file input self.progress(1./max_steps, "Reading image...") - #self.inp_file = self.filechooserbutton1.get_filename() + #self.inp_file = self.filechooserbutton.get_filename() #if not os.path.exists(self.inp_file): # self.progress(0., "File not found!") # return None @@ -655,26 +640,18 @@ # initialize modulo10 checksum m10 = modulo10() # check amount, account number and reference number - checksum_b = (int(amount[-1]) == m10.run(amount[:-1]) ) - checksum_k = (int(account[-1]) == m10.run(account[:-1]) ) - checksum_r = (int(reference[-1]) == m10.run(reference[:-1]) ) - print "Amount: "+str(int(amount[2:-1])/100.) +" "+ str(checksum_b) - print "Account number: "+account +" "+ str(checksum_k) - print "Reference number: "+reference +" "+ str(checksum_r) + try: + checksum_b = (int(amount[-1]) == m10.run(amount[:-1]) ) + checksum_k = (int(account[-1]) == m10.run(account[:-1]) ) + checksum_r = (int(reference[-1]) == m10.run(reference[:-1]) ) + print "Amount: "+str(int(amount[2:-1])/100.) +" "+ str(checksum_b) + print "Account number: "+account +" "+ str(checksum_k) + print "Reference number: "+reference +" "+ str(checksum_r) - checksum = checksum_b and checksum_k and checksum_r - -# if len(data) == 42: -# # extract details -# (tmp, betrag, tmp, referenz, tmp, konto, tmp) = struct.unpack("2s11ss16s2s9ss",data) -# print "Betrag: "+str(int(betrag[:-1])/100.) -# print "Konto: "+konto[:2]+"-"+konto[3:-2]+"-"+konto[-2:] -# print "Referenznr: "+referenz -# if check: -# # modulo10 checksum for betrag -# checknr = modulo10().run(betrag[:-1]) -# print "Checknr: ",checknr -# checknr = ( checknr == int(betrag[-1]) ) + checksum = checksum_b and checksum_k and checksum_r + except: + checksum = False + check = False elif (op_mode == self.MDE['barcode']): # 1: barcode check = not (data['type'] == "unknown") if check: @@ -711,7 +688,7 @@ if check: os.remove(self.temp+opt['tmp_file']) # clean-up - self.entry1.set_text(data) + self.output.set_text(data) # get the clipboard clipboard = gtk.clipboard_get() @@ -747,7 +724,7 @@ ## Refresh window during running processes. def refresh(self): - self.window1.queue_draw() + self.main_window.queue_draw() time.sleep(0.1) # give also some time to the user... :) while gtk.events_pending(): gtk.main_iteration() @@ -780,8 +757,8 @@ # adjust width and height to your needs and keep ratio (im_width, im_height) = im1.size #get image size #get needed size - width = self.image1.allocation.width - height = self.image1.allocation.height + width = self.main_image.allocation.width + height = self.main_image.allocation.height ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio self.new_width = int(im_width*ratio) self.new_height = int(im_height*ratio) @@ -797,12 +774,12 @@ # set image preview self.image_file_small = self.temp+"05.jpg" im.save( self.image_file_small ) - self.image1.set_from_file( self.image_file_small ) + self.main_image.set_from_file( self.image_file_small ) ## Set progress and refresh view. def progress(self, fract, text): - self.progressbar1.set_fraction(fract) - self.progressbar1.set_text(text) + self.progressbar.set_fraction(fract) + self.progressbar.set_text(text) self.refresh() ## Character correction after recogition (on basis that there should be numbers and few special chars). @@ -859,128 +836,7 @@ if not (data == olddata): print 'subst: "%s" => "%s"' % (item[0], item[1]) return data - -# def guiprint(self, text ): -# print text -# infile = open("log.txt","r") -# string = infile.read() -# infile.close() -# self.textbuffer.set_text(string) -# enditer = self.textbuffer.get_end_iter() -# self.textbuffer.insert(enditer,"\n%s" % text ) -## Run external shell command/application. -class RunExternal: - - error_msg = [ "/bin/sh: " ] - - ## initialize - def __init__(self, cmd, error_msg): - self.cmd = cmd - self.error_msg += error_msg - - ## call - def __call__(self): - (self.error, self.stdout, self.stderr) = self._run() - return self.error - - ## Execute external shell command. - def _run(self, piped=True): - if piped: - run = subprocess.Popen( self.cmd, - stdin =subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - shell=True ) - (stdoutdata, stderrdata) = run.communicate() - return ((max(map(stderrdata.find, self.error_msg)) != -1), stdoutdata, stderrdata) - else: - os.system( self.cmd ) - return (False, "", "") - -#class RunLibdmtx: -# """ Use libdmtx python wrapper/bindings (pydmtx). """ - -# def __init__(self, cmd, error_msg): -# #self.cmd = cmd -# #self.error_msg += error_msg -# self.filename = cmd - -# def __call__(self): -# (self.error, self.stdout, self.stderr) = self._run() -# return self.error - -# # thanks to: http://www.pastequestion.com/blog/python/how-to-use-python-imaging-library.html -# def _run(self): -# """ Read a Data Matrix barcode. """ -# dm_read = DataMatrix() -# #print self.filename -# img = Image.open(self.filename) -# try: -# self.decode = dm_read.decode(img.size[0], img.size[1], buffer(img.tostring())) -# self.count = dm_read.count() -# self.message = [ dm_read.message(i+1) for i in range(self.count) ] -# self.stats = [ dm_read.stats(i+1) for i in range(self.count) ] -# except: -# return (True, "error", sys.exc_info()[1]) - -# print "Detected %i DataMatrix barcodes" % self.count -# for i in range(self.count): -# print "Code # %i:" % (i+1) -# print self.message[i] -# stats = self.stats[i] -# print stats - -# # mark the recognized region and save back to file -# points = list(stats[1]) -# points.append(points[0]) -# draw = ImageDraw.Draw(img) -# old = points[0] -# for i, xy in enumerate(points[1:]): -# #draw.line(old+xy, fill=(0, 255, 0), width=2) -# #draw.line(old+xy, fill=(0, 255, 0)) -# draw.line(old+xy, fill="rgb(0, 255, 0)") -# old = xy -# img.save(self.filename) - -# #return (False, self.message, "") -# #print self.stats, (self.count == 0) -# return ((self.count == 0), self.message, "") - -#class RunMagickWand: -# """ Use Python bindings to ImageMagick's MagickWand API. """ -# # "convert %s.tif -crop 1600x250+800+960 -depth 8 %s.tif" -# # "convert %s.tif -crop 1700x250+750+960 -depth 8 %s.tif" -# # "convert %s.tif -crop 3400x500+1500+1900 -depth 8 %s.tif" -# # "convert %s.tif -depth 8 %s.tif" -# # "convert %s.tif -depth 8 -rotate %d %s.tif" -# # "convert %s.tif -depth 8 -rotate %d %s" -# #cmd_convert = "convert %s -depth 8 -rotate %d %s" -# -# def __init__(self, inp_filename, rotate, out_filename): -# self.inp_filename = inp_filename -# self.out_filename = out_filename -# self.angle = rotate -# self.depth = 8 -# -# def __call__(self): -# (self.error, self.stdout, self.stderr) = self._run() -# return self.error -# -# # thanks to: http://www.assembla.com/wiki/show/pythonmagickwand -# def _run(self): -# """ This rotates, changes depth, format and writes a new file. """ -# try: -# i = Image(self.inp_filename) -# i.rotate(self.angle) -# i.depth(self.depth) -# i.format = self.out_filename[-3:].upper() -# i.save(self.out_filename) -# except: -# return (True, "error", sys.exc_info()[1]) -# -# return (False, "ok", "") - ## sSANE/PIL interface python wrapper/bindings. class RunSANE: # "scanimage --format=tif --resolution 300 --mode Gray > %s.tif" @@ -990,78 +846,50 @@ resolution = 600 ## Init of sane interface -> device. - def __init__(self, main): - self.main = main + def __init__(self): print "init sane python interface ..." # Get the path set up properly #sys.path.append('.') - self.list_store = self.main.treeview1.get_model() - if self.list_store == None: - # create treeview things - self.list_store = gtk.ListStore(gobject.TYPE_STRING) - self.main.treeview1.set_model(self.list_store) - col = gtk.TreeViewColumn("Select Device to use:", gtk.CellRendererText(),text=0) - self.main.treeview1.append_column(col) - else: - self.list_store.clear() # get blacklist - self.read_blacklist() + self.blacklist = BlacklistMgr.read_blacklist() # init SANE self.n = 4. - self.main.progress(0.,"init sane python interface ...") + main.progress(0.,"init sane python interface ...") try: self.version = sane.init() - self.main.progress(1./self.n,"init sane python interface ... search devices") + main.progress(1./self.n,"init sane python interface ... search devices") # get sane devices - self.devices1 = sane.get_devices() - # init filtered list - self.devices = [] - - print "\n" - # add found devices to treeview - for i in range(len(self.devices1)): - # filter devices: remove blacklisted devices - if not self.devices1[i][1]+" "+self.devices1[i][2] in self.blacklist: - self.devices.append(self.devices1[i]) - print str(i)+": "+self.devices1[i][1]+" "+self.devices1[i][2] - self.list_store.append([self.devices1[i][1]+" "+self.devices1[i][2]]) -# else: -# print str(i)+": "+self.devices1[i][1]+" "+self.devices1[i][2]+" BLOCKED" - # self.devices is now filtered - + self.devices = sane.get_devices() + + # filter blacklisted devices + self.devices = BlacklistMgr.filter_devices(self.devices) # check how many devices we found if len(self.devices) == 0: - self.main.progress(0./self.n,"No device found.") + main.progress(0./self.n,"No device found.") + main.device_chooser_button.set_visible(False) self.found_scanner = False - elif len(self.list_store) > 1: - # more than one device, choose one. - self.main.progress(2./self.n,"More than one device found.") - if sys.argv[1:]: - # choose one by command line - devnr = raw_input("Choose device: ") - self.main.progress(2./self.n,"More than one device found. Choose device number %i" % devnr) - # continue to init scanner - self.init_scanner(devnr) - else: - # simply continue and select device in GUI ( see init_sane ) - self.main.progress(2./self.n,"More than one device found.") - self.main.notebook.set_current_page(2) - self.main.button3.set_visible(True) - self.found_scanner = False + elif len(self.devices) > 1: + # simply continue and select device in GUI ( see init_sane ) + main.progress(2./self.n,"More than one device found.") + main.device_chooser_button.set_visible(True) + self.found_scanner = None else: - # only one device found - self.main.progress(2./self.n,"Device: %s" % self.devices[0][1]+" "+self.devices[0][2]) + # only one device found, continue + main.progress(2./self.n,"Device: %s" % self.devices[0][1]+" "+self.devices[0][2]) + main.device_chooser_button.set_visible(False) # continue to init scanner self.init_scanner(0) except: # No device found at all self.found_scanner = False + main.device_chooser_button.set_visible(False) print "No sane device found. Retry again." + main.progress(0./self.n,"No sane device found. Retry again.") ## iInit of sane interface -> scanner def init_scanner(self, devnr): @@ -1070,7 +898,7 @@ # finish init device self.dev = self.devices[devnr][0] # choose device print "%s" % self.dev - self.main.progress(3./self.n,"Device initialized. Open scanner...") + main.progress(3./self.n,"Device initialized. Open scanner...") # open scanner device self.scanner = sane.open(self.dev) @@ -1078,17 +906,18 @@ self.opts = self.scanner.get_options() self.found_scanner = True - self.main.progress(4./self.n,"Ready: %s" % self.devices[devnr][1]+" "+self.devices[devnr][2]) + main.progress(4./self.n,"Ready: %s" % self.devices[devnr][1]+" "+s... [truncated message content] |
From: <la...@us...> - 2011-02-11 11:34:00
|
Revision: 38 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=38&view=rev Author: laserb Date: 2011-02-11 11:33:53 +0000 (Fri, 11 Feb 2011) Log Message: ----------- Add possibility to manage blacklist Modified Paths: -------------- branches/laserb/PyCodeOCR.glade branches/laserb/PyCodeOCR.py Modified: branches/laserb/PyCodeOCR.glade =================================================================== --- branches/laserb/PyCodeOCR.glade 2011-02-10 18:17:05 UTC (rev 37) +++ branches/laserb/PyCodeOCR.glade 2011-02-11 11:33:53 UTC (rev 38) @@ -218,138 +218,119 @@ </packing> </child> <child> - <widget class="GtkVBox" id="vbox6"> + <widget class="GtkFrame" id="frame1"> <property name="visible">True</property> + <property name="label_xalign">0</property> <child> - <widget class="GtkHBox" id="hbox8"> + <widget class="GtkAlignment" id="alignment1"> <property name="visible">True</property> + <property name="left_padding">12</property> <child> - <widget class="GtkLabel" id="label6"> - <property name="width_request">92</property> - <property name="height_request">17</property> + <widget class="GtkFixed" id="fixed2"> <property name="visible">True</property> - <property name="label" translatable="yes">Position:</property> + <child> + <widget class="GtkLabel" id="label2"> + <property name="width_request">72</property> + <property name="height_request">17</property> + <property name="visible">True</property> + <property name="label" translatable="yes">Position:</property> + </widget> + <packing> + <property name="y">8</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spinbutton1"> + <property name="width_request">56</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">1 0 200 1 10 0</property> + <property name="climb_rate">1</property> + <property name="numeric">True</property> + <signal name="value_changed" handler="on_spinbutton_value_changed"/> + </widget> + <packing> + <property name="x">80</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spinbutton2"> + <property name="width_request">56</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">1 0 200 1 10 0</property> + <property name="climb_rate">1</property> + <property name="numeric">True</property> + <signal name="value_changed" handler="on_spinbutton_value_changed"/> + </widget> + <packing> + <property name="x">144</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spinbutton3"> + <property name="width_request">56</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">1 0 200 1 10 0</property> + <property name="climb_rate">1</property> + <property name="numeric">True</property> + <signal name="value_changed" handler="on_spinbutton_value_changed"/> + </widget> + <packing> + <property name="x">80</property> + <property name="y">40</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spinbutton4"> + <property name="width_request">56</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">1 0 200 1 10 0</property> + <property name="climb_rate">1</property> + <property name="numeric">True</property> + <signal name="value_changed" handler="on_spinbutton_value_changed"/> + </widget> + <packing> + <property name="x">144</property> + <property name="y">40</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label3"> + <property name="width_request">72</property> + <property name="height_request">17</property> + <property name="visible">True</property> + <property name="label" translatable="yes">Size:</property> + </widget> + <packing> + <property name="y">48</property> + </packing> + </child> </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">4</property> - <property name="position">0</property> - </packing> </child> - <child> - <widget class="GtkSpinButton" id="spinbutton1"> - <property name="width_request">60</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">•</property> - <property name="adjustment">1 0 200 1 10 0</property> - <property name="climb_rate">1</property> - <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">4</property> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkSpinButton" id="spinbutton2"> - <property name="width_request">60</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">•</property> - <property name="adjustment">1 0 200 1 10 0</property> - <property name="climb_rate">1</property> - <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">4</property> - <property name="position">2</property> - </packing> - </child> </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">4</property> - <property name="position">0</property> - </packing> </child> <child> - <widget class="GtkHBox" id="hbox9"> + <widget class="GtkLabel" id="label1"> <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label7"> - <property name="width_request">92</property> - <property name="height_request">17</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Size:</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">4</property> - <property name="position">0</property> - </packing> - </child> - <child> - <widget class="GtkSpinButton" id="spinbutton3"> - <property name="width_request">60</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">•</property> - <property name="adjustment">1 0 200 1 10 0</property> - <property name="climb_rate">1</property> - <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">4</property> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkSpinButton" id="spinbutton4"> - <property name="width_request">60</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">•</property> - <property name="adjustment">1 0 200 1 10 0</property> - <property name="climb_rate">1</property> - <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">4</property> - <property name="position">2</property> - </packing> - </child> + <property name="label" translatable="yes">Placement</property> + <property name="use_markup">True</property> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">4</property> - <property name="position">1</property> + <property name="type">label_item</property> </packing> </child> </widget> <packing> <property name="expand">False</property> <property name="fill">False</property> + <property name="padding">4</property> <property name="position">1</property> </packing> </child> @@ -460,7 +441,7 @@ </widget> </child> <child> - <widget class="GtkLabel" id="label1"> + <widget class="GtkLabel" id="label4"> <property name="visible">True</property> <property name="label" translatable="yes">SCAN</property> </widget> @@ -502,7 +483,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label3"> + <widget class="GtkLabel" id="label6"> <property name="visible">True</property> <property name="label" translatable="yes">Device Info</property> </widget> @@ -513,59 +494,143 @@ </packing> </child> <child> - <widget class="GtkVBox" id="vbox1"> + <widget class="GtkHBox" id="hbox10"> <property name="width_request">100</property> <property name="height_request">80</property> <property name="visible">True</property> <child> - <widget class="GtkLabel" id="label10"> - <property name="width_request">416</property> - <property name="height_request">30</property> + <widget class="GtkVBox" id="vbox1"> + <property name="width_request">100</property> + <property name="height_request">80</property> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Select device to use.</property> + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow2"> + <property name="width_request">740</property> + <property name="height_request">140</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <widget class="GtkTreeView" id="treeview1"> + <property name="width_request">740</property> + <property name="height_request">140</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="enable_grid_lines">horizontal</property> + </widget> + </child> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="button3"> + <property name="label" translatable="yes">OK</property> + <property name="width_request">90</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="on_button3_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">0</property> </packing> </child> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow2"> - <property name="width_request">740</property> - <property name="height_request">140</property> + <widget class="GtkVBox" id="vbox8"> + <property name="width_request">75</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <child> - <widget class="GtkTreeView" id="treeview1"> - <property name="width_request">740</property> - <property name="height_request">140</property> + <widget class="GtkLabel" id="label12"> <property name="visible">True</property> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="button5"> + <property name="label" translatable="yes">--></property> + <property name="visible">True</property> <property name="can_focus">True</property> - <property name="enable_grid_lines">horizontal</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="blacklist_add"/> </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> </child> + <child> + <widget class="GtkButton" id="button4"> + <property name="label" translatable="yes"><--</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="image_position">right</property> + <signal name="clicked" handler="blacklist_remove"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label13"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">3</property> + </packing> + </child> </widget> <packing> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">1</property> </packing> </child> <child> - <widget class="GtkButton" id="button3"> - <property name="label" translatable="yes">OK</property> - <property name="width_request">90</property> - <property name="height_request">29</property> + <widget class="GtkVBox" id="vbox7"> + <property name="width_request">100</property> + <property name="height_request">80</property> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <signal name="clicked" handler="on_button3_clicked"/> + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow4"> + <property name="width_request">740</property> + <property name="height_request">140</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <widget class="GtkTreeView" id="treeview2"> + <property name="width_request">740</property> + <property name="height_request">140</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="enable_grid_lines">horizontal</property> + </widget> + </child> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">2</property> </packing> </child> @@ -575,7 +640,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label4"> + <widget class="GtkLabel" id="label7"> <property name="visible">True</property> <property name="label" translatable="yes">Blacklist</property> </widget> @@ -615,7 +680,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label2"> + <widget class="GtkLabel" id="label10"> <property name="visible">True</property> <property name="label" translatable="yes">Log</property> </widget> Modified: branches/laserb/PyCodeOCR.py =================================================================== --- branches/laserb/PyCodeOCR.py 2011-02-10 18:17:05 UTC (rev 37) +++ branches/laserb/PyCodeOCR.py 2011-02-11 11:33:53 UTC (rev 38) @@ -164,6 +164,8 @@ self.filechooserbutton1 = self.xml.get_widget('filechooserbutton1') ## device list self.treeview1 = self.xml.get_widget('treeview1') + ## blacklisted device list + self.treeview2 = self.xml.get_widget('treeview2') ## OK button self.button3 = self.xml.get_widget('button3') ## event box for image @@ -173,8 +175,8 @@ # redirect print self.logging = logging(self.textbuffer) - sys.stdout = self.logging - sys.stderr = self.logging + #sys.stdout = self.logging + #sys.stderr = self.logging print "---------",strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()),"----------" @@ -305,6 +307,7 @@ self.window3.show() def on_button3_clicked(self, source=None): + self.button3.set_visible(False) # get selection from treeview devnr = self.treeview1.get_cursor()[0][0] # hide window @@ -313,7 +316,26 @@ self.run_sane.init_scanner(devnr) # set sensitivity self.init_sensitivity() + + ## add device to blacklist + def blacklist_add(self, widget=None): + treeselection = self.treeview1.get_selection() + model, iter =treeselection.get_selected() + data = model.get_value(iter, 0) + self.run_sane.blacklist_store.append([data]) + self.run_sane.list_store.remove(iter) + self.run_sane.write_blacklist() + ## remove device from blacklist + def blacklist_remove(self, widget=None): + treeselection = self.treeview2.get_selection() + model, iter =treeselection.get_selected() + data = model.get_value(iter, 0) + self.run_sane.list_store.append([data]) + self.run_sane.blacklist_store.remove(iter) + self.run_sane.write_blacklist() + + ## set sensitivity of buttons the first time def init_sensitivity(self): # set sensitivity @@ -446,11 +468,10 @@ ## toggle placement sensitivity def toggle_placement_sensitive(self, value): - pass -# if self.radiobutton2.get_active(): -# self.frame1.set_sensitive(value) -# else: -# self.frame1.set_sensitive(False) + if self.radiobutton2.get_active(): + self.frame1.set_sensitive(value) + else: + self.frame1.set_sensitive(False) # helpers # @@ -975,15 +996,15 @@ # Get the path set up properly #sys.path.append('.') - list_store = self.main.treeview1.get_model() - if list_store == None: + self.list_store = self.main.treeview1.get_model() + if self.list_store == None: # create treeview things - list_store = gtk.ListStore(gobject.TYPE_STRING) - self.main.treeview1.set_model(list_store) - col = gtk.TreeViewColumn("Devices", gtk.CellRendererText(),text=0) + self.list_store = gtk.ListStore(gobject.TYPE_STRING) + self.main.treeview1.set_model(self.list_store) + col = gtk.TreeViewColumn("Select Device to use:", gtk.CellRendererText(),text=0) self.main.treeview1.append_column(col) else: - list_store.clear() + self.list_store.clear() # get blacklist self.read_blacklist() @@ -1006,16 +1027,16 @@ if not self.devices1[i][1]+" "+self.devices1[i][2] in self.blacklist: self.devices.append(self.devices1[i]) print str(i)+": "+self.devices1[i][1]+" "+self.devices1[i][2] - list_store.append([self.devices1[i][1]+" "+self.devices1[i][2]]) - else: - print str(i)+": "+self.devices1[i][1]+" "+self.devices1[i][2]+" BLOCKED" + self.list_store.append([self.devices1[i][1]+" "+self.devices1[i][2]]) +# else: +# print str(i)+": "+self.devices1[i][1]+" "+self.devices1[i][2]+" BLOCKED" # self.devices is now filtered # check how many devices we found if len(self.devices) == 0: self.main.progress(0./self.n,"No device found.") self.found_scanner = False - elif len(list_store) > 1: + elif len(self.list_store) > 1: # more than one device, choose one. self.main.progress(2./self.n,"More than one device found.") if sys.argv[1:]: @@ -1028,6 +1049,7 @@ # simply continue and select device in GUI ( see init_sane ) self.main.progress(2./self.n,"More than one device found.") self.main.notebook.set_current_page(2) + self.main.button3.set_visible(True) self.found_scanner = False else: @@ -1060,6 +1082,7 @@ self.info() self.main.notebook.set_current_page(0) + self.main.button3.set_visible(False) print "done." except: @@ -1135,18 +1158,35 @@ ## get blacklisted devices def read_blacklist(self): + self.blacklist_store = self.main.treeview2.get_model() + if self.blacklist_store == None: + # create treeview things + self.blacklist_store = gtk.ListStore(gobject.TYPE_STRING) + self.main.treeview2.set_model(self.blacklist_store) + blackcol = gtk.TreeViewColumn("Blacklisted Devices:", gtk.CellRendererText(),text=0) + self.main.treeview2.append_column(blackcol) + else: + self.blacklist_store.clear() + bl = open('%s/blacklist' % local_path, 'r' ) temp = bl.readlines() bl.close self.blacklist = [] for line in temp: self.blacklist.append(line.strip()) + self.blacklist_store.append([line.strip()]) ## write blacklisted devices # @todo add UI way to blacklist device - def write_blacklist(self, blacklist): + def write_blacklist(self): bl = open('%s/blacklist' % local_path, 'w' ) - bl.write(blacklist) + + model= self.main.treeview2.get_model() + iter = model.get_iter_first() + while( iter != None): + data = model.get_value(iter, 0) + bl.write(data+"\n") + iter = model.iter_next(iter) bl.close() if __name__ == '__main__': This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-02-10 18:17:12
|
Revision: 37 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=37&view=rev Author: laserb Date: 2011-02-10 18:17:05 +0000 (Thu, 10 Feb 2011) Log Message: ----------- Fully scalable interface (todo: change image size when rescaling), bigger image on click (minimum size 600px, or 2x bigger) / Small fixes with multiple printer selection and stdout redirection Modified Paths: -------------- branches/laserb/PyCodeOCR.glade branches/laserb/PyCodeOCR.py Modified: branches/laserb/PyCodeOCR.glade =================================================================== --- branches/laserb/PyCodeOCR.glade 2011-02-10 14:53:47 UTC (rev 36) +++ branches/laserb/PyCodeOCR.glade 2011-02-10 18:17:05 UTC (rev 37) @@ -15,89 +15,231 @@ <property name="can_focus">True</property> <property name="tab_pos">left</property> <child> - <widget class="GtkFixed" id="fixed1"> + <widget class="GtkHBox" id="hbox1"> + <property name="width_request">1284</property> + <property name="height_request">443</property> <property name="visible">True</property> <child> - <widget class="GtkProgressBar" id="progressbar1"> - <property name="width_request">504</property> - <property name="height_request">20</property> + <widget class="GtkVBox" id="vbox4"> <property name="visible">True</property> - <property name="pulse_step">0.10000000149</property> + <child> + <widget class="GtkHBox" id="hbox2"> + <property name="height_request">32</property> + <property name="visible">True</property> + <child> + <widget class="GtkComboBox" id="combobox2"> + <property name="width_request">200</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="items" translatable="yes">E-Banking invoice OCR +Barcode optical recogn. (beta) +DataMatrix optical recogn. (beta) +PDF417 bc. optical recogn. (beta) +</property> + <signal name="changed" handler="on_combobox2_changed"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox6"> + <property name="height_request">30</property> + <property name="visible">True</property> + <property name="spacing">11</property> + <child> + <widget class="GtkRadioButton" id="radiobutton1"> + <property name="width_request">21</property> + <property name="height_request">21</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <property name="group">radiobutton2</property> + <signal name="toggled" handler="on_combobox2_changed"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkFileChooserButton" id="filechooserbutton1"> + <property name="width_request">168</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="do_overwrite_confirmation">True</property> + <signal name="file_set" handler="on_filechooserbutton1_file_set"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label9"> + <property name="width_request">102</property> + <property name="height_request">17</property> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Scanned code:</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkEventBox" id="eventbox2"> + <property name="visible">True</property> + <signal name="button_press_event" handler="on_eventbox2_button_press_event"/> + <child> + <widget class="GtkImage" id="image1"> + <property name="visible">True</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">4</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="entry1"> + <property name="width_request">504</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">False</property> + <property name="invisible_char">•</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkProgressBar" id="progressbar1"> + <property name="width_request">504</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="pulse_step">0.10000000149</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">4</property> + </packing> + </child> </widget> <packing> - <property name="x">16</property> - <property name="y">208</property> + <property name="position">0</property> </packing> </child> <child> - <widget class="GtkEntry" id="entry1"> - <property name="width_request">504</property> - <property name="height_request">27</property> + <widget class="GtkVBox" id="vbox5"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">False</property> - <property name="invisible_char">•</property> - </widget> - <packing> - <property name="x">16</property> - <property name="y">168</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label5"> - <property name="width_request">90</property> - <property name="height_request">21</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Orientation:</property> - </widget> - <packing> - <property name="x">569</property> - <property name="y">160</property> - </packing> - </child> - <child> - <widget class="GtkComboBox" id="combobox1"> - <property name="width_request">90</property> - <property name="height_request">29</property> - <property name="visible">True</property> - <property name="items" translatable="yes">0 deg -90 deg -180 deg -270 deg</property> - <signal name="changed" handler="on_combobox1_changed"/> - </widget> - <packing> - <property name="x">691</property> - <property name="y">155</property> - </packing> - </child> - <child> - <widget class="GtkFrame" id="frame1"> - <property name="width_request">224</property> - <property name="height_request">91</property> - <property name="visible">True</property> - <property name="label_xalign">0</property> <child> - <widget class="GtkAlignment" id="alignment1"> + <widget class="GtkHBox" id="hbox3"> + <property name="height_request">30</property> <property name="visible">True</property> - <property name="left_padding">12</property> <child> - <widget class="GtkFixed" id="fixed2"> + <widget class="GtkRadioButton" id="radiobutton2"> + <property name="label" translatable="yes">Standard SANE Interface</property> + <property name="width_request">224</property> + <property name="height_request">21</property> <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_combobox2_changed"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="button1"> + <property name="label" translatable="yes">Retry</property> + <property name="width_request">60</property> + <property name="height_request">29</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="on_button1_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="vbox6"> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="hbox8"> + <property name="visible">True</property> <child> <widget class="GtkLabel" id="label6"> - <property name="width_request">72</property> + <property name="width_request">92</property> <property name="height_request">17</property> <property name="visible">True</property> <property name="label" translatable="yes">Position:</property> </widget> <packing> - <property name="y">8</property> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">0</property> </packing> </child> <child> <widget class="GtkSpinButton" id="spinbutton1"> - <property name="width_request">56</property> + <property name="width_request">60</property> <property name="height_request">27</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -108,12 +250,15 @@ <signal name="value_changed" handler="on_spinbutton_value_changed"/> </widget> <packing> - <property name="x">80</property> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">1</property> </packing> </child> <child> <widget class="GtkSpinButton" id="spinbutton2"> - <property name="width_request">56</property> + <property name="width_request">60</property> <property name="height_request">27</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -124,12 +269,40 @@ <signal name="value_changed" handler="on_spinbutton_value_changed"/> </widget> <packing> - <property name="x">144</property> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">2</property> </packing> </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox9"> + <property name="visible">True</property> <child> + <widget class="GtkLabel" id="label7"> + <property name="width_request">92</property> + <property name="height_request">17</property> + <property name="visible">True</property> + <property name="label" translatable="yes">Size:</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">0</property> + </packing> + </child> + <child> <widget class="GtkSpinButton" id="spinbutton3"> - <property name="width_request">56</property> + <property name="width_request">60</property> <property name="height_request">27</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -140,13 +313,15 @@ <signal name="value_changed" handler="on_spinbutton_value_changed"/> </widget> <packing> - <property name="x">80</property> - <property name="y">40</property> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">1</property> </packing> </child> <child> <widget class="GtkSpinButton" id="spinbutton4"> - <property name="width_request">56</property> + <property name="width_request">60</property> <property name="height_request">27</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -157,181 +332,129 @@ <signal name="value_changed" handler="on_spinbutton_value_changed"/> </widget> <packing> - <property name="x">144</property> - <property name="y">40</property> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">2</property> </packing> </child> - <child> - <widget class="GtkLabel" id="label7"> - <property name="width_request">72</property> - <property name="height_request">17</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Size:</property> - </widget> - <packing> - <property name="y">48</property> - </packing> - </child> </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">1</property> + </packing> </child> </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> </child> <child> + <widget class="GtkHBox" id="hbox4"> + <property name="width_request">1</property> + <property name="height_request">30</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label5"> + <property name="width_request">92</property> + <property name="height_request">21</property> + <property name="visible">True</property> + <property name="label" translatable="yes">Orientation:</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="combobox1"> + <property name="width_request">90</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="items" translatable="yes">0 deg +90 deg +180 deg +270 deg</property> + <signal name="changed" handler="on_combobox1_changed"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">2</property> + </packing> + </child> + <child> <widget class="GtkLabel" id="label8"> <property name="visible">True</property> - <property name="label" translatable="yes">Placement</property> - <property name="use_markup">True</property> </widget> <packing> - <property name="type">label_item</property> + <property name="position">3</property> </packing> </child> - </widget> - <packing> - <property name="x">558</property> - <property name="y">56</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label9"> - <property name="width_request">102</property> - <property name="height_request">17</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Scanned code:</property> - </widget> - <packing> - <property name="x">16</property> - <property name="y">55</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button2"> - <property name="label" translatable="yes">exit</property> - <property name="width_request">90</property> - <property name="height_request">29</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_button2_clicked"/> - </widget> - <packing> - <property name="x">692</property> - <property name="y">200</property> - </packing> - </child> - <child> - <widget class="GtkToggleButton" id="togglebutton1"> - <property name="label" translatable="yes">scan</property> - <property name="width_request">90</property> - <property name="height_request">29</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_underline">True</property> - <signal name="toggled" handler="on_togglebutton1_toggled"/> - </widget> - <packing> - <property name="x">568</property> - <property name="y">200</property> - </packing> - </child> - <child> - <widget class="GtkComboBox" id="combobox2"> - <property name="width_request">256</property> - <property name="height_request">31</property> - <property name="visible">True</property> - <property name="items" translatable="yes">E-Banking invoice OCR -Barcode optical recogn. (beta) -DataMatrix optical recogn. (beta) -PDF417 bc. optical recogn. (beta) -</property> - <signal name="changed" handler="on_combobox2_changed"/> - </widget> - <packing> - <property name="x">16</property> - <property name="y">16</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="radiobutton2"> - <property name="label" translatable="yes">Standard SANE Interface</property> - <property name="width_request">224</property> - <property name="height_request">21</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_combobox2_changed"/> - </widget> - <packing> - <property name="x">534</property> - <property name="y">24</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="radiobutton1"> - <property name="width_request">21</property> - <property name="height_request">21</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <property name="group">radiobutton2</property> - <signal name="toggled" handler="on_combobox2_changed"/> - </widget> - <packing> - <property name="x">318</property> - <property name="y">24</property> - </packing> - </child> - <child> - <widget class="GtkFileChooserButton" id="filechooserbutton1"> - <property name="width_request">168</property> - <property name="height_request">31</property> - <property name="visible">True</property> - <property name="do_overwrite_confirmation">True</property> - <signal name="file_set" handler="on_filechooserbutton1_file_set"/> - </widget> - <packing> - <property name="x">342</property> - <property name="y">16</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button1"> - <property name="label" translatable="yes">Retry</property> - <property name="width_request">60</property> - <property name="height_request">29</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <signal name="clicked" handler="on_button1_clicked"/> - </widget> - <packing> - <property name="x">721</property> - <property name="y">20</property> - </packing> - </child> - <child> - <widget class="GtkEventBox" id="eventbox2"> - <property name="width_request">505</property> - <property name="height_request">84</property> - <property name="visible">True</property> - <signal name="button_press_event" handler="on_eventbox2_button_press_event"/> <child> - <widget class="GtkImage" id="image1"> - <property name="width_request">505</property> - <property name="height_request">84</property> + <widget class="GtkHBox" id="hbox5"> + <property name="height_request">31</property> <property name="visible">True</property> + <child> + <widget class="GtkToggleButton" id="togglebutton1"> + <property name="label" translatable="yes">scan</property> + <property name="width_request">90</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <signal name="toggled" handler="on_togglebutton1_toggled"/> + </widget> + <packing> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="button2"> + <property name="label" translatable="yes">exit</property> + <property name="width_request">90</property> + <property name="height_request">19</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_button2_clicked"/> + </widget> + <packing> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">4</property> + <property name="position">4</property> + </packing> </child> </widget> <packing> - <property name="x">16</property> - <property name="y">75</property> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> </packing> </child> </widget> @@ -365,7 +488,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="editable">False</property> - <property name="wrap-mode">word</property> + <property name="wrap_mode">word</property> </widget> </child> </widget> @@ -390,24 +513,11 @@ </packing> </child> <child> - <widget class="GtkFixed" id="fixed3"> + <widget class="GtkVBox" id="vbox1"> + <property name="width_request">100</property> + <property name="height_request">80</property> <property name="visible">True</property> <child> - <widget class="GtkButton" id="button3"> - <property name="label" translatable="yes">OK</property> - <property name="width_request">90</property> - <property name="height_request">29</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <signal name="clicked" handler="on_button3_clicked"/> - </widget> - <packing> - <property name="x">662</property> - <property name="y">200</property> - </packing> - </child> - <child> <widget class="GtkLabel" id="label10"> <property name="width_request">416</property> <property name="height_request">30</property> @@ -416,8 +526,9 @@ <property name="label" translatable="yes">Select device to use.</property> </widget> <packing> - <property name="x">23</property> - <property name="y">12</property> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> </packing> </child> <child> @@ -439,13 +550,28 @@ </child> </widget> <packing> - <property name="x">15</property> - <property name="y">52</property> + <property name="position">1</property> </packing> </child> + <child> + <widget class="GtkButton" id="button3"> + <property name="label" translatable="yes">OK</property> + <property name="width_request">90</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="on_button3_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> </widget> <packing> - <property name="position">2</property> + <property name="position">3</property> </packing> </child> <child> @@ -475,7 +601,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="editable">False</property> - <property name="wrap-mode">word</property> + <property name="wrap_mode">word</property> </widget> </child> </widget> @@ -508,22 +634,23 @@ <property name="destroy_with_parent">True</property> <signal name="leave_notify_event" handler="on_eventbox2_button_press_event"/> <child> - <widget class="GtkFixed" id="fixed3"> + <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <child> <widget class="GtkEventBox" id="eventbox1"> - <property name="width_request">600</property> - <property name="height_request">600</property> <property name="visible">True</property> - <property name="events">GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK</property> + <property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_PROXIMITY_IN_MASK | GDK_PROXIMITY_OUT_MASK | GDK_SUBSTRUCTURE_MASK | GDK_SCROLL_MASK</property> + <property name="extension_events">all</property> + <property name="visible_window">False</property> <child> <widget class="GtkImage" id="image2"> - <property name="width_request">600</property> - <property name="height_request">600</property> <property name="visible">True</property> </widget> </child> </widget> + <packing> + <property name="position">0</property> + </packing> </child> </widget> </child> Modified: branches/laserb/PyCodeOCR.py =================================================================== --- branches/laserb/PyCodeOCR.py 2011-02-10 14:53:47 UTC (rev 36) +++ branches/laserb/PyCodeOCR.py 2011-02-10 18:17:05 UTC (rev 37) @@ -74,7 +74,7 @@ def write(self, text): enditer = self.textbuffer.get_end_iter() - self.textbuffer.insert(enditer,"\n%s" % text ) + self.textbuffer.insert(enditer,"%s" % text ) ## MainWindow # The GUI was created/designed using GLADE @@ -174,6 +174,7 @@ # redirect print self.logging = logging(self.textbuffer) sys.stdout = self.logging + sys.stderr = self.logging print "---------",strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()),"----------" @@ -208,8 +209,8 @@ # set tooltips self.button1.set_tooltip_text("Restart PyCodeOCR to search for a SANE device.") self.button1.set_visible(True) -# self.image1.set_tooltip_text("Click for bigger image") - self.image2.set_tooltip_text("Click to close") + self.image1.set_tooltip_text("Click for bigger image") + self.image2.set_tooltip_text("Leave window to close") # take some time to init sane #self.init_sane() @@ -240,7 +241,7 @@ # show tab with device list # choose device and press ok to initialize scanner # self.window2.show() - self.notebook.set_current_page(3) + self.notebook.set_current_page(2) return False @@ -257,11 +258,12 @@ self.notebook.set_current_page(3) def on_pointer_motion(self, source=None, event=None): - (x,y,state) = self.window1.window.get_pointer() - (wxim, wyim ) = self.image1.get_size_request() - if x > 16+(wxim-self.new_width)/2 and x < 16+(wxim+self.new_width)/2 and y > 75+(wyim-self.new_height)/2 and y < 75+(wyim+self.new_height)/2: - if not self.window3.get_visible(): - self.on_eventbox2_button_press_event() + pass +# (x,y,state) = self.window1.window.get_pointer() +# (wxim, wyim ) = self.image1.get_size_request() +# if x > 16+(wxim-self.new_width)/2 and x < 16+(wxim+self.new_width)/2 and y > 75+(wyim-self.new_height)/2 and y < 75+(wyim+self.new_height)/2: +# if not self.window3.get_visible(): +# self.on_eventbox2_button_press_event() def on_eventbox2_button_press_event(self, source=None, event=None): if self.window3.get_visible(): @@ -274,7 +276,21 @@ im1 = Image.open(self.imageFile) # adjust width and height to your needs and keep ratio (im_width, im_height) = im1.size #get image size - (width, height) = self.image2.get_size_request() #get needed size + # get size of shown image + width = self.image1.allocation.width + height = self.image1.allocation.height + + # make it bigger in window + # size should be at least 600 + if max(width,height) < 300: + ratio = min(600/float(width),600/float(height)) + width = ratio*width + height = ratio*height + # or 2x bigger + else: + width = 2*width + height = 2*height + ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio new_width = int(im_width*ratio) new_height = int(im_height*ratio) @@ -301,15 +317,16 @@ ## set sensitivity of buttons the first time def init_sensitivity(self): # set sensitivity - if self.run_sane.found_scanner: - self.radiobutton2.set_active(True) - self.radiobutton2.set_sensitive(True) - else: - self.radiobutton1.set_active(True) - self.radiobutton2.set_sensitive(False) - #self.on_radiobutton1_toggled() - self.progress(0.,"No SANE device found. Use file input instead.") - self.button1.set_visible(True) + if len(self.run_sane.devices) == 0: + if self.run_sane.found_scanner: + self.radiobutton2.set_active(True) + self.radiobutton2.set_sensitive(True) + else: + self.radiobutton1.set_active(True) + self.radiobutton2.set_sensitive(False) + #self.on_radiobutton1_toggled() + self.progress(0.,"No SANE device found. Use file input instead.") + self.button1.set_visible(True) # unlock window self.window1.set_sensitive(True) @@ -429,10 +446,11 @@ ## toggle placement sensitivity def toggle_placement_sensitive(self, value): - if self.radiobutton2.get_active(): - self.frame1.set_sensitive(value) - else: - self.frame1.set_sensitive(False) + pass +# if self.radiobutton2.get_active(): +# self.frame1.set_sensitive(value) +# else: +# self.frame1.set_sensitive(False) # helpers # @@ -740,7 +758,9 @@ # adjust width and height to your needs and keep ratio (im_width, im_height) = im1.size #get image size - (width, height) = self.image1.get_size_request() #get needed size + #get needed size + width = self.image1.allocation.width + height = self.image1.allocation.height ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio self.new_width = int(im_width*ratio) self.new_height = int(im_height*ratio) @@ -955,13 +975,16 @@ # Get the path set up properly #sys.path.append('.') + list_store = self.main.treeview1.get_model() + if list_store == None: + # create treeview things + list_store = gtk.ListStore(gobject.TYPE_STRING) + self.main.treeview1.set_model(list_store) + col = gtk.TreeViewColumn("Devices", gtk.CellRendererText(),text=0) + self.main.treeview1.append_column(col) + else: + list_store.clear() - # create treeview things - list_store = gtk.ListStore(gobject.TYPE_STRING) - self.main.treeview1.set_model(list_store) - col = gtk.TreeViewColumn("Devices", gtk.CellRendererText(),text=0) - self.main.treeview1.append_column(col) - # get blacklist self.read_blacklist() @@ -994,7 +1017,7 @@ self.found_scanner = False elif len(list_store) > 1: # more than one device, choose one. - progress(2./self.n,"More than one device found.") + self.main.progress(2./self.n,"More than one device found.") if sys.argv[1:]: # choose one by command line devnr = raw_input("Choose device: ") @@ -1002,8 +1025,10 @@ # continue to init scanner self.init_scanner(devnr) else: - # simply continue and select device in GUI ( look in init_sane ) + # simply continue and select device in GUI ( see init_sane ) self.main.progress(2./self.n,"More than one device found.") + self.main.notebook.set_current_page(2) + self.found_scanner = False else: # only one device found @@ -1014,7 +1039,7 @@ except: # No device found at all self.found_scanner = False - print "No sane device found. Restart to try it again." + print "No sane device found. Retry again." ## iInit of sane interface -> scanner def init_scanner(self, devnr): @@ -1034,12 +1059,13 @@ self.main.progress(4./self.n,"Ready: %s" % self.devices[devnr][1]+" "+self.devices[devnr][2]) self.info() + self.main.notebook.set_current_page(0) print "done." except: # init scanner failed. maybe device has no scanner self.found_scanner = False - print "Loading sane device failed. Restart to try it again." + print "Loading sane device failed. Retry again." @@ -1086,13 +1112,14 @@ def info(self): # print self.entry3.get_text() entrybuffer = self.main.entry3.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 -Selected device= %s -SaneDev object= %s -""" % ( self.version ,self.dev,self.scanner ) +# print """SANE version: %s +#Selected device= %s +#SaneDev object= %s +#""" % ( self.version ,self.dev,self.scanner ) # enditer = entrybuffer.get_end_iter() # entrybuffer.insert(enditer,"test") print 'SANE version: %s' % repr(self.version).replace('array',' ') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-02-10 14:47:26
|
Revision: 35 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=35&view=rev Author: laserb Date: 2011-02-10 14:47:19 +0000 (Thu, 10 Feb 2011) Log Message: ----------- Added Paths: ----------- branches/laserb/README branches/laserb/checksum.py Added: branches/laserb/README =================================================================== --- branches/laserb/README (rev 0) +++ branches/laserb/README 2011-02-10 14:47:19 UTC (rev 35) @@ -0,0 +1,149 @@ +# +# This is the official homepage of PyCodeOCR; Turn your scanner into a free document +# reader for invoices (e.g. for e-banking) with the help of tesseract-ocr available +# for many unix (and also windows) platforms. +# +# This software is developed under linux (fedora). +# +# Search for: +# * scanimage (SANE interface) +# * convert (ImageMagick) +# * tesseract-ocr +# * Python Imaging Library (PIL) +# * gocr +# * libdmtx +# * PDF417Decode.exe (by Morovia Corporation) through WINE +# for further information. +# +# +# ================================================================================ +# LICENCE +# +# The application uses SANE interface, ImageMagick, tesseract (and python) which +# are used under their own licences, but the main script is Public Domain. +# +# +# ================================================================================ +# DOWNLOAD +# +# Official releases from: +# https://sourceforge.net/projects/pycodeocr/ +# +# Browse SVN: +# http://pycodeocr.svn.sourceforge.net/viewvc/pycodeocr/ +# Latest (most recent) copy from SVN: +# svn co https://pycodeocr.svn.sourceforge.net/svnroot/pycodeocr pycodeocr +# More info about SVN: +# http://kb.gnuher.de/zzz_old_articles/various/HOWTO%20-%20SVN%20Kurzanleitung.txt +# +# +# ================================================================================ +# INSTALLATION / SETUP +# +# 1. step: (obviously you have to download this code) +# +# 2. step: if not alread present on your system install 'python' +# +# 3. step: install needed pakages for python, here is the list, you need to get +# the correct versions for your OS: +# * scanimage (SANE interface) +# * convert (ImageMagick) +# * tesseract +# http://code.google.com/p/tesseract-ocr/ +# (better would be to get the appropriate pakage for your distro) +# * Python Imaging Library (PIL) +# (AND SANE/PIL python bindings, in fedora e.g. 'python-imaging-sane') +# * gocr +# (self compiled or better get the appropriate pakage for your distro) +# [ binary/executable has to be in same folder as the script ] +# * libdmtx (you may have to compile this by yourself if it is not yet +# in your OS package repository; essentially you have to get all depen- +# dencies like 'ImageMagick-devel' for 'Wand' e.g., then compile it +# according to ./INSTALL, configure, make and so on, then install the +# python wrapper/bindings according to ./wrapper/python/README, and +# last you may have to use 'export LD_LIBRARY_PATH=/usr/local/lib' +# in shell to solve the "3.1. ImportError") +# http://www.libdmtx.org/downloads.php +# If you have installed libdmtx and it is still not working, then maybe +# your pydmtx.py is not installed correctly. You should find it in +# /usr/share/doc/libdmtx-dev/examples/python/ . Just follow the +# instructions given there. +# * PDF417Decode.exe (by Morovia Corporation) +# WINE is used to run this propietary/commercial Windows App., since +# it is free for private purposes. +# http://forums.morovia.com/free-pdf417-decoder-pdf417decode-t231.html +# [ binary/executable has to be in same folder as the script ] +# +# 4. step: run the script and enjoy the results and PLEASE report me any bugs or +# problems +# +# +# ================================================================================ +# ABOUT / INFO +# +# This script uses first the SANE scanner interface to scan a specific area (look +# at 'Orientation hints' below for more info). Then ImageMagick is used to adjust +# the data and TesserAct to do a proper OCR. Afterwards some fuzzy logic char re- +# placement is used to correct any recognition errors. Finally a verification of +# the retrieved code is performed and if successfull the code is pasted to clip- +# board - ready for pasting into your e-banking web formular. Additionally a pre- +# view of the scanned data is showed with the help of PIL. The GUI is cross plat- +# form since it is GTK/glade. +# Barcode support: gocr supports at least EAN128, EAN-8, EAN-13, may be others too +# libdmtx support different kinds of DataMatrix barcode +# and pdf417decoder supports PDF417 barcodes. +# Confer also http://de.wikipedia.org/wiki/Strichcode as reference, the english one +# http://en.wikipedia.org/wiki/Barcode was not yet checked. +# +# +# Orientation hints: +# +# ^^ The text on your invoice to scan is ^^ +# ^^ oriented this way (but mirrored). ^^ +# ^^ And in the lower right corner is the ^^ +# ^^ code to scan: #### CODE #### ^^ +# +# 0 deg (0°) +# +---------------------------+ +# | | +# | | +# | >>>>>>| +# | # | +# | | +# | >>>>>>| +# +---------------------------+ +# +# 90 deg (90°) +# +---------------------------+ +# | | +# | | +# | | +# | v # v| +# | v v| +# | v v| +# +---------------------------+ +# +# 180 deg (180°) +# +---------------------------+ +# | | +# | | +# | <<<<<<| +# | | +# | # | +# | <<<<<<| +# +---------------------------+ +# +# 270 deg (270°) +# +---------------------------+ +# | | +# | | +# | | +# | ^ ^| +# | ^ ^| +# | ^ # ^| +# +---------------------------+ +# +# If there is is any question or suggestion please contact me at sf.net, thanks! +# + + Added: branches/laserb/checksum.py =================================================================== --- branches/laserb/checksum.py (rev 0) +++ branches/laserb/checksum.py 2011-02-10 14:47:19 UTC (rev 35) @@ -0,0 +1,19 @@ +## @file checksum.py +# 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): + self.tabelle = [0,9,4,6,8,2,7,1,3,5] + + 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 + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-02-10 14:46:25
|
Revision: 34 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=34&view=rev Author: laserb Date: 2011-02-10 14:46:19 +0000 (Thu, 10 Feb 2011) Log Message: ----------- Added Paths: ----------- branches/laserb/blacklist Added: branches/laserb/blacklist =================================================================== --- branches/laserb/blacklist (rev 0) +++ branches/laserb/blacklist 2011-02-10 14:46:19 UTC (rev 34) @@ -0,0 +1 @@ +Printer Name This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-02-10 14:45:17
|
Revision: 33 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=33&view=rev Author: laserb Date: 2011-02-10 14:45:11 +0000 (Thu, 10 Feb 2011) Log Message: ----------- Removed Paths: ------------- branches/laserb/pycodeocr/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-02-10 14:43:13
|
Revision: 32 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=32&view=rev Author: laserb Date: 2011-02-10 14:43:07 +0000 (Thu, 10 Feb 2011) Log Message: ----------- Added Paths: ----------- branches/laserb/pycodeocr/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-02-10 14:30:58
|
Revision: 31 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=31&view=rev Author: laserb Date: 2011-02-10 14:30:52 +0000 (Thu, 10 Feb 2011) Log Message: ----------- Testing Branch for laserb Added Paths: ----------- branches/laserb/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2011-02-10 14:29:07
|
Revision: 30 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=30&view=rev Author: laserb Date: 2011-02-10 14:29:00 +0000 (Thu, 10 Feb 2011) Log Message: ----------- Added Paths: ----------- branches/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-11-11 19:20:01
|
Revision: 29 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=29&view=rev Author: laserb Date: 2010-11-11 19:19:54 +0000 (Thu, 11 Nov 2010) Log Message: ----------- Important bug fix! Corrected checksum calculation. Don't break if checksum is wrong but warn user, so if the code is recognized correct but checksum fails we can still use it. Added ckecksum for all length of code and for all three parts amount, account number and reference number. Modified Paths: -------------- PyCodeOCR.py checksum.py Modified: PyCodeOCR.py =================================================================== --- PyCodeOCR.py 2010-11-09 07:44:23 UTC (rev 28) +++ PyCodeOCR.py 2010-11-11 19:19:54 UTC (rev 29) @@ -576,17 +576,37 @@ # (5/?) self.progress(5./max_steps, "Check on validity...") if (op_mode == self.MDE['invoices']): # 0: invoices - check = (not "?" in data) # any unrecognized char in code? + check = (not "?" in data) or (not "!" in data) # any unrecognized char in code? check = check and ( len(data) in opt['valid_code_len'] ) # correct code len? - if len(data) == 42: - # extract details - (tmp, betrag, tmp, referenz, tmp, konto, tmp) = struct.unpack("2s11ss16s2s9ss",data) - print "Betrag: "+str(int(betrag[:-1])/100.) - print "Konto: "+konto[:2]+"-"+konto[3:-2]+"-"+konto[-2:] - print "Referenznr: "+referenz - # modulo10 checksum for betrag - checknr = modulo10().run(int(betrag[:-1])) - check = check and checknr == int(betrag[-1]) + if check: + tmp = data[:-1].split(">") + amount = tmp[0] + tmp = tmp[1].split("+ ") + reference = tmp[0] + account = tmp[1] + # initialize modulo10 checksum + m10 = modulo10() + # check amount, account number and reference number + checksum_b = (int(amount[-1]) == m10.run(amount[:-1]) ) + checksum_k = (int(account[-1]) == m10.run(account[:-1]) ) + checksum_r = (int(reference[-1]) == m10.run(reference[:-1]) ) + print "Amount: "+str(int(amount[2:-1])/100.),checksum_b + print "Account number: "+account,checksum_k + print "Reference number: "+reference,checksum_r + + checksum = checksum_b and checksum_k and checksum_r + +# if len(data) == 42: +# # extract details +# (tmp, betrag, tmp, referenz, tmp, konto, tmp) = struct.unpack("2s11ss16s2s9ss",data) +# print "Betrag: "+str(int(betrag[:-1])/100.) +# print "Konto: "+konto[:2]+"-"+konto[3:-2]+"-"+konto[-2:] +# print "Referenznr: "+referenz +# if check: +# # modulo10 checksum for betrag +# checknr = modulo10().run(betrag[:-1]) +# print "Checknr: ",checknr +# checknr = ( checknr == int(betrag[-1]) ) elif (op_mode == self.MDE['barcode']): # 1: barcode check = not (data['type'] == "unknown") if check: @@ -632,8 +652,10 @@ # make our data available to other applications clipboard.store() #print "data sent to (gtk/gnome) clipboard" - - self.progress(1., "Code recognized and sent to clipboard. Finished.") + if checksum: + self.progress(1., "Code recognized and sent to clipboard. Finished.") + else: + self.progress(1., "Code recognized and sent to clipboard, BUT checksum failed! CHECK code again! Finished.") else: # create debug info output log = file(self.debug[1], "w") Modified: checksum.py =================================================================== --- checksum.py 2010-11-09 07:44:23 UTC (rev 28) +++ checksum.py 2010-11-11 19:19:54 UTC (rev 29) @@ -1,19 +1,19 @@ ## @file checksum.py -# Checksum for 13 digit e-banking codes +# 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): self.tabelle = [0,9,4,6,8,2,7,1,3,5] + + def run(self,nr): self.uebertrag = 0 - - def run(self,number): - # make string - nr = str(number) # iterate over each character for i in range(len(nr)): - self.uebertrag = self.tabelle[(self.uebertrag + int(nr[i]))%10] + self.uebertrag = self.tabelle[(self.uebertrag + int(nr[i]) )%10] - return self.uebertrag + return (10-self.uebertrag)%10 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-11-09 07:44:29
|
Revision: 28 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=28&view=rev Author: laserb Date: 2010-11-09 07:44:23 +0000 (Tue, 09 Nov 2010) Log Message: ----------- show bigger image on mouse over Modified Paths: -------------- PyCodeOCR.py Modified: PyCodeOCR.py =================================================================== --- PyCodeOCR.py 2010-10-25 18:39:31 UTC (rev 27) +++ PyCodeOCR.py 2010-11-09 07:44:23 UTC (rev 28) @@ -181,6 +181,9 @@ # connect eventbox to close image window self.eventbox1.connect('button_press_event', self.on_eventbox2_button_press_event) + self.window1.connect('motion_notify_event', self.on_pointer_motion) + self.window3.connect('leave-notify-event', self.on_leave_window) + (self.new_width, self.new_height ) = (0,0) # set tooltips self.button1.set_tooltip_text("Restart PyCodeOCR to search for a SANE device.") @@ -226,6 +229,17 @@ ## signals / glade callbacks # + def on_leave_window(self, source=None, event=None): + if self.window3.get_visible(): + self.on_eventbox2_button_press_event() + + def on_pointer_motion(self, source=None, event=None): + (x,y,state) = self.window1.window.get_pointer() + (wxim, wyim ) = self.image1.get_size_request() + if x > 16+(wxim-self.new_width)/2 and x < 16+(wxim+self.new_width)/2 and y > 75+(wyim-self.new_height)/2 and y < 75+(wyim+self.new_height)/2: + if not self.window3.get_visible(): + self.on_eventbox2_button_press_event() + def on_eventbox2_button_press_event(self, source=None, event=None): if self.window3.get_visible(): # clean-up @@ -241,7 +255,6 @@ ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio new_width = int(im_width*ratio) new_height = int(im_height*ratio) - print self.image2.get_size_request() # resize to fit popup window im = im1.resize((new_width, new_height), Image.BILINEAR) # save @@ -678,13 +691,13 @@ (im_width, im_height) = im1.size #get image size (width, height) = self.image1.get_size_request() #get needed size ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio - new_width = int(im_width*ratio) - new_height = int(im_height*ratio) + self.new_width = int(im_width*ratio) + self.new_height = int(im_height*ratio) # use one of these filter options to resize the image #im = im1.resize((new_width, new_height), Image.NEAREST) # use nearest neighbour - im = im1.resize((new_width, new_height), Image.BILINEAR) # linear interpolation in a 2x2 environment + im = im1.resize((self.new_width, self.new_height), Image.BILINEAR) # linear interpolation in a 2x2 environment #im = im1.resize((new_width, new_height), Image.BICUBIC) # cubic spline interpolation in a 4x4 environment #im = im1.resize((new_width, new_height), Image.ANTIALIAS) # best down-sizing filter #ext = ".jpg" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-10-25 18:39:38
|
Revision: 27 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=27&view=rev Author: laserb Date: 2010-10-25 18:39:31 +0000 (Mon, 25 Oct 2010) Log Message: ----------- Initial support for Doxygen / added blacklist for devices / added checksum test for 42 digit OCR codes , calculates the last digit before the ">" which is a checksum for the amount before, returns an error if this failes / some minor fixes / !! AND support for bigger image view !! Modified Paths: -------------- PyCodeOCR.glade PyCodeOCR.py Added Paths: ----------- __init__.py blacklist checksum.py Modified: PyCodeOCR.glade =================================================================== --- PyCodeOCR.glade 2010-09-12 19:05:23 UTC (rev 26) +++ PyCodeOCR.glade 2010-10-25 18:39:31 UTC (rev 27) @@ -1,4 +1,4 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <glade-interface> <!-- interface-requires gtk+ 2.16 --> <!-- interface-naming-policy toplevel-contextual --> @@ -31,7 +31,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="editable">False</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </widget> <packing> <property name="x">16</property> @@ -39,17 +39,6 @@ </packing> </child> <child> - <widget class="GtkImage" id="image1"> - <property name="width_request">504</property> - <property name="height_request">84</property> - <property name="visible">True</property> - </widget> - <packing> - <property name="x">16</property> - <property name="y">75</property> - </packing> - </child> - <child> <widget class="GtkLabel" id="label5"> <property name="width_request">90</property> <property name="height_request">21</property> @@ -266,7 +255,7 @@ <property name="use_underline">True</property> <property name="active">True</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_radiobutton2_toggled"/> + <signal name="toggled" handler="on_combobox2_changed"/> </widget> <packing> <property name="x">534</property> @@ -283,7 +272,7 @@ <property name="use_underline">True</property> <property name="draw_indicator">True</property> <property name="group">radiobutton2</property> - <signal name="toggled" handler="on_radiobutton1_toggled"/> + <signal name="toggled" handler="on_combobox2_changed"/> </widget> <packing> <property name="x">318</property> @@ -317,6 +306,25 @@ <property name="y">20</property> </packing> </child> + <child> + <widget class="GtkEventBox" id="eventbox2"> + <property name="width_request">505</property> + <property name="height_request">84</property> + <property name="visible">True</property> + <signal name="button_press_event" handler="on_eventbox2_button_press_event"/> + <child> + <widget class="GtkImage" id="image1"> + <property name="width_request">505</property> + <property name="height_request">84</property> + <property name="visible">True</property> + </widget> + </child> + </widget> + <packing> + <property name="x">16</property> + <property name="y">75</property> + </packing> + </child> </widget> </child> </widget> @@ -371,4 +379,30 @@ </widget> </child> </widget> + <widget class="GtkWindow" id="window3"> + <property name="type">popup</property> + <property name="window_position">mouse</property> + <property name="destroy_with_parent">True</property> + <child> + <widget class="GtkFixed" id="fixed1"> + <property name="visible">True</property> + <child> + <widget class="GtkEventBox" id="eventbox1"> + <property name="width_request">600</property> + <property name="height_request">600</property> + <property name="visible">True</property> + <property name="events">GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK</property> + <child> + <widget class="GtkImage" id="image2"> + <property name="width_request">600</property> + <property name="height_request">600</property> + <property name="visible">True</property> + <signal name="button_press_event" handler="on_eventbox2_button_press_event"/> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> </glade-interface> Modified: PyCodeOCR.py =================================================================== --- PyCodeOCR.py 2010-09-12 19:05:23 UTC (rev 26) +++ PyCodeOCR.py 2010-10-25 18:39:31 UTC (rev 27) @@ -1,9 +1,13 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +## @file PyCodeOCR.py +# Turn your scanner into a free document +# reader for invoices +# (e.g. for e-banking) with the help of tesseract-ocr available +# for many unix (and also windows) platforms. - # python standard modules -import os, re, sys, subprocess, time, gobject +import os, re, sys, subprocess, time, gobject, string, struct # GTK, PyGTK, GLADE (GNOME) modules @@ -12,13 +16,15 @@ import gtk, gtk.glade import gobject +from checksum import modulo10 + # PIL image library and it's SANE bindings import Image, ImageDraw #from PIL import Image import sane # f12: 'python-imaging-sane' #(fedora 12 has no libWand, so it's not working at the moment...) -## ImageMagick's MagickWand API +# ImageMagick's MagickWand API #from pythonmagickwand.image import Image # search optional pakages @@ -26,6 +32,7 @@ os.environ["LD_LIBRARY_PATH"] = "/usr/local/lib" # os.system('python %s' % sys.argv[0]) # sys.exit() # +## list of available pakages pakages = [] # gocr if os.path.exists("gocr"): @@ -44,9 +51,13 @@ # global variables and constants +## path from which this program is currently executed local_path = os.path.realpath(os.path.dirname(sys.argv[0])) +## path of program without extension local_path/PyCodeOCR raw_path = os.path.join(local_path, os.path.splitext(sys.argv[0])[0]) +## users home path /home/user home_path = os.path.expanduser('~') +## default scanning coordinates std_scan_koords = { "0 deg": (( 82, 60, 20, 155 ), 0), # or with higher res. ( 820, 600, 200, 1559 ), "90 deg": (( 1, 82, 150, 20 ), 90), "180 deg": (( 3, 1, 20, 150 ), 180), @@ -54,7 +65,7 @@ "A4": (( 0, 0, 296, 215 ), 0), } # scan whole range (A4: http://www.cl.cam.ac.uk/~mgk25/iso-paper.html) #"A4": (( 0, 0, 290, 210 ), 0), } # (more secure; with small border) -# MainWindow +## MainWindow # The GUI was created/designed using GLADE # class MainWindowGTK: @@ -87,34 +98,64 @@ # (constants) MDE = { 'invoices': 0, 'barcode': 1, 'DataMatrix': 2, 'PDF417': 3 } + ## Initialize def __init__(self): - """ ... """ # retrieve widgets # window1 - main window + ## gladefile raw_path.glade self.gladefile = raw_path + ".glade" + ## get xml from gladefile self.xml = gtk.glade.XML(self.gladefile) + ## main window self.window1 = self.xml.get_widget('window1') + ## image window + self.window3 = self.xml.get_widget('window3') + ## scan button self.togglebutton1 = self.xml.get_widget('togglebutton1') + ## restart button self.button1 = self.xml.get_widget('button1') + ## exit button self.button2 = self.xml.get_widget('button2') + ## placement frame self.frame1 = self.xml.get_widget('frame1') + ## image self.image1 = self.xml.get_widget('image1') + ## image + self.image2 = self.xml.get_widget('image2') + ## output line self.entry1 = self.xml.get_widget('entry1') + ## progressbar self.progressbar1 = self.xml.get_widget('progressbar1') + ## Orientation label self.label5 = self.xml.get_widget('label5') + ## Orientation combobox self.combobox1 = self.xml.get_widget('combobox1') + ## mode combobox self.combobox2 = self.xml.get_widget('combobox2') + ## x-position self.spinbutton1 = self.xml.get_widget('spinbutton1') + ## y-position self.spinbutton2 = self.xml.get_widget('spinbutton2') + ## x-size self.spinbutton3 = self.xml.get_widget('spinbutton3') + ## y-size self.spinbutton4 = self.xml.get_widget('spinbutton4') + ## file input self.radiobutton1 = self.xml.get_widget('radiobutton1') + ## sane input self.radiobutton2 = self.xml.get_widget('radiobutton2') + ## choose file self.filechooserbutton1 = self.xml.get_widget('filechooserbutton1') - # window2 - sane + ## device select window self.window2 = self.xml.get_widget('window2') + ## device list self.treeview1 = self.xml.get_widget('treeview1') + ## OK button self.button3 = self.xml.get_widget('button3') + ## event box for image + self.eventbox2 = self.xml.get_widget('eventbox2') + ## event box for image window + self.eventbox1 = self.xml.get_widget('eventbox1') # initiate orientation and position self.combobox1.set_active(0) @@ -138,7 +179,14 @@ # connect signal handlers self.xml.signal_autoconnect( self ) + # connect eventbox to close image window + self.eventbox1.connect('button_press_event', self.on_eventbox2_button_press_event) + # set tooltips + self.button1.set_tooltip_text("Restart PyCodeOCR to search for a SANE device.") + self.image1.set_tooltip_text("Click for bigger image") + self.image2.set_tooltip_text("Click to close") + # take some time to init sane #self.init_sane() @@ -151,6 +199,7 @@ return + ## initialize sane def init_sane(self, source=None): # lock window self.window1.set_sensitive(False) @@ -171,22 +220,49 @@ return False + ## Run gtk mainloop and with it THIS APP. def run(self): - """ Run gtk mainloop and with it THIS APP. """ gtk.main() - # signals / glade callbacks + ## signals / glade callbacks # + def on_eventbox2_button_press_event(self, source=None, event=None): + if self.window3.get_visible(): + # clean-up + os.remove( self.image_file_big ) + # hide window + self.window3.hide() + else: + # load original image + im1 = Image.open(self.imageFile) + # adjust width and height to your needs and keep ratio + (im_width, im_height) = im1.size #get image size + (width, height) = self.image2.get_size_request() #get needed size + ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio + new_width = int(im_width*ratio) + new_height = int(im_height*ratio) + print self.image2.get_size_request() + # resize to fit popup window + im = im1.resize((new_width, new_height), Image.BILINEAR) + # save + self.image_file_big = self.temp+"06.jpg" + im.save( self.image_file_big ) + # set image + self.image2.set_from_file( self.image_file_big ) + # show window + self.window3.show() + def on_button3_clicked(self, source=None): # get selection from treeview devnr = self.treeview1.get_cursor()[0][0] # hide window - self.window2.destroy() + self.window2.hide() # init scanner self.run_sane.init_scanner(self.progress, self.window2, self.treeview1, devnr) # set sensitivity self.init_sensitivity() + ## set sensitivity of buttons the first time def init_sensitivity(self): # set sensitivity if self.run_sane.found_scanner: @@ -195,7 +271,7 @@ else: self.radiobutton1.set_active(True) self.radiobutton2.set_sensitive(False) - self.on_radiobutton1_toggled() + #self.on_radiobutton1_toggled() self.progress(0.,"No SANE device found. Use file input instead.") self.button1.set_visible(True) @@ -205,14 +281,14 @@ # Try to set orientation and placement sensitive. Will fail if no device is found self.toggle_orientation_sensitive(True) self.toggle_placement_sensitive(True) - + + ## one of the placement coordinates changed def on_spinbutton_value_changed(self, source=None, event=None): - """ Spinbutton value changed signal handler. """ self.scan_koords = (self.spinbutton1.get_value(),self.spinbutton2.get_value(), self.spinbutton3.get_value(),self.spinbutton4.get_value()) + ## Orientation changed def on_combobox1_changed(self, source=None, event=None): - """ Combobox changed signal handler. """ orient = self.combobox1.get_model()[self.combobox1.get_active()][0] self.spinbutton1.set_value(std_scan_koords[orient][0][0]) @@ -222,8 +298,9 @@ self.mode = std_scan_koords[orient][1] + ## mode changed def on_combobox2_changed(self, source=None): - op_mode = self.combobox2.get_active() + op_mode = self.combobox2.get_active() if (op_mode == self.MDE['invoices']): self.toggle_placement_sensitive(True) self.toggle_orientation_sensitive(True) @@ -237,8 +314,8 @@ self.toggle_placement_sensitive(True) self.toggle_orientation_sensitive(True) + ## ToggleButton: 'scan'/'stop'. def on_togglebutton1_toggled(self, source=None, event=None, *a): - """ ToggleButton: 'scan'/'stop'. """ if self.togglebutton1.get_active(): # scan ! self.togglebutton1.set_label("stop") self.__stop = False @@ -266,48 +343,49 @@ self.refresh() return - + ## exit and restart def on_button1_clicked(self, source=None, event=None): - """ Button: 'exit'. """ os.execv(sys.argv[0],sys.argv) self.on_window1_destroy() - + + ## exit def on_button2_clicked(self, source=None, event=None): - """ Button: 'exit'. """ self.on_window1_destroy() - + + ## press x-button on window def on_window1_destroy(self, source=None, event=None): - """ Window closed signal handler. """ + try: + os.remove( self.temp+"04.jpg" ) # clean-up + os.remove( self.image_file_small ) + except: + pass + # exit gtk.main_quit() - + + ## press x-button on device select window def on_window2_destroy(self, source=None): # when windows is closed by pressing the x-button # choose first device - if source != None: - devnr = 0 - # init scanner - self.run_sane.init_scanner(self.progress, self.window2, self.treeview1, devnr) - # set sensitivity - self.init_sensitivity() + devnr = 0 + # init scanner + self.run_sane.init_scanner(self.progress, self.window2, self.treeview1, devnr) + # set sensitivity + self.init_sensitivity() - def on_radiobutton1_toggled(self, source=None, event=None): - #self.filechooserbutton1.set_sensitive( self.radiobutton1.get_active() ) - self.on_combobox2_changed() - - def on_radiobutton2_toggled(self, source=None, event=None): - self.on_combobox2_changed() - + ## file selected def on_filechooserbutton1_file_set(self, source=None): self.radiobutton1.set_active(True) self.inp_file = self.filechooserbutton1.get_filename() if not os.path.exists(self.inp_file): self.progress(0., "File not found!") return None - + + ## toggle orientation sensitivity def toggle_orientation_sensitive(self, value): self.label5.set_sensitive(value) self.combobox1.set_sensitive(value) - + + ## toggle placement sensitivity def toggle_placement_sensitive(self, value): if self.radiobutton2.get_active(): self.frame1.set_sensitive(value) @@ -315,9 +393,9 @@ self.frame1.set_sensitive(False) # helpers - # + # + ## Main scanning and number recognition procedure. def scancode(self): - """ Main scanning and number recognition procedure. """ # Initialization of scanning process # (0/7) self.progress(0., "") @@ -386,7 +464,7 @@ self.run_sane.post_init(self.scan_koords, self.inp_file) # RunSANE().post_init(...) 2nd part of __init__(...) self.run_sane.resolution = opt["resolution"] if self.run_sane(): - self.progress(0., self.run_sane.stderr[:-1]) + self.progress(0., self.run_sane.stderr) return None #del self.run_sane else: # direct file input @@ -487,6 +565,15 @@ if (op_mode == self.MDE['invoices']): # 0: invoices check = (not "?" in data) # any unrecognized char in code? check = check and ( len(data) in opt['valid_code_len'] ) # correct code len? + if len(data) == 42: + # extract details + (tmp, betrag, tmp, referenz, tmp, konto, tmp) = struct.unpack("2s11ss16s2s9ss",data) + print "Betrag: "+str(int(betrag[:-1])/100.) + print "Konto: "+konto[:2]+"-"+konto[3:-2]+"-"+konto[-2:] + print "Referenznr: "+referenz + # modulo10 checksum for betrag + checknr = modulo10().run(int(betrag[:-1])) + check = check and checknr == int(betrag[-1]) elif (op_mode == self.MDE['barcode']): # 1: barcode check = not (data['type'] == "unknown") if check: @@ -555,31 +642,37 @@ # (7/7) return check + ## Refresh window during running processes. def refresh(self): - """ Refresh window during running processes. """ self.window1.queue_draw() time.sleep(0.1) # give also some time to the user... :) while gtk.events_pending(): gtk.main_iteration() - def setimage(self, imageFile): - """ Resize and set PIL image to gtk/gnome window. """ - # http://www.daniweb.com/code/snippet216637.html - # resize an image using the PIL image library - # free from: http://www.pythonware.com/products/pil/index.htm - # tested with Python24 vegaseat 11oct2005 - # open an image file (.bmp,.jpg,.png,.gif) you have in the working folder + ## Resize and set PIL image to gtk/gnome window. + # resize an image using the PIL image library + # tested with Python24 vegaseat 11oct2005 + # open an image file (.bmp,.jpg,.png,.gif) you have in the working folder + # @see http://www.daniweb.com/code/snippet216637.html + # @see http://www.pythonware.com/products/pil/index.htm + def setimage(self, imageFile): print imageFile[-3:] if imageFile[-3:] in ["bmp","jpg","png","gif"]: #already in right format - im1 = Image.open(imageFile) + # original file name + self.imageFile = imageFile + # load file + im1 = Image.open(self.imageFile) else: #convert Image self.run_convert = RunExternal(self.cmd_convert % (imageFile, 0, self.temp+"04.jpg"), error_msg=[ "convert: unable to open image" ]) if self.run_convert(): self.progress(0., self.run_convert.stderr[:-1]) - return None - im1 = Image.open(self.temp+"04.jpg") + return None + # original filename + self.imageFile = self.temp+"04.jpg" + # load file + im1 = Image.open(self.imageFile) # adjust width and height to your needs and keep ratio (im_width, im_height) = im1.size #get image size @@ -596,19 +689,19 @@ #im = im1.resize((new_width, new_height), Image.ANTIALIAS) # best down-sizing filter #ext = ".jpg" - image_file = self.temp+"04.jpg" - im.save( image_file ) - self.image1.set_from_file( image_file ) - os.remove( image_file ) # clean-up + # set image preview + self.image_file_small = self.temp+"05.jpg" + im.save( self.image_file_small ) + self.image1.set_from_file( self.image_file_small ) + ## Set progress and refresh view. def progress(self, fract, text): - """ Set progress and refresh view. """ self.progressbar1.set_fraction(fract) self.progressbar1.set_text(text) self.refresh() + ## Character correction after recogition (on basis that there should be numbers and few special chars). def char_correction(self, data): - """ Character correction after recogition (on basis that there should be numbers and few special chars). """ data = re.sub("\n", "", data) print data corrections = [ @@ -662,22 +755,23 @@ return data - +## Run external shell command/application. class RunExternal: - """ Run external shell command/application. """ error_msg = [ "/bin/sh: " ] + ## initialize def __init__(self, cmd, error_msg): self.cmd = cmd self.error_msg += error_msg + ## call def __call__(self): (self.error, self.stdout, self.stderr) = self._run() return self.error + ## Execute external shell command. def _run(self, piped=True): - """ Execute external shell command. """ if piped: run = subprocess.Popen( self.cmd, stdin =subprocess.PIPE, @@ -773,16 +867,16 @@ # # return (False, "ok", "") +## sSANE/PIL interface python wrapper/bindings. class RunSANE: - """ SANE/PIL interface python wrapper/bindings. """ # "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, progress, window2, treeview): - """ Init of sane and scanner. """ print "init sane python interface ...", sys.stdout.flush() @@ -794,6 +888,9 @@ treeview.set_model(list_store) col = gtk.TreeViewColumn("Devices", gtk.CellRendererText(),text=0) treeview.append_column(col) + + # get blacklist + self.read_blacklist() # init SANE self.n=4. @@ -801,15 +898,28 @@ try: self.version = sane.init() progress(1./self.n,"init sane python interface ... search devices") - self.devices = sane.get_devices() + # get sane devices + self.devices1 = sane.get_devices() + # init filtered list + self.devices = [] + print "\n" # add found devices to treeview - for i in range(len(self.devices)): - print str(i)+": "+self.devices[i][1]+" "+self.devices[i][2] - list_store.append([self.devices[i][1]+" "+self.devices[i][2]]) + for i in range(len(self.devices1)): + # filter devices: remove blacklisted devices + if not self.devices1[i][1]+" "+self.devices1[i][2] in self.blacklist: + self.devices.append(self.devices1[i]) + print str(i)+": "+self.devices1[i][1]+" "+self.devices1[i][2] + list_store.append([self.devices1[i][1]+" "+self.devices1[i][2]]) + else: + print str(i)+": "+self.devices1[i][1]+" "+self.devices1[i][2]+" BLOCKED" + # self.devices is now filtered # check how many devices we found - if len(self.devices) > 1: + if len(self.devices) == 0: + progress(0./self.n,"No device found.") + self.found_scanner = False + elif len(list_store) > 1: # more than one device, choose one. progress(2./self.n,"More than one device found.") if sys.argv[1:]: @@ -832,12 +942,14 @@ # No device found at all self.found_scanner = False print "No sane device found. Restart to try it again." - + + ## iInit of sane interface -> scanner def init_scanner(self, progress, window2, treeview, devnr): - + print "Use device number: "+str(devnr) try: # finish init device - self.dev = sane.get_devices()[devnr][0] # choose first device + self.dev = self.devices[devnr][0] # choose first device + print self.dev progress(3./self.n,"Device initialized. Open scanner...") # open scanner device @@ -847,7 +959,7 @@ self.found_scanner = True - progress(4./self.n,"Ready.") + progress(4./self.n,"Ready: %s" % self.devices[devnr][1]+" "+self.devices[devnr][2]) print "done." except: @@ -856,20 +968,21 @@ print "Loading sane device failed. Restart to try it again." + ## Not init of sane and scanner, but of scan operation. def post_init(self, coords, out_filename): - """ Not init of sane and scanner, but of scan operation. """ 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 - # thanks to: http://mail.python.org/pipermail/image-sig/1997-June/000307.html - # (may be look also at: http://sane-pygtk.sourceforge.net/) + ## 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): - """ Scan and save the PIL image object to file. """ try: # Set scan parameters (also with higher resolution!) (t, l, y, x) = self.coords @@ -885,7 +998,7 @@ # 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) @@ -895,8 +1008,8 @@ return (False, "ok", "") + ## Show some info about the scanner and SANE. def info(self): - """ Show some info about the scanner and SANE. """ print 'SANE version:', self.version print 'Available devices=', self.devices print 'Selected device=', self.dev #, "\n" @@ -905,10 +1018,24 @@ print 'Device parameters:', self.params #print 'Device options:', "\n",self.opts + ## get blacklisted devices + def read_blacklist(self): + bl = open('%s/blacklist' % local_path, 'r' ) + temp = bl.readlines() + bl.close + self.blacklist = [] + for line in temp: + self.blacklist.append(line.strip()) + ## write blacklisted devices + # @todo add UI way to blacklist device + def write_blacklist(self, blacklist): + bl = open('%s/blacklist' % local_path, 'w' ) + bl.write(blacklist) + bl.close() if __name__ == '__main__': - # run main application + ## run main application main = MainWindowGTK() main.run() Added: __init__.py =================================================================== Added: blacklist =================================================================== --- blacklist (rev 0) +++ blacklist 2010-10-25 18:39:31 UTC (rev 27) @@ -0,0 +1 @@ +Printer Name Added: checksum.py =================================================================== --- checksum.py (rev 0) +++ checksum.py 2010-10-25 18:39:31 UTC (rev 27) @@ -0,0 +1,19 @@ +## @file checksum.py +# Checksum for 13 digit 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 ) + def __init__(self): + self.tabelle = [0,9,4,6,8,2,7,1,3,5] + self.uebertrag = 0 + + def run(self,number): + # make string + nr = str(number) + # iterate over each character + for i in range(len(nr)): + self.uebertrag = self.tabelle[(self.uebertrag + int(nr[i]))%10] + + return self.uebertrag + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-09-12 19:05:29
|
Revision: 26 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=26&view=rev Author: laserb Date: 2010-09-12 19:05:23 +0000 (Sun, 12 Sep 2010) Log Message: ----------- replace remaining inp_file to self.inp_file Modified Paths: -------------- PyCodeOCR.py Modified: PyCodeOCR.py =================================================================== --- PyCodeOCR.py 2010-09-12 19:04:08 UTC (rev 25) +++ PyCodeOCR.py 2010-09-12 19:05:23 UTC (rev 26) @@ -381,9 +381,9 @@ # (1/?) if source_mode: # SANE scanning interface self.progress(1./max_steps, "Scanning data...") - inp_file = self.temp+"01.tif" + self.inp_file = self.temp+"01.tif" #self.run_sane = RunExternal(self.cmd_scan % ( self.scan_koords + (inp_file,) ), [ "no SANE devices found" ]) - self.run_sane.post_init(self.scan_koords, inp_file) # RunSANE().post_init(...) 2nd part of __init__(...) + self.run_sane.post_init(self.scan_koords, self.inp_file) # RunSANE().post_init(...) 2nd part of __init__(...) self.run_sane.resolution = opt["resolution"] if self.run_sane(): self.progress(0., self.run_sane.stderr[:-1]) @@ -417,7 +417,7 @@ #if (op_mode == self.MDE['invoices']): # 0: invoices self.setimage( self.temp+opt['tmp_file'] ) if source_mode: # SANE scanning interface - os.remove(inp_file) # clean-up + os.remove(self.inp_file) # clean-up del self.run_convert self.refresh() if self.__stop: return This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-09-12 19:04:14
|
Revision: 25 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=25&view=rev Author: laserb Date: 2010-09-12 19:04:08 +0000 (Sun, 12 Sep 2010) Log Message: ----------- just fix image visibility Modified Paths: -------------- PyCodeOCR.glade Modified: PyCodeOCR.glade =================================================================== --- PyCodeOCR.glade 2010-09-11 07:34:37 UTC (rev 24) +++ PyCodeOCR.glade 2010-09-12 19:04:08 UTC (rev 25) @@ -42,6 +42,7 @@ <widget class="GtkImage" id="image1"> <property name="width_request">504</property> <property name="height_request">84</property> + <property name="visible">True</property> </widget> <packing> <property name="x">16</property> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-09-11 07:34:43
|
Revision: 24 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=24&view=rev Author: laserb Date: 2010-09-11 07:34:37 +0000 (Sat, 11 Sep 2010) Log Message: ----------- init sane after GUI is loaded. this way we can give feedback what we are doing. / first try to allow a graphical possibility to select a device if more than one is found. (maybe not so nice, but simple) Modified Paths: -------------- PyCodeOCR.py Modified: PyCodeOCR.py =================================================================== --- PyCodeOCR.py 2010-09-11 07:31:54 UTC (rev 23) +++ PyCodeOCR.py 2010-09-11 07:34:37 UTC (rev 24) @@ -3,8 +3,9 @@ # python standard modules -import os, re, sys, subprocess, time +import os, re, sys, subprocess, time, gobject + # GTK, PyGTK, GLADE (GNOME) modules import pygtk pygtk.require('2.0') @@ -89,6 +90,7 @@ def __init__(self): """ ... """ # retrieve widgets + # window1 - main window self.gladefile = raw_path + ".glade" self.xml = gtk.glade.XML(self.gladefile) self.window1 = self.xml.get_widget('window1') @@ -109,6 +111,10 @@ self.radiobutton1 = self.xml.get_widget('radiobutton1') self.radiobutton2 = self.xml.get_widget('radiobutton2') self.filechooserbutton1 = self.xml.get_widget('filechooserbutton1') + # window2 - sane + self.window2 = self.xml.get_widget('window2') + self.treeview1 = self.xml.get_widget('treeview1') + self.button3 = self.xml.get_widget('button3') # initiate orientation and position self.combobox1.set_active(0) @@ -132,17 +138,57 @@ # connect signal handlers self.xml.signal_autoconnect( self ) + # take some time to init sane - self.init_sane() + #self.init_sane() + # init sane when idle, hopefully this is right after GUI is loaded + gobject.idle_add(self.init_sane) + + # display window self.window1.show() return def init_sane(self, source=None): - self.run_sane = RunSANE() + # lock window + self.window1.set_sensitive(False) + # init sane + self.run_sane = RunSANE(self.progress, self.window2, self.treeview1) + # try to set sensitivity, fails if no scanner is initialized yet + try: + self.init_sensitivity() + except: + # set default row to first + self.treeview1.set_cursor(0) + + # show window with device list + # choose device and press ok to initialize scanner + self.window2.show() + + return False + + + def run(self): + """ Run gtk mainloop and with it THIS APP. """ + gtk.main() + + # signals / glade callbacks + # + def on_button3_clicked(self, source=None): + # get selection from treeview + devnr = self.treeview1.get_cursor()[0][0] + # hide window + self.window2.destroy() + # init scanner + self.run_sane.init_scanner(self.progress, self.window2, self.treeview1, devnr) + # set sensitivity + self.init_sensitivity() + + def init_sensitivity(self): + # set sensitivity if self.run_sane.found_scanner: self.radiobutton2.set_active(True) self.radiobutton2.set_sensitive(True) @@ -150,20 +196,16 @@ self.radiobutton1.set_active(True) self.radiobutton2.set_sensitive(False) self.on_radiobutton1_toggled() - self.progressbar1.set_text("No sane device found.") + self.progress(0.,"No SANE device found. Use file input instead.") self.button1.set_visible(True) - - #Try to set orientation and placement sensitive. Will fail if no device is found + + # unlock window + self.window1.set_sensitive(True) + + # Try to set orientation and placement sensitive. Will fail if no device is found self.toggle_orientation_sensitive(True) self.toggle_placement_sensitive(True) - - - def run(self): - """ Run gtk mainloop and with it THIS APP. """ - gtk.main() - - # signals / glade callbacks - # + def on_spinbutton_value_changed(self, source=None, event=None): """ Spinbutton value changed signal handler. """ self.scan_koords = (self.spinbutton1.get_value(),self.spinbutton2.get_value(), @@ -237,6 +279,16 @@ def on_window1_destroy(self, source=None, event=None): """ Window closed signal handler. """ gtk.main_quit() + + def on_window2_destroy(self, source=None): + # when windows is closed by pressing the x-button + # choose first device + if source != None: + devnr = 0 + # init scanner + self.run_sane.init_scanner(self.progress, self.window2, self.treeview1, devnr) + # set sensitivity + self.init_sensitivity() def on_radiobutton1_toggled(self, source=None, event=None): #self.filechooserbutton1.set_sensitive( self.radiobutton1.get_active() ) @@ -244,14 +296,13 @@ def on_radiobutton2_toggled(self, source=None, event=None): self.on_combobox2_changed() - + def on_filechooserbutton1_file_set(self, source=None): self.radiobutton1.set_active(True) self.inp_file = self.filechooserbutton1.get_filename() if not os.path.exists(self.inp_file): self.progress(0., "File not found!") return None - def toggle_orientation_sensitive(self, value): self.label5.set_sensitive(value) @@ -351,6 +402,12 @@ # (2/?) self.progress(2./max_steps, "Adjusting image/picture data...") mode = self.mode + try: + self.inp_file + except: + print "No input file. Please select input file or SANE Interface." + #self.progress(0., "No input file. Please select input file or SANE Interface.") + return None self.run_convert = RunExternal(self.cmd_convert % (self.inp_file, mode, self.temp+opt['tmp_file']), error_msg=[ "convert: unable to open image" ]) # self.run_convert = RunMagickWand(inp_file, mode*90, self.temp+opt['tmp_file']) # improve quality by using imagemagicks filter and conversion capabilities... @@ -724,39 +781,79 @@ resolution = 600 - def __init__(self): + def __init__(self, progress, window2, treeview): """ Init of sane and scanner. """ print "init sane python interface ...", sys.stdout.flush() # Get the path set up properly #sys.path.append('.') + + # create treeview things + list_store = gtk.ListStore(gobject.TYPE_STRING) + treeview.set_model(list_store) + col = gtk.TreeViewColumn("Devices", gtk.CellRendererText(),text=0) + treeview.append_column(col) # init SANE + self.n=4. + progress(0.,"init sane python interface ...") try: - devnr = 0 self.version = sane.init() + progress(1./self.n,"init sane python interface ... search devices") self.devices = sane.get_devices() print "\n" + # add found devices to treeview for i in range(len(self.devices)): print str(i)+": "+self.devices[i][1]+" "+self.devices[i][2] - if len(self.devices) > 1 and sys.argv[1:]: - devnr = raw_input("Choose device: ") + list_store.append([self.devices[i][1]+" "+self.devices[i][2]]) + + # check how many devices we found + if len(self.devices) > 1: + # more than one device, choose one. + progress(2./self.n,"More than one device found.") + if sys.argv[1:]: + # choose one by command line + devnr = raw_input("Choose device: ") + progress(2./self.n,"More than one device found. Choose device number %i" % devnr) + # continue to init scanner + self.init_scanner(progress, window2, treeview, devnr) + else: + # simply continue and select device in GUI ( look in init_sane ) + progress(2./self.n,"More than one device found.") + else: + # only one device found + progress(2./self.n,"Device: %s" % self.devices[0][1]+" "+self.devices[0][2]) + # continue to init scanner + self.init_scanner(progress, window2, treeview, 0) + + except: + # No device found at all + self.found_scanner = False + print "No sane device found. Restart to try it again." + + def init_scanner(self, progress, window2, treeview, devnr): + + try: + # finish init device self.dev = sane.get_devices()[devnr][0] # choose first device - + 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 - + + progress(4./self.n,"Ready.") print "done." - + except: + # init scanner failed. maybe device has no scanner self.found_scanner = False - print "No sane device found." + print "Loading sane device failed. Restart to try it again." def post_init(self, coords, out_filename): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-09-11 07:32:00
|
Revision: 23 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=23&view=rev Author: laserb Date: 2010-09-11 07:31:54 +0000 (Sat, 11 Sep 2010) Log Message: ----------- Add second window to graphically select sane device Modified Paths: -------------- PyCodeOCR.glade Modified: PyCodeOCR.glade =================================================================== --- PyCodeOCR.glade 2010-09-07 20:59:46 UTC (rev 22) +++ PyCodeOCR.glade 2010-09-11 07:31:54 UTC (rev 23) @@ -1,6 +1,6 @@ <?xml version="1.0"?> <glade-interface> - <!-- interface-requires gtk+ 2.6 --> + <!-- interface-requires gtk+ 2.16 --> <!-- interface-naming-policy toplevel-contextual --> <widget class="GtkWindow" id="window1"> <property name="width_request">786</property> @@ -42,7 +42,6 @@ <widget class="GtkImage" id="image1"> <property name="width_request">504</property> <property name="height_request">84</property> - <property name="visible">True</property> </widget> <packing> <property name="x">16</property> @@ -264,6 +263,7 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="active">True</property> <property name="draw_indicator">True</property> <signal name="toggled" handler="on_radiobutton2_toggled"/> </widget> @@ -319,4 +319,55 @@ </widget> </child> </widget> + <widget class="GtkWindow" id="window2"> + <property name="resizable">False</property> + <property name="window_position">center</property> + <property name="destroy_with_parent">True</property> + <signal name="destroy" handler="on_window2_destroy"/> + <child> + <widget class="GtkFixed" id="fixed1"> + <property name="visible">True</property> + <child> + <widget class="GtkTreeView" id="treeview1"> + <property name="width_request">440</property> + <property name="height_request">84</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="enable_grid_lines">horizontal</property> + </widget> + <packing> + <property name="x">15</property> + <property name="y">52</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="button3"> + <property name="label" translatable="yes">OK</property> + <property name="width_request">90</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="on_button3_clicked"/> + </widget> + <packing> + <property name="x">365</property> + <property name="y">149</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label1"> + <property name="width_request">416</property> + <property name="height_request">30</property> + <property name="visible">True</property> + <property name="label" translatable="yes">Select device to use.</property> + </widget> + <packing> + <property name="x">23</property> + <property name="y">12</property> + </packing> + </child> + </widget> + </child> + </widget> </glade-interface> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-09-07 20:59:53
|
Revision: 22 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=22&view=rev Author: laserb Date: 2010-09-07 20:59:46 +0000 (Tue, 07 Sep 2010) Log Message: ----------- try to fix issue with file input. change inp_file to self.inp_file. only get filename if filechooserbutton1 changed. / changed datamatrix recognition to external dmtxread Modified Paths: -------------- PyCodeOCR.py Modified: PyCodeOCR.py =================================================================== --- PyCodeOCR.py 2010-09-07 14:29:34 UTC (rev 21) +++ PyCodeOCR.py 2010-09-07 20:59:46 UTC (rev 22) @@ -32,7 +32,7 @@ print "gocr found." # libdmtx bindings try: - from pydmtx import DataMatrix + #from pydmtx import DataMatrix pakages.append( "libdmtx" ) print "libdmtx and pydmtx found." except: pass @@ -247,6 +247,10 @@ def on_filechooserbutton1_file_set(self, source=None): self.radiobutton1.set_active(True) + self.inp_file = self.filechooserbutton1.get_filename() + if not os.path.exists(self.inp_file): + self.progress(0., "File not found!") + return None def toggle_orientation_sensitive(self, value): @@ -292,10 +296,17 @@ #self.on_combobox1_changed() # orientation mode self.scan_koords = std_scan_koords["A4"][0] self.mode = std_scan_koords["A4"][1] + #pydmtx recognition +# opt = { 'tmp_file': "02.jpg", # some issues with recogition +# 'recog_class': RunLibdmtx, # . +# 'recog_cmd': self.temp+"02.jpg", # of different file formats +# 'recog_error_msg': [ None ], # . + #dmtxread recognition opt = { 'tmp_file': "02.jpg", # some issues with recogition - 'recog_class': RunLibdmtx, # . - 'recog_cmd': self.temp+"02.jpg", # of different file formats - 'recog_error_msg': [ None ], # . + 'recog_class': RunExternal, # . + 'recog_cmd': "dmtxread "+self.temp+"02.jpg", # of different file formats + 'recog_error_msg': [ "error" ], # . + #opt = { 'tmp_file': "02.bmp", # and drawing/marking the # 'recog_cmd': (self.temp+"02.bmp", [ None ], RunLibdmtx), } # processed region(s)... #opt = { 'tmp_file': "02.png", # (but this should work for 'tif') @@ -329,10 +340,10 @@ #del self.run_sane else: # direct file input self.progress(1./max_steps, "Reading image...") - inp_file = self.filechooserbutton1.get_filename() - if not os.path.exists(inp_file): - self.progress(0., "File not found!") - return None + #self.inp_file = self.filechooserbutton1.get_filename() + #if not os.path.exists(self.inp_file): + # self.progress(0., "File not found!") + # return None self.refresh() if self.__stop: return @@ -340,7 +351,7 @@ # (2/?) self.progress(2./max_steps, "Adjusting image/picture data...") mode = self.mode - self.run_convert = RunExternal(self.cmd_convert % (inp_file, mode, self.temp+opt['tmp_file']), error_msg=[ "convert: unable to open image" ]) + self.run_convert = RunExternal(self.cmd_convert % (self.inp_file, mode, self.temp+opt['tmp_file']), error_msg=[ "convert: unable to open image" ]) # self.run_convert = RunMagickWand(inp_file, mode*90, self.temp+opt['tmp_file']) # improve quality by using imagemagicks filter and conversion capabilities... if self.run_convert(): @@ -391,11 +402,13 @@ data = eval( raw_data ) origdata = str(data) elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx) - if self.run_recognition.count == 1: - data = self.run_recognition.message[0] - else: - data = str(self.run_recognition.message) - origdata = str(self.run_recognition.stats) + data = self.run_recognition.stdout + #pydmtx recognition +# if self.run_recognition.count == 1: +# data = self.run_recognition.message[0] +# else: +# data = str(self.run_recognition.message) +# origdata = str(self.run_recognition.stats) elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine) data = self.run_recognition.stdout.split("\r\n")[1] origdata = data @@ -431,12 +444,15 @@ data = "type: " + data['type'] #check = check and ( len(data) in opt['valid_code_len'] ) # correct code len? elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx) - check = not self.run_recognition.error - if check: - print self.run_recognition.decode - print self.run_recognition.count - #print self.run_recognition.message - print self.run_recognition.stats + check = not (self.run_recognition.error == "error") + #pydmtx recognition +# check = not self.run_recognition.error +# if check: +# print self.run_recognition.decode +# print self.run_recognition.count +# #print self.run_recognition.message +# print self.run_recognition.stats + elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine) check = not self.run_recognition.error print data, len(data), check @@ -498,10 +514,10 @@ # open an image file (.bmp,.jpg,.png,.gif) you have in the working folder print imageFile[-3:] if imageFile[-3:] in ["bmp","jpg","png","gif"]: - print "already in right format" + #already in right format im1 = Image.open(imageFile) else: - print "convert Image" + #convert Image self.run_convert = RunExternal(self.cmd_convert % (imageFile, 0, self.temp+"04.jpg"), error_msg=[ "convert: unable to open image" ]) if self.run_convert(): self.progress(0., self.run_convert.stderr[:-1]) @@ -617,54 +633,54 @@ os.system( self.cmd ) return (False, "", "") -class RunLibdmtx: - """ Use libdmtx python wrapper/bindings (pydmtx). """ +#class RunLibdmtx: +# """ Use libdmtx python wrapper/bindings (pydmtx). """ - def __init__(self, cmd, error_msg): - #self.cmd = cmd - #self.error_msg += error_msg - self.filename = cmd +# def __init__(self, cmd, error_msg): +# #self.cmd = cmd +# #self.error_msg += error_msg +# self.filename = cmd - def __call__(self): - (self.error, self.stdout, self.stderr) = self._run() - return self.error +# def __call__(self): +# (self.error, self.stdout, self.stderr) = self._run() +# return self.error - # thanks to: http://www.pastequestion.com/blog/python/how-to-use-python-imaging-library.html - def _run(self): - """ Read a Data Matrix barcode. """ - dm_read = DataMatrix() - #print self.filename - img = Image.open(self.filename) - try: - self.decode = dm_read.decode(img.size[0], img.size[1], buffer(img.tostring())) - self.count = dm_read.count() - self.message = [ dm_read.message(i+1) for i in range(self.count) ] - self.stats = [ dm_read.stats(i+1) for i in range(self.count) ] - except: - return (True, "error", sys.exc_info()[1]) +# # thanks to: http://www.pastequestion.com/blog/python/how-to-use-python-imaging-library.html +# def _run(self): +# """ Read a Data Matrix barcode. """ +# dm_read = DataMatrix() +# #print self.filename +# img = Image.open(self.filename) +# try: +# self.decode = dm_read.decode(img.size[0], img.size[1], buffer(img.tostring())) +# self.count = dm_read.count() +# self.message = [ dm_read.message(i+1) for i in range(self.count) ] +# self.stats = [ dm_read.stats(i+1) for i in range(self.count) ] +# except: +# return (True, "error", sys.exc_info()[1]) - print "Detected %i DataMatrix barcodes" % self.count - for i in range(self.count): - print "Code # %i:" % (i+1) - print self.message[i] - stats = self.stats[i] - print stats +# print "Detected %i DataMatrix barcodes" % self.count +# for i in range(self.count): +# print "Code # %i:" % (i+1) +# print self.message[i] +# stats = self.stats[i] +# print stats - # mark the recognized region and save back to file - points = list(stats[1]) - points.append(points[0]) - draw = ImageDraw.Draw(img) - old = points[0] - for i, xy in enumerate(points[1:]): - #draw.line(old+xy, fill=(0, 255, 0), width=2) - #draw.line(old+xy, fill=(0, 255, 0)) - draw.line(old+xy, fill="rgb(0, 255, 0)") - old = xy - img.save(self.filename) +# # mark the recognized region and save back to file +# points = list(stats[1]) +# points.append(points[0]) +# draw = ImageDraw.Draw(img) +# old = points[0] +# for i, xy in enumerate(points[1:]): +# #draw.line(old+xy, fill=(0, 255, 0), width=2) +# #draw.line(old+xy, fill=(0, 255, 0)) +# draw.line(old+xy, fill="rgb(0, 255, 0)") +# old = xy +# img.save(self.filename) - #return (False, self.message, "") - #print self.stats, (self.count == 0) - return ((self.count == 0), self.message, "") +# #return (False, self.message, "") +# #print self.stats, (self.count == 0) +# return ((self.count == 0), self.message, "") #class RunMagickWand: # """ Use Python bindings to ImageMagick's MagickWand API. """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-09-07 14:29:43
|
Revision: 21 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=21&view=rev Author: laserb Date: 2010-09-07 14:29:34 +0000 (Tue, 07 Sep 2010) Log Message: ----------- change sensitivity if option is not available / select file input if a file is opened / show image for other than barcode too / some errorhandling for sane (don't crash if no device is found / possibility to restart / possibility to select printer in commandline if an argument is given) Modified Paths: -------------- PyCodeOCR.py Modified: PyCodeOCR.py =================================================================== --- PyCodeOCR.py 2010-09-07 14:24:34 UTC (rev 20) +++ PyCodeOCR.py 2010-09-07 14:29:34 UTC (rev 21) @@ -53,7 +53,6 @@ "A4": (( 0, 0, 296, 215 ), 0), } # scan whole range (A4: http://www.cl.cam.ac.uk/~mgk25/iso-paper.html) #"A4": (( 0, 0, 290, 210 ), 0), } # (more secure; with small border) - # MainWindow # The GUI was created/designed using GLADE # @@ -94,10 +93,13 @@ self.xml = gtk.glade.XML(self.gladefile) self.window1 = self.xml.get_widget('window1') self.togglebutton1 = self.xml.get_widget('togglebutton1') + self.button1 = self.xml.get_widget('button1') self.button2 = self.xml.get_widget('button2') + self.frame1 = self.xml.get_widget('frame1') self.image1 = self.xml.get_widget('image1') self.entry1 = self.xml.get_widget('entry1') self.progressbar1 = self.xml.get_widget('progressbar1') + self.label5 = self.xml.get_widget('label5') self.combobox1 = self.xml.get_widget('combobox1') self.combobox2 = self.xml.get_widget('combobox2') self.spinbutton1 = self.xml.get_widget('spinbutton1') @@ -124,19 +126,37 @@ if "pdf417decode" not in pakages: self.combobox2.remove_text(3) self.combobox2.insert_text(3, "< not installed >") - self.radiobutton2.set_active(True) - self.on_radiobutton1_toggled() + #self.on_radiobutton1_toggled() + # connect signal handlers self.xml.signal_autoconnect( self ) - + # take some time to init sane - self.run_sane = RunSANE() - + self.init_sane() + # display window self.window1.show() return + + def init_sane(self, source=None): + self.run_sane = RunSANE() + + if self.run_sane.found_scanner: + self.radiobutton2.set_active(True) + self.radiobutton2.set_sensitive(True) + else: + self.radiobutton1.set_active(True) + self.radiobutton2.set_sensitive(False) + self.on_radiobutton1_toggled() + self.progressbar1.set_text("No sane device found.") + self.button1.set_visible(True) + + #Try to set orientation and placement sensitive. Will fail if no device is found + self.toggle_orientation_sensitive(True) + self.toggle_placement_sensitive(True) + def run(self): """ Run gtk mainloop and with it THIS APP. """ @@ -159,6 +179,21 @@ self.spinbutton4.set_value(std_scan_koords[orient][0][3]) self.mode = std_scan_koords[orient][1] + + def on_combobox2_changed(self, source=None): + op_mode = self.combobox2.get_active() + if (op_mode == self.MDE['invoices']): + self.toggle_placement_sensitive(True) + self.toggle_orientation_sensitive(True) + elif (op_mode == self.MDE['barcode']): + self.toggle_placement_sensitive(False) + self.toggle_orientation_sensitive(True) + elif (op_mode == self.MDE['DataMatrix']): + self.toggle_placement_sensitive(False) + self.toggle_orientation_sensitive(False) + elif (op_mode == self.MDE['PDF417']): + self.toggle_placement_sensitive(True) + self.toggle_orientation_sensitive(True) def on_togglebutton1_toggled(self, source=None, event=None, *a): """ ToggleButton: 'scan'/'stop'. """ @@ -189,19 +224,40 @@ self.refresh() return + + def on_button1_clicked(self, source=None, event=None): + """ Button: 'exit'. """ + os.execv(sys.argv[0],sys.argv) + self.on_window1_destroy() + def on_button2_clicked(self, source=None, event=None): """ Button: 'exit'. """ self.on_window1_destroy() - + def on_window1_destroy(self, source=None, event=None): """ Window closed signal handler. """ gtk.main_quit() def on_radiobutton1_toggled(self, source=None, event=None): - self.filechooserbutton1.set_sensitive( self.radiobutton1.get_active() ) + #self.filechooserbutton1.set_sensitive( self.radiobutton1.get_active() ) + self.on_combobox2_changed() + + def on_radiobutton2_toggled(self, source=None, event=None): + self.on_combobox2_changed() + + def on_filechooserbutton1_file_set(self, source=None): + self.radiobutton1.set_active(True) - #def on_radiobutton2_toggled(self, source=None, event=None): - # pass + + def toggle_orientation_sensitive(self, value): + self.label5.set_sensitive(value) + self.combobox1.set_sensitive(value) + + def toggle_placement_sensitive(self, value): + if self.radiobutton2.get_active(): + self.frame1.set_sensitive(value) + else: + self.frame1.set_sensitive(False) # helpers # @@ -290,8 +346,8 @@ if self.run_convert(): self.progress(0., self.run_convert.stderr[:-1]) return None - if (op_mode == self.MDE['invoices']): # 0: invoices - self.setimage( self.temp+opt['tmp_file'] ) + #if (op_mode == self.MDE['invoices']): # 0: invoices + self.setimage( self.temp+opt['tmp_file'] ) if source_mode: # SANE scanning interface os.remove(inp_file) # clean-up del self.run_convert @@ -440,15 +496,33 @@ # free from: http://www.pythonware.com/products/pil/index.htm # tested with Python24 vegaseat 11oct2005 # open an image file (.bmp,.jpg,.png,.gif) you have in the working folder - im1 = Image.open(imageFile) - # adjust width and height to your needs - (width, height) = self.image1.get_size_request() + print imageFile[-3:] + if imageFile[-3:] in ["bmp","jpg","png","gif"]: + print "already in right format" + im1 = Image.open(imageFile) + else: + print "convert Image" + self.run_convert = RunExternal(self.cmd_convert % (imageFile, 0, self.temp+"04.jpg"), error_msg=[ "convert: unable to open image" ]) + if self.run_convert(): + self.progress(0., self.run_convert.stderr[:-1]) + return None + im1 = Image.open(self.temp+"04.jpg") + + # adjust width and height to your needs and keep ratio + (im_width, im_height) = im1.size #get image size + (width, height) = self.image1.get_size_request() #get needed size + ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio + new_width = int(im_width*ratio) + new_height = int(im_height*ratio) + # use one of these filter options to resize the image - #im = im1.resize((width, height), Image.NEAREST) # use nearest neighbour - im = im1.resize((width, height), Image.BILINEAR) # linear interpolation in a 2x2 environment - #im = im1.resize((width, height), Image.BICUBIC) # cubic spline interpolation in a 4x4 environment - #im = im1.resize((width, height), Image.ANTIALIAS) # best down-sizing filter + + #im = im1.resize((new_width, new_height), Image.NEAREST) # use nearest neighbour + im = im1.resize((new_width, new_height), Image.BILINEAR) # linear interpolation in a 2x2 environment + #im = im1.resize((new_width, new_height), Image.BICUBIC) # cubic spline interpolation in a 4x4 environment + #im = im1.resize((new_width, new_height), Image.ANTIALIAS) # best down-sizing filter #ext = ".jpg" + image_file = self.temp+"04.jpg" im.save( image_file ) self.image1.set_from_file( image_file ) @@ -643,21 +717,37 @@ #sys.path.append('.') # init SANE - self.version = sane.init() - self.devices = sane.get_devices() - self.dev = sane.get_devices()[0][0] # choose first device + try: + devnr = 0 + self.version = sane.init() + self.devices = sane.get_devices() + print "\n" + for i in range(len(self.devices)): + print str(i)+": "+self.devices[i][1]+" "+self.devices[i][2] + if len(self.devices) > 1 and sys.argv[1:]: + devnr = raw_input("Choose device: ") + + self.dev = sane.get_devices()[devnr][0] # choose first device + + # 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 + + print "done." + + except: + self.found_scanner = False + print "No sane device found." + - # open scanner device - self.scanner = sane.open(self.dev) - self.params = self.scanner.get_parameters() - self.opts = self.scanner.get_options() - - print "done." - def post_init(self, coords, out_filename): """ Not init of sane and scanner, but of scan operation. """ self.coords = coords self.out_filename = out_filename + self.info() def __call__(self): (self.error, self.stdout, self.stderr) = self._run() @@ -696,11 +786,11 @@ """ Show some info about the scanner and SANE. """ print 'SANE version:', self.version print 'Available devices=', self.devices - print 'Selected device=', self.dev#, "\n" + print 'Selected device=', self.dev #, "\n" print 'SaneDev object=', self.scanner print 'Device parameters:', self.params - print 'Device options:', "\n".join(self.opts) + #print 'Device options:', "\n",self.opts This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-09-07 14:24:43
|
Revision: 20 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=20&view=rev Author: laserb Date: 2010-09-07 14:24:34 +0000 (Tue, 07 Sep 2010) Log Message: ----------- + restart button / + different events Modified Paths: -------------- PyCodeOCR.glade Modified: PyCodeOCR.glade =================================================================== --- PyCodeOCR.glade 2010-09-06 16:33:29 UTC (rev 19) +++ PyCodeOCR.glade 2010-09-07 14:24:34 UTC (rev 20) @@ -1,467 +1,322 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - +<?xml version="1.0"?> <glade-interface> - -<widget class="GtkWindow" id="window1"> - <property name="width_request">786</property> - <property name="height_request">242</property> - <property name="visible">True</property> - <property name="title" translatable="yes">PyCodeOCR</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">False</property> - <property name="destroy_with_parent">False</property> - <property name="decorated">True</property> - <property name="skip_taskbar_hint">False</property> - <property name="skip_pager_hint">False</property> - <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> - <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> - <property name="focus_on_map">True</property> - <property name="urgency_hint">False</property> - <signal name="destroy" handler="on_window1_destroy"/> - - <child> - <widget class="GtkFixed" id="fixed1"> - <property name="visible">True</property> - - <child> - <widget class="GtkProgressBar" id="progressbar1"> - <property name="width_request">504</property> - <property name="height_request">20</property> - <property name="visible">True</property> - <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property> - <property name="fraction">0</property> - <property name="pulse_step">0.10000000149</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - </widget> - <packing> - <property name="x">16</property> - <property name="y">208</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry1"> - <property name="width_request">504</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">False</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char">●</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="x">16</property> - <property name="y">168</property> - </packing> - </child> - - <child> - <widget class="GtkImage" id="image1"> - <property name="width_request">504</property> - <property name="height_request">56</property> - <property name="visible">True</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="x">16</property> - <property name="y">96</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label5"> - <property name="width_request">90</property> - <property name="height_request">21</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Orientation:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="x">567</property> - <property name="y">170</property> - </packing> - </child> - - <child> - <widget class="GtkComboBox" id="combobox1"> - <property name="width_request">90</property> - <property name="height_request">29</property> - <property name="visible">True</property> - <property name="items" translatable="yes">0 deg + <!-- interface-requires gtk+ 2.6 --> + <!-- interface-naming-policy toplevel-contextual --> + <widget class="GtkWindow" id="window1"> + <property name="width_request">786</property> + <property name="height_request">242</property> + <property name="visible">True</property> + <property name="title" translatable="yes">PyCodeOCR</property> + <property name="resizable">False</property> + <signal name="destroy" handler="on_window1_destroy"/> + <child> + <widget class="GtkFixed" id="fixed1"> + <property name="visible">True</property> + <child> + <widget class="GtkProgressBar" id="progressbar1"> + <property name="width_request">504</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="pulse_step">0.10000000149</property> + </widget> + <packing> + <property name="x">16</property> + <property name="y">208</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="entry1"> + <property name="width_request">504</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">False</property> + <property name="invisible_char">●</property> + </widget> + <packing> + <property name="x">16</property> + <property name="y">168</property> + </packing> + </child> + <child> + <widget class="GtkImage" id="image1"> + <property name="width_request">504</property> + <property name="height_request">84</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="x">16</property> + <property name="y">75</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label5"> + <property name="width_request">90</property> + <property name="height_request">21</property> + <property name="visible">True</property> + <property name="label" translatable="yes">Orientation:</property> + </widget> + <packing> + <property name="x">569</property> + <property name="y">160</property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="combobox1"> + <property name="width_request">90</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="items" translatable="yes">0 deg 90 deg 180 deg 270 deg</property> - <property name="add_tearoffs">False</property> - <property name="focus_on_click">True</property> - <signal name="changed" handler="on_combobox1_changed"/> - </widget> - <packing> - <property name="x">668</property> - <property name="y">165</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame1"> - <property name="width_request">224</property> - <property name="height_request">91</property> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property> - - <child> - <widget class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xscale">1</property> - <property name="yscale">1</property> - <property name="top_padding">0</property> - <property name="bottom_padding">0</property> - <property name="left_padding">12</property> - <property name="right_padding">0</property> - - <child> - <widget class="GtkFixed" id="fixed2"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="label2"> - <property name="width_request">72</property> - <property name="height_request">17</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Position:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="x">0</property> - <property name="y">8</property> - </packing> - </child> - - <child> - <widget class="GtkSpinButton" id="spinbutton1"> - <property name="width_request">56</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="climb_rate">1</property> - <property name="digits">0</property> - <property name="numeric">True</property> - <property name="update_policy">GTK_UPDATE_ALWAYS</property> - <property name="snap_to_ticks">False</property> - <property name="wrap">False</property> - <property name="adjustment">1 0 200 1 10 0</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> - </widget> - <packing> - <property name="x">80</property> - <property name="y">0</property> - </packing> - </child> - - <child> - <widget class="GtkSpinButton" id="spinbutton2"> - <property name="width_request">56</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="climb_rate">1</property> - <property name="digits">0</property> - <property name="numeric">True</property> - <property name="update_policy">GTK_UPDATE_ALWAYS</property> - <property name="snap_to_ticks">False</property> - <property name="wrap">False</property> - <property name="adjustment">1 0 200 1 10 0</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> - </widget> - <packing> - <property name="x">144</property> - <property name="y">0</property> - </packing> - </child> - - <child> - <widget class="GtkSpinButton" id="spinbutton3"> - <property name="width_request">56</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="climb_rate">1</property> - <property name="digits">0</property> - <property name="numeric">True</property> - <property name="update_policy">GTK_UPDATE_ALWAYS</property> - <property name="snap_to_ticks">False</property> - <property name="wrap">False</property> - <property name="adjustment">1 0 200 1 10 0</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> - </widget> - <packing> - <property name="x">80</property> - <property name="y">40</property> - </packing> - </child> - - <child> - <widget class="GtkSpinButton" id="spinbutton4"> - <property name="width_request">56</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="climb_rate">1</property> - <property name="digits">0</property> - <property name="numeric">True</property> - <property name="update_policy">GTK_UPDATE_ALWAYS</property> - <property name="snap_to_ticks">False</property> - <property name="wrap">False</property> - <property name="adjustment">1 0 200 1 10 0</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> - </widget> - <packing> - <property name="x">144</property> - <property name="y">40</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label3"> - <property name="width_request">72</property> - <property name="height_request">17</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Size:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="x">0</property> - <property name="y">48</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">Placement</property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="x">544</property> - <property name="y">64</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label4"> - <property name="width_request">102</property> - <property name="height_request">17</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Scanned code:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="x">16</property> - <property name="y">64</property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="button2"> - <property name="width_request">90</property> - <property name="height_request">29</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">exit</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_button2_clicked"/> - </widget> - <packing> - <property name="x">668</property> - <property name="y">200</property> - </packing> - </child> - - <child> - <widget class="GtkToggleButton" id="togglebutton1"> - <property name="width_request">90</property> - <property name="height_request">29</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">scan</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <property name="active">False</property> - <property name="inconsistent">False</property> - <signal name="toggled" handler="on_togglebutton1_toggled" last_modification_time="Fri, 02 Apr 2010 14:44:49 GMT"/> - </widget> - <packing> - <property name="x">568</property> - <property name="y">200</property> - </packing> - </child> - - <child> - <widget class="GtkComboBox" id="combobox2"> - <property name="width_request">256</property> - <property name="height_request">31</property> - <property name="visible">True</property> - <property name="items" translatable="yes">E-Banking invoice OCR + <signal name="changed" handler="on_combobox1_changed"/> + </widget> + <packing> + <property name="x">691</property> + <property name="y">155</property> + </packing> + </child> + <child> + <widget class="GtkFrame" id="frame1"> + <property name="width_request">224</property> + <property name="height_request">91</property> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <child> + <widget class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="left_padding">12</property> + <child> + <widget class="GtkFixed" id="fixed2"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label2"> + <property name="width_request">72</property> + <property name="height_request">17</property> + <property name="visible">True</property> + <property name="label" translatable="yes">Position:</property> + </widget> + <packing> + <property name="y">8</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spinbutton1"> + <property name="width_request">56</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">1 0 200 1 10 0</property> + <property name="climb_rate">1</property> + <property name="numeric">True</property> + <signal name="value_changed" handler="on_spinbutton_value_changed"/> + </widget> + <packing> + <property name="x">80</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spinbutton2"> + <property name="width_request">56</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">1 0 200 1 10 0</property> + <property name="climb_rate">1</property> + <property name="numeric">True</property> + <signal name="value_changed" handler="on_spinbutton_value_changed"/> + </widget> + <packing> + <property name="x">144</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spinbutton3"> + <property name="width_request">56</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">1 0 200 1 10 0</property> + <property name="climb_rate">1</property> + <property name="numeric">True</property> + <signal name="value_changed" handler="on_spinbutton_value_changed"/> + </widget> + <packing> + <property name="x">80</property> + <property name="y">40</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="spinbutton4"> + <property name="width_request">56</property> + <property name="height_request">27</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">1 0 200 1 10 0</property> + <property name="climb_rate">1</property> + <property name="numeric">True</property> + <signal name="value_changed" handler="on_spinbutton_value_changed"/> + </widget> + <packing> + <property name="x">144</property> + <property name="y">40</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label3"> + <property name="width_request">72</property> + <property name="height_request">17</property> + <property name="visible">True</property> + <property name="label" translatable="yes">Size:</property> + </widget> + <packing> + <property name="y">48</property> + </packing> + </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="label" translatable="yes">Placement</property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="x">558</property> + <property name="y">56</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label4"> + <property name="width_request">102</property> + <property name="height_request">17</property> + <property name="visible">True</property> + <property name="label" translatable="yes">Scanned code:</property> + </widget> + <packing> + <property name="x">16</property> + <property name="y">55</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="button2"> + <property name="label" translatable="yes">exit</property> + <property name="width_request">90</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_button2_clicked"/> + </widget> + <packing> + <property name="x">692</property> + <property name="y">200</property> + </packing> + </child> + <child> + <widget class="GtkToggleButton" id="togglebutton1"> + <property name="label" translatable="yes">scan</property> + <property name="width_request">90</property> + <property name="height_request">29</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <signal name="toggled" handler="on_togglebutton1_toggled"/> + </widget> + <packing> + <property name="x">568</property> + <property name="y">200</property> + </packing> + </child> + <child> + <widget class="GtkComboBox" id="combobox2"> + <property name="width_request">256</property> + <property name="height_request">31</property> + <property name="visible">True</property> + <property name="items" translatable="yes">E-Banking invoice OCR Barcode optical recogn. (beta) DataMatrix optical recogn. (beta) PDF417 bc. optical recogn. (beta) </property> - <property name="add_tearoffs">False</property> - <property name="focus_on_click">True</property> - </widget> - <packing> - <property name="x">16</property> - <property name="y">16</property> - </packing> - </child> - - <child> - <widget class="GtkRadioButton" id="radiobutton2"> - <property name="width_request">224</property> - <property name="height_request">21</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Standard SANE Interface</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <property name="active">False</property> - <property name="inconsistent">False</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_radiobutton2_toggled" last_modification_time="Fri, 02 Apr 2010 15:51:47 GMT"/> - </widget> - <packing> - <property name="x">544</property> - <property name="y">24</property> - </packing> - </child> - - <child> - <widget class="GtkRadioButton" id="radiobutton1"> - <property name="width_request">16</property> - <property name="height_request">21</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <property name="active">False</property> - <property name="inconsistent">False</property> - <property name="draw_indicator">True</property> - <property name="group">radiobutton2</property> - <signal name="toggled" handler="on_radiobutton1_toggled" last_modification_time="Fri, 02 Apr 2010 15:51:43 GMT"/> - </widget> - <packing> - <property name="x">328</property> - <property name="y">24</property> - </packing> - </child> - - <child> - <widget class="GtkFileChooserButton" id="filechooserbutton1"> - <property name="width_request">168</property> - <property name="height_request">31</property> - <property name="visible">True</property> - <property name="title" translatable="yes">Datei auswählen</property> - <property name="action">GTK_FILE_CHOOSER_ACTION_OPEN</property> - <property name="local_only">True</property> - <property name="show_hidden">False</property> - <property name="do_overwrite_confirmation">True</property> - <property name="width_chars">-1</property> - </widget> - <packing> - <property name="x">352</property> - <property name="y">16</property> - </packing> - </child> - </widget> - </child> -</widget> - + <signal name="changed" handler="on_combobox2_changed"/> + </widget> + <packing> + <property name="x">16</property> + <property name="y">16</property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="radiobutton2"> + <property name="label" translatable="yes">Standard SANE Interface</property> + <property name="width_request">224</property> + <property name="height_request">21</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_radiobutton2_toggled"/> + </widget> + <packing> + <property name="x">534</property> + <property name="y">24</property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="radiobutton1"> + <property name="width_request">21</property> + <property name="height_request">21</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <property name="group">radiobutton2</property> + <signal name="toggled" handler="on_radiobutton1_toggled"/> + </widget> + <packing> + <property name="x">318</property> + <property name="y">24</property> + </packing> + </child> + <child> + <widget class="GtkFileChooserButton" id="filechooserbutton1"> + <property name="width_request">168</property> + <property name="height_request">31</property> + <property name="visible">True</property> + <property name="do_overwrite_confirmation">True</property> + <signal name="file_set" handler="on_filechooserbutton1_file_set"/> + </widget> + <packing> + <property name="x">342</property> + <property name="y">16</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="button1"> + <property name="label" translatable="yes">Restart</property> + <property name="width_request">60</property> + <property name="height_request">29</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="on_button1_clicked"/> + </widget> + <packing> + <property name="x">721</property> + <property name="y">20</property> + </packing> + </child> + </widget> + </child> + </widget> </glade-interface> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-09-06 16:33:36
|
Revision: 19 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=19&view=rev Author: laserb Date: 2010-09-06 16:33:29 +0000 (Mon, 06 Sep 2010) Log Message: ----------- Simple fix to support orientation where it is needed. Modified Paths: -------------- PyCodeOCR.py Modified: PyCodeOCR.py =================================================================== --- PyCodeOCR.py 2010-09-06 16:28:39 UTC (rev 18) +++ PyCodeOCR.py 2010-09-06 16:33:29 UTC (rev 19) @@ -2,13 +2,13 @@ # -*- coding: utf-8 -*- -# python standard modules +# python standard modules import os, re, sys, subprocess, time -# GTK, PyGTK, GLADE (GNOME) modules +# GTK, PyGTK, GLADE (GNOME) modules import pygtk pygtk.require('2.0') -import gtk, gtk.glade +import gtk, gtk.glade import gobject # PIL image library and it's SANE bindings @@ -57,12 +57,12 @@ # MainWindow # The GUI was created/designed using GLADE # -class MainWindowGTK: +class MainWindowGTK: """ PyCodeOCR main GUI window and application class. """ - # initialization + # initialization # (variables) max_retry = 3 # max. scan attempts valid_code_len = [ 53, 42, 32 ] # valid code lenghts @@ -91,13 +91,13 @@ """ ... """ # retrieve widgets self.gladefile = raw_path + ".glade" - self.xml = gtk.glade.XML(self.gladefile) - self.window1 = self.xml.get_widget('window1') + self.xml = gtk.glade.XML(self.gladefile) + self.window1 = self.xml.get_widget('window1') self.togglebutton1 = self.xml.get_widget('togglebutton1') self.button2 = self.xml.get_widget('button2') self.image1 = self.xml.get_widget('image1') self.entry1 = self.xml.get_widget('entry1') - self.progressbar1 = self.xml.get_widget('progressbar1') + self.progressbar1 = self.xml.get_widget('progressbar1') self.combobox1 = self.xml.get_widget('combobox1') self.combobox2 = self.xml.get_widget('combobox2') self.spinbutton1 = self.xml.get_widget('spinbutton1') @@ -151,7 +151,6 @@ def on_combobox1_changed(self, source=None, event=None): """ Combobox changed signal handler. """ - #orient = self.combobox1.get_active() orient = self.combobox1.get_model()[self.combobox1.get_active()][0] self.spinbutton1.set_value(std_scan_koords[orient][0][0]) @@ -224,8 +223,9 @@ 'valid_code_len': self.valid_code_len, 'resolution': 600, } elif (op_mode == self.MDE['barcode']): # 1: barcode (gocr) + self.on_combobox1_changed() # orientation mode self.scan_koords = std_scan_koords["A4"][0] - self.mode = std_scan_koords["A4"][1] + #self.mode = std_scan_koords["A4"][1] opt = { 'tmp_file': "02.pnm", 'recog_class': RunExternal, 'recog_cmd': self.cmd_gocr % (self.temp+"02",), @@ -233,6 +233,7 @@ 'valid_code_len': [ 13, 10, 9 ], 'resolution': 300, } elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx) + #self.on_combobox1_changed() # orientation mode self.scan_koords = std_scan_koords["A4"][0] self.mode = std_scan_koords["A4"][1] opt = { 'tmp_file': "02.jpg", # some issues with recogition @@ -282,7 +283,6 @@ # Adjust and rotate the retrieved data # (2/?) self.progress(2./max_steps, "Adjusting image/picture data...") - #mode = 90 * self.combobox1.get_active() mode = self.mode self.run_convert = RunExternal(self.cmd_convert % (inp_file, mode, self.temp+opt['tmp_file']), error_msg=[ "convert: unable to open image" ]) # self.run_convert = RunMagickWand(inp_file, mode*90, self.temp+opt['tmp_file']) @@ -312,12 +312,18 @@ return None if (op_mode == self.MDE['invoices']): # 0: invoices - df = file(self.temp+"03.txt", "r") - data = df.read(-1) - df.close() - origdata = data - - os.remove(self.temp+"03.txt") # clean-up + # Simple workaround: The program simply continuous if no text is found at all + # and therefore no txt-file is generated. + if not os.path.exists(self.temp+"03.txt"): + origdata = "$" + data = "$" + else: + df = file(self.temp+"03.txt", "r") + data = df.read(-1) + df.close() + origdata = data + os.remove(self.temp+"03.txt") # clean-up + elif (op_mode == self.MDE['barcode']): # 1: barcode # (cheap'n'ugly but working...) raw_data = self.regex_gocr.search(self.run_recognition.stdout).groups() @@ -527,9 +533,9 @@ """ Execute external shell command. """ if piped: run = subprocess.Popen( self.cmd, - stdin =subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, + stdin =subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, shell=True ) (stdoutdata, stderrdata) = run.communicate() return ((max(map(stderrdata.find, self.error_msg)) != -1), stdoutdata, stderrdata) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <la...@us...> - 2010-09-06 16:28:45
|
Revision: 18 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=18&view=rev Author: laserb Date: 2010-09-06 16:28:39 +0000 (Mon, 06 Sep 2010) Log Message: ----------- Added some lines describing a problem I had with pydmtx. Hopefully it helps somebody. Modified Paths: -------------- README Modified: README =================================================================== --- README 2010-04-10 16:58:48 UTC (rev 17) +++ README 2010-09-06 16:28:39 UTC (rev 18) @@ -49,7 +49,7 @@ # * scanimage (SANE interface) # * convert (ImageMagick) # * tesseract -# http://code.google.com/p/tesseract-ocr/ +# http://code.google.com/p/tesseract-ocr/ # (better would be to get the appropriate pakage for your distro) # * Python Imaging Library (PIL) # (AND SANE/PIL python bindings, in fedora e.g. 'python-imaging-sane') @@ -64,6 +64,10 @@ # last you may have to use 'export LD_LIBRARY_PATH=/usr/local/lib' # in shell to solve the "3.1. ImportError") # http://www.libdmtx.org/downloads.php +# If you have installed libdmtx and it is still not working, then maybe +# your pydmtx.py is not installed correctly. You should find it in +# /usr/share/doc/libdmtx-dev/examples/python/ . Just follow the +# instructions given there. # * PDF417Decode.exe (by Morovia Corporation) # WINE is used to run this propietary/commercial Windows App., since # it is free for private purposes. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |