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