home *** CD-ROM | disk | FTP | other *** search
/ Freelog 116 / FreelogNo116-JuilletSeptembre2013.iso / Bureautique / gImageReader / gimagereader_0.9-1_win32.exe / bin / gimagereader / main.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2011-03-24  |  15KB  |  369 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.7)
  3.  
  4. import gtk
  5. import os
  6. import sys
  7. import locale
  8. import urllib2
  9. import gettext
  10. import webbrowser
  11. import tempfile
  12. import Image
  13. import TiffImagePlugin
  14. import subprocess
  15. import acquire
  16. import config
  17. import dialogs
  18. import drawingarea
  19. import notifier
  20. import threadtools
  21. import outbuffer
  22. import filelist
  23. import enchant
  24. if sys.platform[0:3] == 'win':
  25.     enchant.set_param('enchant.myspell.dictionary.path', os.environ['DICTDIR'])
  26.  
  27. class gimagereader:
  28.     
  29.     def __init__(self, pydir, files = None):
  30.         if os.path.exists(os.path.join(pydir, 'locale')):
  31.             localedir = os.path.join(pydir, 'locale')
  32.         else:
  33.             localedir = os.path.join(os.sep, 'usr', 'share', 'locale')
  34.         if os.getenv('LANG') is None:
  35.             (lang, enc) = locale.getdefaultlocale()
  36.             os.environ['LANG'] = lang
  37.         gettext.bindtextdomain('gimagereader', localedir)
  38.         gettext.textdomain('gimagereader')
  39.         gettext.install('gimagereader', localedir)
  40.         _ = gettext.gettext
  41.         
  42.         try:
  43.             locale.setlocale(locale.LC_ALL, '')
  44.         except:
  45.             print 'Failed to load GUI translations...'
  46.  
  47.         
  48.         try:
  49.             locale.bindtextdomain('gimagereader', localedir)
  50.         except:
  51.             
  52.             try:
  53.                 import ctypes as ctypes
  54.                 libintl = ctypes.cdll.LoadLibrary('intl.dll')
  55.                 libintl.bindtextdomain('gimagereader', localedir)
  56.             print 'Failed to load GUI translations...'
  57.  
  58.  
  59.         self.builder = gtk.Builder()
  60.         self.builder.set_translation_domain('gimagereader')
  61.         self.builder.add_from_file(os.path.join(pydir, 'gimagereader.xml'))
  62.         self.window = self.builder.get_object('main')
  63.         self.statusbar = self.builder.get_object('statusbar')
  64.         self.aboutdialog = self.builder.get_object('aboutdialog')
  65.         self.notebook_sources = self.builder.get_object('notebook_sources')
  66.         self.layout_sources = self.builder.get_object('layout_sources')
  67.         self.eventbox_sources_close = self.builder.get_object('eventbox_sources_close')
  68.         self.menu_toggle_sources = self.builder.get_object('menu_toggle_sources')
  69.         self.tb_doocr = self.builder.get_object('tb_doocr')
  70.         self.tb_stopocr = self.builder.get_object('tb_stopocr')
  71.         self.normalstate = True
  72.         self.statusctx = self.statusbar.get_context_id('main')
  73.         self.statusstackheight = 0
  74.         self.layout_sources_size = [
  75.             0,
  76.             0]
  77.         self.lang = [
  78.             None,
  79.             None,
  80.             None]
  81.         self.pages = []
  82.         self.outtext = ''
  83.         self.cancelled = False
  84.         self.langmenuhead = self.builder.get_object('tb_langmenu')
  85.         self.langmenuhead.set_use_underline(False)
  86.         self.langmenuhead.get_children()[0].get_children()[1].hide()
  87.         self.acquire = acquire.Acquire(self.builder, self)
  88.         self.drawingarea = drawingarea.Drawingarea(self.builder, self)
  89.         self.versionnotifier = notifier.VersionNotifier(self.builder)
  90.         self.conf = config.Config(self.builder)
  91.         self.outbuffer = outbuffer.Outbuffer(self.builder, self)
  92.         self.filelist = filelist.FileList(self.builder, self)
  93.         self.window.connect('delete-event', self.quit)
  94.         self.window.connect('window-state-event', self._gimagereader__store_window_state)
  95.         self.langmenuhead.connect(('clicked',), (lambda w: self.langmenuhead.get_children()[0].get_children()[1].clicked()))
  96.         self.builder.get_object('menu_config').connect('activate', self.show_config)
  97.         self.builder.get_object('menu_guide').connect('activate', (lambda w: dialogs.help()))
  98.         self.builder.get_object('menu_about').connect('activate', self._gimagereader__show_about)
  99.         self.builder.get_object('menu_quit').connect('activate', self.quit)
  100.         self.menu_toggle_sources.connect('toggled', self._gimagereader__toggle_sources)
  101.         self.layout_sources.connect('size-allocate', self._gimagereader__layout_sources_size_changed)
  102.         self.builder.get_object('button_sources_close').connect('clicked', self._gimagereader__close_sources)
  103.         self.tb_stopocr.connect('clicked', self._gimagereader__recognize_stop)
  104.         geo = self.conf.get_default_geometry()
  105.         if geo != None:
  106.             self.window.resize(geo[2], geo[3])
  107.             self.window.move(geo[0], geo[1])
  108.         self.builder.get_object('hpaned_output').set_orientation(self.conf.get_pane_orientation())
  109.         self.window.show()
  110.         self.set_status(_('Select an image to begin...'))
  111.         if not self.conf.get_valid():
  112.             self.show_config()
  113.         else:
  114.             self.load_dictionaries()
  115.         if self.conf.get_update_check() == True:
  116.             threadtools.SubprocessThread(self._gimagereader__getnewversion, self._gimagereader__checkversion).start()
  117.         if files != None:
  118.             self.filelist.open_images(None, files)
  119.  
  120.     
  121.     def quit(self, Widget = None, event = None):
  122.         if not self.outbuffer.clear_buffer():
  123.             return True
  124.         None.outbuffer.detach_spellchecker()
  125.         if self.normalstate:
  126.             self.conf.set_default_geometry(self.window.get_position(), self.window.get_size())
  127.             self.conf.save_config()
  128.         gtk.main_quit()
  129.         sys.exit(0)
  130.  
  131.     
  132.     def get_config(self):
  133.         ''' Returns the configuration instance. '''
  134.         return self.conf
  135.  
  136.     
  137.     def get_drawingarea(self):
  138.         ''' Returns the drawingarea instance. '''
  139.         return self.drawingarea
  140.  
  141.     
  142.     def get_filelist(self):
  143.         ''' Returns the filelist instance. '''
  144.         return self.filelist
  145.  
  146.     
  147.     def push_status(self, message):
  148.         ''' Pushes a message on the statusbar. '''
  149.         self.statusbar.push(self.statusctx, message)
  150.         self.statusstackheight += 1
  151.  
  152.     
  153.     def pop_status(self):
  154.         ''' Pops the last message from the statusbar. '''
  155.         self.statusbar.pop(self.statusctx)
  156.         self.statusstackheight -= 1
  157.  
  158.     
  159.     def set_status(self, message):
  160.         ''' Sets the status of the statusbar. Note that his clears the stack of existing messages. '''
  161.         for i in range(0, self.statusstackheight):
  162.             self.statusbar.pop(self.statusctx)
  163.         
  164.         self.statusstackheight = 1
  165.         self.statusbar.push(self.statusctx, message)
  166.  
  167.     
  168.     def set_busy(self, busy, message = None):
  169.         ''' Sets whether the the application is busy (wait cursor, insensitive window). If busy=True, the message argument is mandatory. '''
  170.         if self.builder.get_object('menubar').get_property('sensitive') != busy:
  171.             return False
  172.         return False
  173.  
  174.     
  175.     def __set_tb_sensitive(self, widget, sensitive):
  176.         if widget != self.tb_stopocr:
  177.             widget.set_sensitive(sensitive)
  178.  
  179.     
  180.     def __toggle_sources(self, widget = None):
  181.         if not self.layout_sources.flags() & gtk.VISIBLE:
  182.             self.layout_sources.show()
  183.         else:
  184.             self.layout_sources.hide()
  185.  
  186.     
  187.     def __close_sources(self, widget):
  188.         self.menu_toggle_sources.set_active(False)
  189.  
  190.     
  191.     def __layout_sources_size_changed(self, widget, allocation):
  192.         if allocation.width == self.layout_sources_size[0] and allocation.height == self.layout_sources_size[1]:
  193.             return None
  194.         self.layout_sources_size = [
  195.             None.width,
  196.             allocation.height]
  197.         self.notebook_sources.set_size_request(allocation.width, allocation.height)
  198.         self.layout_sources.move(self.eventbox_sources_close, allocation.width - self.eventbox_sources_close.allocation.width, -1)
  199.  
  200.     
  201.     def recognize(self, pages = None):
  202.         ''' Recognizes the text in the range of pages. If pages is not specified, the current image/selection is recognized. '''
  203.         self.set_busy(True, _('Recognizing, please wait...'))
  204.         self.tb_stopocr.show()
  205.         self.tb_doocr.hide()
  206.         self.tb_stopocr.set_sensitive(True)
  207.         self.cancelled = False
  208.         self.outtext = ''
  209.         if pages:
  210.             self.pages = pages
  211.             threadtools.SubprocessThread(self._gimagereader__recognize_do, self._gimagereader__recognize_done, self.drawingarea.get_selection(self.pages[0])).start()
  212.         else:
  213.             threadtools.SubprocessThread(self._gimagereader__recognize_do, self._gimagereader__recognize_done, self.drawingarea.get_selection()).start()
  214.  
  215.     
  216.     def __recognize_do(self, image):
  217.         tess = self.conf.get_paths([
  218.             'tess'])[0]
  219.         (temptifdesc, temptif) = tempfile.mkstemp('.tif', 'tmpocr')
  220.         
  221.         try:
  222.             image.save(temptif, 'TIFF', compression = 'raw')
  223.         except:
  224.             return [
  225.                 False,
  226.                 _('Failed to perform recognition'),
  227.                 _('Could not save selection to temporary folder.')]
  228.  
  229.         (tmptxtdesc, tmptxt) = tempfile.mkstemp('.txt', 'tmpocr')
  230.         p = subprocess.Popen([
  231.             tess,
  232.             temptif,
  233.             tmptxt[:-4],
  234.             '-l',
  235.             self.lang[0]], shell = False, stderr = subprocess.PIPE, stdout = open(os.devnull, 'a'), creationflags = threadtools.popencf)
  236.         out = p.communicate()
  237.         os.close(temptifdesc)
  238.         os.remove(temptif)
  239.         if p.returncode != 0 or not os.path.isfile(tmptxt):
  240.             return [
  241.                 False,
  242.                 _('Failed to perform recognition'),
  243.                 'tesseract ' + _('returned') + ':\n' + out[1] + '\n' + _('This probabily is a bug in tesseract, retry using an image at a different resolution or by varying the selected region.')]
  244.         outfile = None(tmptxt, 'r')
  245.         self.outtext += outfile.read()
  246.         os.close(tmptxtdesc)
  247.         outfile.close()
  248.         os.remove(tmptxt)
  249.         return [
  250.             True]
  251.  
  252.     
  253.     def __recognize_done(self, result):
  254.         ''' Finalizes the recognition process, initiated by see self.recognize. '''
  255.         if self.cancelled:
  256.             self.outtext = ''
  257.             return None
  258.         if None[0] != True:
  259.             dialogs.error_dialog(result[1], result[2], self.window)
  260.         else:
  261.             self.pages = self.pages[1:]
  262.             if self.pages:
  263.                 threadtools.SubprocessThread(self._gimagereader__recognize_do, self._gimagereader__recognize_done, self.drawingarea.get_selection(self.pages[0])).start()
  264.                 return None
  265.             None.outbuffer.set_buffer(self.outtext, self.filelist.suggest_output())
  266.         self.set_busy(False)
  267.         self.tb_stopocr.hide()
  268.         self.tb_doocr.show()
  269.         self.outtext = ''
  270.  
  271.     
  272.     def __recognize_stop(self, widget):
  273.         self.cancelled = True
  274.         self.set_busy(False)
  275.         self.tb_stopocr.hide()
  276.         self.tb_doocr.show()
  277.  
  278.     
  279.     def __store_window_state(self, widget, event):
  280.         self.normalstate = event.new_window_state == 0
  281.  
  282.     
  283.     def show_config(self, widget = None):
  284.         self.conf.show_dialog()
  285.         if not self.conf.get_valid():
  286.             self.window.connect('event-after', self.quit)
  287.         else:
  288.             self.load_dictionaries()
  289.             self.builder.get_object('hpaned_output').set_orientation(self.conf.get_pane_orientation())
  290.  
  291.     
  292.     def load_dictionaries(self):
  293.         langmenu = gtk.Menu()
  294.         alldicts = enchant.list_dicts()
  295.         checkitem = None
  296.         langset = False
  297.         activelang = self.lang[2]
  298.         if not activelang:
  299.             activelang = self.conf.get_pref_lang()
  300.         for lang in self.conf.get_languages():
  301.             item = gtk.MenuItem(lang[1])
  302.             submenu = gtk.Menu()
  303.             dicts = [ d[0] for d in alldicts if d[0][0:2] == lang[2][0:2] ]
  304.             dicts.sort()
  305.             if not dicts:
  306.                 dicts = [
  307.                     lang[2]]
  308.             for d in dicts:
  309.                 checkitem = gtk.RadioMenuItem(checkitem, d, False)
  310.                 checkitem.connect('activate', self._gimagereader__change_language, [
  311.                     lang[0],
  312.                     lang[1],
  313.                     d])
  314.                 submenu.append(checkitem)
  315.                 if d == activelang:
  316.                     checkitem.set_active(True)
  317.                     langset = True
  318.                     continue
  319.             item.set_submenu(submenu)
  320.             langmenu.append(item)
  321.         
  322.         if not langset:
  323.             langmenu.get_children()[0].get_submenu().get_children()[0].set_active(True)
  324.         self.langmenuhead.set_menu(langmenu)
  325.         langmenu.show_all()
  326.  
  327.     
  328.     def __change_language(self, widget, lang):
  329.         self.langmenuhead.set_label('%s (%s)' % (lang[1], lang[2]))
  330.         self.outbuffer.set_language(lang)
  331.         self.lang = lang
  332.  
  333.     
  334.     def __show_about(self, widget):
  335.         ''' Callback to the about entry of the help menu. '''
  336.         self.aboutdialog.run()
  337.         self.aboutdialog.hide()
  338.  
  339.     
  340.     def __getnewversion(self):
  341.         ''' Retreives the latest published program version. '''
  342.         
  343.         try:
  344.             urlh = urllib2.urlopen('http://sourceforge.net/projects/gimagereader/files/LATEST/download?use_mirror=autoselect', None, 20)
  345.         except:
  346.             return 'unknown'
  347.  
  348.         return urlh.read()
  349.  
  350.     
  351.     def __checkversion(self, txt):
  352.         ''' Compares the latest published program version (see self.__getnewversion) to the current program version. '''
  353.         if txt == 'unknown':
  354.             return None
  355.         nv = None.replace('\n', '').split('.')
  356.         cv = self.aboutdialog.get_version()
  357.         if cv[-4:] == '-svn':
  358.             cv = cv[:-4]
  359.         cv = cv.split('.')
  360.         l = min(len(cv), len(nv))
  361.         for i in range(l):
  362.             if int(nv[i]) != int(cv[i]) or int(nv[i]) > int(cv[i]):
  363.                 self.versionnotifier.notify(_('New version'), 'gImageReader ' + txt.replace('\n', '') + ' ' + _('is available.'), (('Download', (lambda w, e: webbrowser.open('http://sourceforge.net/projects/gimagereader/files'))), ('Changelog', (lambda w, e: webbrowser.open('http://sourceforge.net/projects/gimagereader/files/changelog.txt/download?use_mirror=autoselect')))))
  364.             break
  365.             continue
  366.         
  367.  
  368.  
  369.