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