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