[Pycodeocr-main] SF.net SVN: pycodeocr:[42] branches/laserb/PyCodeOCR.py
Status: Beta
Brought to you by:
drtrigon
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. |