[Pycodeocr-main] SF.net SVN: pycodeocr:[39] branches/laserb
Status: Beta
Brought to you by:
drtrigon
From: <la...@us...> - 2011-03-01 16:55:33
|
Revision: 39 http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=39&view=rev Author: laserb Date: 2011-03-01 16:55:25 +0000 (Tue, 01 Mar 2011) Log Message: ----------- make it runable Modified Paths: -------------- branches/laserb/PyCodeOCR.glade branches/laserb/PyCodeOCR.py Added Paths: ----------- branches/laserb/Modules/ Modified: branches/laserb/PyCodeOCR.glade =================================================================== --- branches/laserb/PyCodeOCR.glade 2011-02-11 11:33:53 UTC (rev 38) +++ branches/laserb/PyCodeOCR.glade 2011-03-01 16:55:25 UTC (rev 39) @@ -2,13 +2,13 @@ <glade-interface> <!-- interface-requires gtk+ 2.16 --> <!-- interface-naming-policy toplevel-contextual --> - <widget class="GtkWindow" id="window1"> + <widget class="GtkWindow" id="main_window"> <property name="width_request">786</property> <property name="height_request">242</property> <signal name="motion_notify_event" handler="on_pointer_motion"/> - <signal name="destroy" handler="on_window1_destroy"/> + <signal name="destroy" handler="on_main_window_destroy"/> <child> - <widget class="GtkNotebook" id="notebook1"> + <widget class="GtkNotebook" id="notebook"> <property name="width_request">786</property> <property name="height_request">242</property> <property name="visible">True</property> @@ -27,7 +27,7 @@ <property name="height_request">32</property> <property name="visible">True</property> <child> - <widget class="GtkComboBox" id="combobox2"> + <widget class="GtkComboBox" id="mode_combobox"> <property name="width_request">200</property> <property name="height_request">29</property> <property name="visible">True</property> @@ -36,7 +36,7 @@ DataMatrix optical recogn. (beta) PDF417 bc. optical recogn. (beta) </property> - <signal name="changed" handler="on_combobox2_changed"/> + <signal name="changed" handler="on_mode_changed"/> </widget> <packing> <property name="expand">False</property> @@ -52,7 +52,7 @@ <property name="visible">True</property> <property name="spacing">11</property> <child> - <widget class="GtkRadioButton" id="radiobutton1"> + <widget class="GtkRadioButton" id="file_input_button"> <property name="width_request">21</property> <property name="height_request">21</property> <property name="visible">True</property> @@ -60,8 +60,8 @@ <property name="receives_default">False</property> <property name="use_underline">True</property> <property name="draw_indicator">True</property> - <property name="group">radiobutton2</property> - <signal name="toggled" handler="on_combobox2_changed"/> + <property name="group">sane_input_button</property> + <signal name="toggled" handler="on_file_input_button_toggled"/> </widget> <packing> <property name="expand">False</property> @@ -71,12 +71,12 @@ </packing> </child> <child> - <widget class="GtkFileChooserButton" id="filechooserbutton1"> + <widget class="GtkFileChooserButton" id="filechooserbutton"> <property name="width_request">168</property> <property name="height_request">29</property> <property name="visible">True</property> <property name="do_overwrite_confirmation">True</property> - <signal name="file_set" handler="on_filechooserbutton1_file_set"/> + <signal name="file_set" handler="on_filechooserbutton_file_set"/> </widget> <packing> <property name="expand">False</property> @@ -103,7 +103,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label9"> + <widget class="GtkLabel" id="scanned_code_label"> <property name="width_request">102</property> <property name="height_request">17</property> <property name="visible">True</property> @@ -117,11 +117,11 @@ </packing> </child> <child> - <widget class="GtkEventBox" id="eventbox2"> + <widget class="GtkEventBox" id="main_image_eventbox"> <property name="visible">True</property> - <signal name="button_press_event" handler="on_eventbox2_button_press_event"/> + <signal name="button_press_event" handler="on_main_image_eventbox_button_press_event"/> <child> - <widget class="GtkImage" id="image1"> + <widget class="GtkImage" id="main_image"> <property name="visible">True</property> </widget> </child> @@ -132,7 +132,7 @@ </packing> </child> <child> - <widget class="GtkEntry" id="entry1"> + <widget class="GtkEntry" id="output"> <property name="width_request">504</property> <property name="height_request">27</property> <property name="visible">True</property> @@ -148,7 +148,7 @@ </packing> </child> <child> - <widget class="GtkProgressBar" id="progressbar1"> + <widget class="GtkProgressBar" id="progressbar"> <property name="width_request">504</property> <property name="height_request">20</property> <property name="visible">True</property> @@ -174,7 +174,7 @@ <property name="height_request">30</property> <property name="visible">True</property> <child> - <widget class="GtkRadioButton" id="radiobutton2"> + <widget class="GtkRadioButton" id="sane_input_button"> <property name="label" translatable="yes">Standard SANE Interface</property> <property name="width_request">224</property> <property name="height_request">21</property> @@ -184,7 +184,7 @@ <property name="use_underline">True</property> <property name="active">True</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_combobox2_changed"/> + <signal name="toggled" handler="on_sane_input_button_toggled"/> </widget> <packing> <property name="expand">False</property> @@ -194,13 +194,13 @@ </packing> </child> <child> - <widget class="GtkButton" id="button1"> + <widget class="GtkButton" id="retry_button"> <property name="label" translatable="yes">Retry</property> <property name="width_request">60</property> <property name="height_request">29</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_button1_clicked"/> + <signal name="clicked" handler="on_retry_button_clicked"/> </widget> <packing> <property name="expand">False</property> @@ -218,7 +218,7 @@ </packing> </child> <child> - <widget class="GtkFrame" id="frame1"> + <widget class="GtkFrame" id="placement_frame"> <property name="visible">True</property> <property name="label_xalign">0</property> <child> @@ -229,7 +229,7 @@ <widget class="GtkFixed" id="fixed2"> <property name="visible">True</property> <child> - <widget class="GtkLabel" id="label2"> + <widget class="GtkLabel" id="position_label"> <property name="width_request">72</property> <property name="height_request">17</property> <property name="visible">True</property> @@ -240,7 +240,7 @@ </packing> </child> <child> - <widget class="GtkSpinButton" id="spinbutton1"> + <widget class="GtkSpinButton" id="position_x"> <property name="width_request">56</property> <property name="height_request">27</property> <property name="visible">True</property> @@ -248,14 +248,14 @@ <property name="adjustment">1 0 200 1 10 0</property> <property name="climb_rate">1</property> <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> + <signal name="value_changed" handler="on_placement_value_changed"/> </widget> <packing> <property name="x">80</property> </packing> </child> <child> - <widget class="GtkSpinButton" id="spinbutton2"> + <widget class="GtkSpinButton" id="position_y"> <property name="width_request">56</property> <property name="height_request">27</property> <property name="visible">True</property> @@ -263,14 +263,14 @@ <property name="adjustment">1 0 200 1 10 0</property> <property name="climb_rate">1</property> <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> + <signal name="value_changed" handler="on_placement_value_changed"/> </widget> <packing> <property name="x">144</property> </packing> </child> <child> - <widget class="GtkSpinButton" id="spinbutton3"> + <widget class="GtkSpinButton" id="size_x"> <property name="width_request">56</property> <property name="height_request">27</property> <property name="visible">True</property> @@ -278,7 +278,7 @@ <property name="adjustment">1 0 200 1 10 0</property> <property name="climb_rate">1</property> <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> + <signal name="value_changed" handler="on_placement_value_changed"/> </widget> <packing> <property name="x">80</property> @@ -286,7 +286,7 @@ </packing> </child> <child> - <widget class="GtkSpinButton" id="spinbutton4"> + <widget class="GtkSpinButton" id="size_y"> <property name="width_request">56</property> <property name="height_request">27</property> <property name="visible">True</property> @@ -294,7 +294,7 @@ <property name="adjustment">1 0 200 1 10 0</property> <property name="climb_rate">1</property> <property name="numeric">True</property> - <signal name="value_changed" handler="on_spinbutton_value_changed"/> + <signal name="value_changed" handler="on_placement_value_changed"/> </widget> <packing> <property name="x">144</property> @@ -302,7 +302,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label3"> + <widget class="GtkLabel" id="size_label"> <property name="width_request">72</property> <property name="height_request">17</property> <property name="visible">True</property> @@ -317,7 +317,7 @@ </widget> </child> <child> - <widget class="GtkLabel" id="label1"> + <widget class="GtkLabel" id="placement_label"> <property name="visible">True</property> <property name="label" translatable="yes">Placement</property> <property name="use_markup">True</property> @@ -340,7 +340,7 @@ <property name="height_request">30</property> <property name="visible">True</property> <child> - <widget class="GtkLabel" id="label5"> + <widget class="GtkLabel" id="orientation_label"> <property name="width_request">92</property> <property name="height_request">21</property> <property name="visible">True</property> @@ -354,7 +354,7 @@ </packing> </child> <child> - <widget class="GtkComboBox" id="combobox1"> + <widget class="GtkComboBox" id="orientation"> <property name="width_request">90</property> <property name="height_request">29</property> <property name="visible">True</property> @@ -362,7 +362,7 @@ 90 deg 180 deg 270 deg</property> - <signal name="changed" handler="on_combobox1_changed"/> + <signal name="changed" handler="on_orientation_changed"/> </widget> <packing> <property name="expand">False</property> @@ -392,7 +392,7 @@ <property name="height_request">31</property> <property name="visible">True</property> <child> - <widget class="GtkToggleButton" id="togglebutton1"> + <widget class="GtkToggleButton" id="scan_button"> <property name="label" translatable="yes">scan</property> <property name="width_request">90</property> <property name="height_request">29</property> @@ -400,7 +400,7 @@ <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_underline">True</property> - <signal name="toggled" handler="on_togglebutton1_toggled"/> + <signal name="toggled" handler="on_scan_button_clicked"/> </widget> <packing> <property name="fill">False</property> @@ -408,7 +408,7 @@ </packing> </child> <child> - <widget class="GtkButton" id="button2"> + <widget class="GtkButton" id="exit_button"> <property name="label" translatable="yes">exit</property> <property name="width_request">90</property> <property name="height_request">19</property> @@ -416,7 +416,7 @@ <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_button2_clicked"/> + <signal name="clicked" handler="on_exit_button_clicked"/> </widget> <packing> <property name="fill">False</property> @@ -441,7 +441,7 @@ </widget> </child> <child> - <widget class="GtkLabel" id="label4"> + <widget class="GtkLabel" id="scan_label"> <property name="visible">True</property> <property name="label" translatable="yes">SCAN</property> </widget> @@ -458,14 +458,14 @@ <property name="visible">True</property> <property name="resize_mode">immediate</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow3"> + <widget class="GtkScrolledWindow" id="device_info_scrolled"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">automatic</property> <property name="window_placement_set">True</property> <child> - <widget class="GtkTextView" id="textview3"> + <widget class="GtkTextView" id="device_info_text"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="editable">False</property> @@ -483,7 +483,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label6"> + <widget class="GtkLabel" id="device_info_label"> <property name="visible">True</property> <property name="label" translatable="yes">Device Info</property> </widget> @@ -504,7 +504,7 @@ <property name="height_request">80</property> <property name="visible">True</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow2"> + <widget class="GtkScrolledWindow" id="device_list_scrolled"> <property name="width_request">740</property> <property name="height_request">140</property> <property name="visible">True</property> @@ -512,7 +512,7 @@ <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">automatic</property> <child> - <widget class="GtkTreeView" id="treeview1"> + <widget class="GtkTreeView" id="device_treeview"> <property name="width_request">740</property> <property name="height_request">140</property> <property name="visible">True</property> @@ -526,14 +526,14 @@ </packing> </child> <child> - <widget class="GtkButton" id="button3"> + <widget class="GtkButton" id="device_chooser_button"> <property name="label" translatable="yes">OK</property> <property name="width_request">90</property> <property name="height_request">29</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_button3_clicked"/> + <signal name="clicked" handler="on_device_chooser_button_clicked"/> </widget> <packing> <property name="expand">False</property> @@ -559,7 +559,7 @@ </packing> </child> <child> - <widget class="GtkButton" id="button5"> + <widget class="GtkButton" id="blacklist_add_button"> <property name="label" translatable="yes">--></property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -573,7 +573,7 @@ </packing> </child> <child> - <widget class="GtkButton" id="button4"> + <widget class="GtkButton" id="blacklist_remove_button"> <property name="label" translatable="yes"><--</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -608,7 +608,7 @@ <property name="height_request">80</property> <property name="visible">True</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow4"> + <widget class="GtkScrolledWindow" id="blacklist_scrolled"> <property name="width_request">740</property> <property name="height_request">140</property> <property name="visible">True</property> @@ -616,7 +616,7 @@ <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">automatic</property> <child> - <widget class="GtkTreeView" id="treeview2"> + <widget class="GtkTreeView" id="blacklist_treeview"> <property name="width_request">740</property> <property name="height_request">140</property> <property name="visible">True</property> @@ -640,7 +640,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label7"> + <widget class="GtkLabel" id="blacklist_label"> <property name="visible">True</property> <property name="label" translatable="yes">Blacklist</property> </widget> @@ -655,14 +655,14 @@ <property name="visible">True</property> <property name="resize_mode">immediate</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow1"> + <widget class="GtkScrolledWindow" id="log_scrolled"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">automatic</property> <property name="window_placement_set">True</property> <child> - <widget class="GtkTextView" id="textview1"> + <widget class="GtkTextView" id="log_text"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="editable">False</property> @@ -680,7 +680,7 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label10"> + <widget class="GtkLabel" id="log_label"> <property name="visible">True</property> <property name="label" translatable="yes">Log</property> </widget> @@ -693,7 +693,7 @@ </widget> </child> </widget> - <widget class="GtkWindow" id="window3"> + <widget class="GtkWindow" id="img_popup"> <property name="type">popup</property> <property name="window_position">mouse</property> <property name="destroy_with_parent">True</property> @@ -702,13 +702,13 @@ <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <child> - <widget class="GtkEventBox" id="eventbox1"> + <widget class="GtkEventBox" id="popup_image_eventbox"> <property name="visible">True</property> <property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_PROXIMITY_IN_MASK | GDK_PROXIMITY_OUT_MASK | GDK_SUBSTRUCTURE_MASK | GDK_SCROLL_MASK</property> <property name="extension_events">all</property> <property name="visible_window">False</property> <child> - <widget class="GtkImage" id="image2"> + <widget class="GtkImage" id="popup_image"> <property name="visible">True</property> </widget> </child> Modified: branches/laserb/PyCodeOCR.py =================================================================== --- branches/laserb/PyCodeOCR.py 2011-02-11 11:33:53 UTC (rev 38) +++ branches/laserb/PyCodeOCR.py 2011-03-01 16:55:25 UTC (rev 39) @@ -7,7 +7,7 @@ # for many unix (and also windows) platforms. # python standard modules -import os, re, sys, subprocess, time, gobject, string, struct +import os, re, sys, time, gobject, string, struct # GTK, PyGTK, GLADE (GNOME) modules @@ -16,7 +16,13 @@ import gtk, gtk.glade import gobject -from checksum import modulo10 +# import Modules +from Modules.checksum import modulo10 +#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 # PIL image library and it's SANE bindings import Image, ImageDraw @@ -112,175 +118,214 @@ ## Initialize def __init__(self): # retrieve widgets - # window1 - main window + # main_window - main window ## gladefile raw_path.glade self.gladefile = raw_path + ".glade" ## get xml from gladefile self.xml = gtk.glade.XML(self.gladefile) ## main window - self.window1 = self.xml.get_widget('window1') + self.main_window = self.xml.get_widget('main_window') ## notebok - self.notebook = self.xml.get_widget('notebook1') + self.notebook = self.xml.get_widget('notebook') ## image window - self.window3 = self.xml.get_widget('window3') + self.img_popup = self.xml.get_widget('img_popup') ## scan button - self.togglebutton1 = self.xml.get_widget('togglebutton1') + self.scan_button = self.xml.get_widget('scan_button') ## restart button - self.button1 = self.xml.get_widget('button1') + self.retry_button = self.xml.get_widget('retry_button') ## exit button - self.button2 = self.xml.get_widget('button2') + self.exit_button = self.xml.get_widget('exit_button') ## placement frame - self.frame1 = self.xml.get_widget('frame1') + self.placement_frame = self.xml.get_widget('placement_frame') ## image - self.image1 = self.xml.get_widget('image1') + self.main_image = self.xml.get_widget('main_image') ## image - self.image2 = self.xml.get_widget('image2') + self.popup_image = self.xml.get_widget('popup_image') ## output line - self.entry1 = self.xml.get_widget('entry1') - self.textview1 = self.xml.get_widget('textview1') - self.textbuffer = self.textview1.get_buffer() - self.entry3 = self.xml.get_widget('textview3') + self.output = self.xml.get_widget('output') + self.log_text = self.xml.get_widget('log_text') + self.textbuffer = self.log_text.get_buffer() + self.entry3 = self.xml.get_widget('device_info_text') ## progressbar - self.progressbar1 = self.xml.get_widget('progressbar1') + self.progressbar = self.xml.get_widget('progressbar') ## Orientation label - self.label5 = self.xml.get_widget('label5') + self.placement_label = self.xml.get_widget('placement_label') ## Orientation combobox - self.combobox1 = self.xml.get_widget('combobox1') + self.orientation = self.xml.get_widget('orientation') ## mode combobox - self.combobox2 = self.xml.get_widget('combobox2') + self.mode_combobox = self.xml.get_widget('mode_combobox') ## x-position - self.spinbutton1 = self.xml.get_widget('spinbutton1') + self.position_x = self.xml.get_widget('position_x') ## y-position - self.spinbutton2 = self.xml.get_widget('spinbutton2') + self.position_y = self.xml.get_widget('position_y') ## x-size - self.spinbutton3 = self.xml.get_widget('spinbutton3') + self.size_x = self.xml.get_widget('size_x') ## y-size - self.spinbutton4 = self.xml.get_widget('spinbutton4') + self.size_y = self.xml.get_widget('size_y') ## file input - self.radiobutton1 = self.xml.get_widget('radiobutton1') + self.file_input_button = self.xml.get_widget('file_input_button') ## sane input - self.radiobutton2 = self.xml.get_widget('radiobutton2') + self.sane_input_button = self.xml.get_widget('sane_input_button') ## choose file - self.filechooserbutton1 = self.xml.get_widget('filechooserbutton1') + self.filechooserbutton = self.xml.get_widget('filechooserbutton') ## device list - self.treeview1 = self.xml.get_widget('treeview1') + self.device_treeview = self.xml.get_widget('device_treeview') ## blacklisted device list - self.treeview2 = self.xml.get_widget('treeview2') + self.blacklist_treeview = self.xml.get_widget('blacklist_treeview') ## OK button - self.button3 = self.xml.get_widget('button3') + self.device_chooser_button = self.xml.get_widget('device_chooser_button') ## event box for image - self.eventbox2 = self.xml.get_widget('eventbox2') + self.main_image_eventbox = self.xml.get_widget('main_image_eventbox') ## event box for image window - self.eventbox1 = self.xml.get_widget('eventbox1') - - # redirect print - self.logging = logging(self.textbuffer) - #sys.stdout = self.logging - #sys.stderr = self.logging - - print "---------",strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()),"----------" + self.popup_image_eventbox = self.xml.get_widget('popup_image_eventbox') # initiate orientation and position - self.combobox1.set_active(0) - self.spinbutton1.set_value(self.scan_koords[0]) - self.spinbutton2.set_value(self.scan_koords[1]) - self.spinbutton3.set_value(self.scan_koords[2]) - self.spinbutton4.set_value(self.scan_koords[3]) - self.combobox2.set_active(0) + self.orientation.set_active(0) + self.position_x.set_value(self.scan_koords[0]) + self.position_y.set_value(self.scan_koords[1]) + self.size_x.set_value(self.scan_koords[2]) + self.size_y.set_value(self.scan_koords[3]) + self.mode_combobox.set_active(0) if "gocr" not in pakages: - self.combobox2.remove_text(1) - self.combobox2.insert_text(1, "< not installed >") + self.mode_combobox.remove_text(1) + self.mode_combobox.insert_text(1, "< not installed >") if "libdmtx" not in pakages: - self.combobox2.remove_text(2) - self.combobox2.insert_text(2, "< not installed >") + self.mode_combobox.remove_text(2) + self.mode_combobox.insert_text(2, "< not installed >") if "pdf417decode" not in pakages: - self.combobox2.remove_text(3) - self.combobox2.insert_text(3, "< not installed >") - #self.on_radiobutton1_toggled() + self.mode_combobox.remove_text(3) + self.mode_combobox.insert_text(3, "< not installed >") # connect signal handlers self.xml.signal_autoconnect( self ) # 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.") - self.button1.set_visible(True) - self.image1.set_tooltip_text("Click for bigger image") - self.image2.set_tooltip_text("Leave window to close") + self.retry_button.set_tooltip_text("Restart PyCodeOCR to search for a SANE device.") + self.retry_button.set_visible(True) + self.main_image.set_tooltip_text("Click for bigger image") + self.popup_image.set_tooltip_text("Leave window to close") - # take some time to init sane - #self.init_sane() + # redirect print + self.logging = logging(self.textbuffer) + #sys.stdout = self.logging + #sys.stderr = self.logging + + + # initialize treeviews in Blacklist Manager + BlacklistMgr.post_init(self.device_treeview, self.blacklist_treeview, local_path) + + print "---------",strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()),"----------" + + # init sane when idle, hopefully this is right after GUI is loaded gobject.idle_add(self.init_sane) # display window - self.window1.show() + self.main_window.show() return + ## Run gtk mainloop and with it THIS APP. + def run(self): + gtk.main() + + + ## initialize sane + # def init_sane(self, source=None): # lock window - self.window1.set_sensitive(False) + self.main_window.set_sensitive(False) # init sane - self.run_sane = RunSANE(self) + self.run_sane = RunSANE() - # try to set sensitivity, fails if no scanner is initialized yet - try: - self.init_sensitivity() - except: + # select device if more than one is found + if self.run_sane.found_scanner == None: # set default row to first - self.treeview1.set_cursor(0) + self.device_treeview.set_cursor(0) # show tab with device list # choose device and press ok to initialize scanner -# self.window2.show() 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() + # return false, otherwise gobject runs it again return False + + 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() + ## set sensitivity of buttons the first time + def init_sensitivity(self): + # set sensitivity + if self.run_sane.found_scanner: + self.sane_input_button.set_active(True) + self.sane_input_button.set_sensitive(True) + else: + self.file_input_button.set_active(True) + self.sane_input_button.set_sensitive(False) + + # Try to set orientation and placement sensitive + self.toggle_orientation_sensitive(True) + self.toggle_placement_sensitive(True) + + ## toggle orientation sensitivity + def toggle_orientation_sensitive(self, value): + self.placement_label.set_sensitive(value) + self.orientation.set_sensitive(value) - ## Run gtk mainloop and with it THIS APP. - def run(self): - gtk.main() + ## toggle placement sensitivity + def toggle_placement_sensitive(self, value): + if self.sane_input_button.get_active(): + self.placement_frame.set_sensitive(value) + else: + self.placement_frame.set_sensitive(False) + + + ## signals / glade callbacks # - def on_leave_window(self, source=None, event=None): - if self.window3.get_visible(): - self.on_eventbox2_button_press_event() - self.notebook.set_current_page(3) - def on_pointer_motion(self, source=None, event=None): pass -# (x,y,state) = self.window1.window.get_pointer() -# (wxim, wyim ) = self.image1.get_size_request() +# (x,y,state) = self.main_window.window.get_pointer() +# (wxim, wyim ) = self.main_image.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() +# if not self.img_popup.get_visible(): +# self.on_main_image_eventbox_button_press_event() - def on_eventbox2_button_press_event(self, source=None, event=None): - if self.window3.get_visible(): + def on_main_image_eventbox_button_press_event(self, source=None, event=None): + if self.img_popup.get_visible(): # clean-up os.remove( self.image_file_big ) # hide window - self.window3.hide() + self.img_popup.hide() else: # load original image im1 = Image.open(self.imageFile) # adjust width and height to your needs and keep ratio (im_width, im_height) = im1.size #get image size # get size of shown image - width = self.image1.allocation.width - height = self.image1.allocation.height + width = self.main_image.allocation.width + height = self.main_image.allocation.height # make it bigger in window # size should be at least 600 @@ -302,80 +347,39 @@ self.image_file_big = self.temp+"06.jpg" im.save( self.image_file_big ) # set image - self.image2.set_from_file( self.image_file_big ) + self.popup_image.set_from_file( self.image_file_big ) # show window - self.window3.show() - - def on_button3_clicked(self, source=None): - self.button3.set_visible(False) - # get selection from treeview - devnr = self.treeview1.get_cursor()[0][0] - # hide window -# self.window2.hide() - # init scanner - self.run_sane.init_scanner(devnr) - # set sensitivity - self.init_sensitivity() + self.img_popup.show() + ## add device to blacklist def blacklist_add(self, widget=None): - treeselection = self.treeview1.get_selection() - model, iter =treeselection.get_selected() - data = model.get_value(iter, 0) - self.run_sane.blacklist_store.append([data]) - self.run_sane.list_store.remove(iter) - self.run_sane.write_blacklist() - + BlacklistMgr.blacklist_add() + ## remove device from blacklist def blacklist_remove(self, widget=None): - treeselection = self.treeview2.get_selection() - model, iter =treeselection.get_selected() - data = model.get_value(iter, 0) - self.run_sane.list_store.append([data]) - self.run_sane.blacklist_store.remove(iter) - self.run_sane.write_blacklist() + BlacklistMgr.blacklist_remove() - ## set sensitivity of buttons the first time - def init_sensitivity(self): - # set sensitivity - if len(self.run_sane.devices) == 0: - 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.progress(0.,"No SANE device found. Use file input instead.") - self.button1.set_visible(True) - - # 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) - ## one of the placement coordinates changed - def on_spinbutton_value_changed(self, source=None, event=None): - self.scan_koords = (self.spinbutton1.get_value(),self.spinbutton2.get_value(), - self.spinbutton3.get_value(),self.spinbutton4.get_value()) + def on_placement_value_changed(self, source=None, event=None): + self.scan_koords = (self.position_x.get_value(),self.position_y.get_value(), + self.size_x.get_value(),self.size_y.get_value()) ## Orientation changed - def on_combobox1_changed(self, source=None, event=None): - orient = self.combobox1.get_model()[self.combobox1.get_active()][0] + def on_orientation_changed(self, source=None, event=None): + orient = self.orientation.get_model()[self.orientation.get_active()][0] - self.spinbutton1.set_value(std_scan_koords[orient][0][0]) - self.spinbutton2.set_value(std_scan_koords[orient][0][1]) - self.spinbutton3.set_value(std_scan_koords[orient][0][2]) - self.spinbutton4.set_value(std_scan_koords[orient][0][3]) + self.position_x.set_value(std_scan_koords[orient][0][0]) + self.position_y.set_value(std_scan_koords[orient][0][1]) + self.size_x.set_value(std_scan_koords[orient][0][2]) + self.size_y.set_value(std_scan_koords[orient][0][3]) self.mode = std_scan_koords[orient][1] ## mode changed - def on_combobox2_changed(self, source=None): - op_mode = self.combobox2.get_active() + def on_mode_changed(self, source=None): + op_mode = self.mode_combobox.get_active() if (op_mode == self.MDE['invoices']): self.toggle_placement_sensitive(True) self.toggle_orientation_sensitive(True) @@ -390,12 +394,12 @@ self.toggle_orientation_sensitive(True) ## ToggleButton: 'scan'/'stop'. - def on_togglebutton1_toggled(self, source=None, event=None, *a): - if self.togglebutton1.get_active(): # scan ! - self.togglebutton1.set_label("stop") + def on_scan_button_clicked(self, source=None, event=None, *a): + if self.scan_button.get_active(): # scan ! + self.scan_button.set_label("stop") self.__stop = False - self.entry1.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color + self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color self.refresh() for i in range(self.max_retry): @@ -403,23 +407,23 @@ if check or (check == None) or self.__stop: break if self.__stop: return - self.entry1.modify_base(gtk.STATE_NORMAL, self.res_color[check]) # widget color + self.output.modify_base(gtk.STATE_NORMAL, self.res_color[check]) # widget color self.refresh() self.__stop = True # other way around; to be able to decide if it was stopped or ended correctly - self.togglebutton1.set_active(False) # (since this triggers THIS function again) + self.scan_button.set_active(False) # (since this triggers THIS function again) else: # stop/abort ! - self.togglebutton1.set_label("scan") + self.scan_button.set_label("scan") if self.__stop: return self.__stop = True - self.entry1.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color - self.progressbar1.set_text("Stopped by user!") + self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color + self.progressbar.set_text("Stopped by user!") self.refresh() return ## exit and restart - def on_button1_clicked(self, source=None, event=None): + def on_retry_button_clicked(self, source=None, event=None): try: self.run_sane.scanner.close() except: @@ -427,14 +431,14 @@ sane.exit() self.init_sane() # os.execv(sys.argv[0],sys.argv) -# self.on_window1_destroy() +# self.on_main_window_destroy() ## exit - def on_button2_clicked(self, source=None, event=None): - self.on_window1_destroy() + def on_exit_button_clicked(self, source=None, event=None): + self.on_main_window_destroy() ## press x-button on window - def on_window1_destroy(self, source=None, event=None): + def on_main_window_destroy(self, source=None, event=None): try: os.remove( self.temp+"04.jpg" ) # clean-up os.remove( self.image_file_small ) @@ -443,35 +447,16 @@ # exit gtk.main_quit() -# ## press x-button on device select window -# def on_window2_destroy(self, source=None): -# # when windows is closed by pressing the x-button -# # choose first device -# devnr = 0 -# # init scanner -# self.run_sane.init_scanner(self.progress, self.window2, self.treeview1, devnr) -# # set sensitivity -# self.init_sensitivity() ## file selected - def on_filechooserbutton1_file_set(self, source=None): - self.radiobutton1.set_active(True) - self.inp_file = self.filechooserbutton1.get_filename() + def on_filechooserbutton_file_set(self, source=None): + self.file_input_button.set_active(True) + self.inp_file = self.filechooserbutton.get_filename() if not os.path.exists(self.inp_file): self.progress(0., "File not found!") return None - ## toggle orientation sensitivity - def toggle_orientation_sensitive(self, value): - self.label5.set_sensitive(value) - self.combobox1.set_sensitive(value) - ## toggle placement sensitivity - def toggle_placement_sensitive(self, value): - if self.radiobutton2.get_active(): - self.frame1.set_sensitive(value) - else: - self.frame1.set_sensitive(False) # helpers # @@ -481,11 +466,11 @@ # (0/7) self.progress(0., "") max_steps = 7 - op_mode = self.combobox2.get_active() - source_mode = self.radiobutton2.get_active() + op_mode = self.mode_combobox.get_active() + source_mode = self.sane_input_button.get_active() if (op_mode == self.MDE['invoices']): # 0: invoices (tesser) - self.on_spinbutton_value_changed() # scan selected range - self.on_combobox1_changed() # orientation mode + self.on_placement_value_changed() # scan selected range + self.on_orientation_changed() # orientation mode opt = { 'tmp_file': "02.tif", 'recog_class': RunExternal, 'recog_cmd': self.cmd_tesser % (self.temp+"02", self.temp+"03"), @@ -493,7 +478,7 @@ '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.on_orientation_changed() # orientation mode self.scan_koords = std_scan_koords["A4"][0] #self.mode = std_scan_koords["A4"][1] opt = { 'tmp_file': "02.pnm", @@ -503,7 +488,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.on_orientation_changed() # orientation mode self.scan_koords = std_scan_koords["A4"][0] self.mode = std_scan_koords["A4"][1] #pydmtx recognition @@ -523,8 +508,8 @@ # 'recog_cmd': (self.temp+"02.png", [ None ], RunLibdmtx), } # 'resolution': 150, } elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine) - self.on_spinbutton_value_changed() # scan selected range - self.on_combobox1_changed() # orientation mode + self.on_placement_value_changed() # scan selected range + self.on_orientation_changed() # orientation mode opt = { 'tmp_file': "02.png", 'recog_class': RunExternal, 'recog_cmd': self.cmd_pdf417dec % (self.temp+"02",), @@ -550,7 +535,7 @@ #del self.run_sane else: # direct file input self.progress(1./max_steps, "Reading image...") - #self.inp_file = self.filechooserbutton1.get_filename() + #self.inp_file = self.filechooserbutton.get_filename() #if not os.path.exists(self.inp_file): # self.progress(0., "File not found!") # return None @@ -655,26 +640,18 @@ # initialize modulo10 checksum m10 = modulo10() # check amount, account number and reference number - checksum_b = (int(amount[-1]) == m10.run(amount[:-1]) ) - checksum_k = (int(account[-1]) == m10.run(account[:-1]) ) - checksum_r = (int(reference[-1]) == m10.run(reference[:-1]) ) - print "Amount: "+str(int(amount[2:-1])/100.) +" "+ str(checksum_b) - print "Account number: "+account +" "+ str(checksum_k) - print "Reference number: "+reference +" "+ str(checksum_r) + try: + checksum_b = (int(amount[-1]) == m10.run(amount[:-1]) ) + checksum_k = (int(account[-1]) == m10.run(account[:-1]) ) + checksum_r = (int(reference[-1]) == m10.run(reference[:-1]) ) + print "Amount: "+str(int(amount[2:-1])/100.) +" "+ str(checksum_b) + print "Account number: "+account +" "+ str(checksum_k) + print "Reference number: "+reference +" "+ str(checksum_r) - checksum = checksum_b and checksum_k and checksum_r - -# if len(data) == 42: -# # extract details -# (tmp, betrag, tmp, referenz, tmp, konto, tmp) = struct.unpack("2s11ss16s2s9ss",data) -# print "Betrag: "+str(int(betrag[:-1])/100.) -# print "Konto: "+konto[:2]+"-"+konto[3:-2]+"-"+konto[-2:] -# print "Referenznr: "+referenz -# if check: -# # modulo10 checksum for betrag -# checknr = modulo10().run(betrag[:-1]) -# print "Checknr: ",checknr -# checknr = ( checknr == int(betrag[-1]) ) + checksum = checksum_b and checksum_k and checksum_r + except: + checksum = False + check = False elif (op_mode == self.MDE['barcode']): # 1: barcode check = not (data['type'] == "unknown") if check: @@ -711,7 +688,7 @@ if check: os.remove(self.temp+opt['tmp_file']) # clean-up - self.entry1.set_text(data) + self.output.set_text(data) # get the clipboard clipboard = gtk.clipboard_get() @@ -747,7 +724,7 @@ ## Refresh window during running processes. def refresh(self): - self.window1.queue_draw() + self.main_window.queue_draw() time.sleep(0.1) # give also some time to the user... :) while gtk.events_pending(): gtk.main_iteration() @@ -780,8 +757,8 @@ # adjust width and height to your needs and keep ratio (im_width, im_height) = im1.size #get image size #get needed size - width = self.image1.allocation.width - height = self.image1.allocation.height + width = self.main_image.allocation.width + height = self.main_image.allocation.height ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio self.new_width = int(im_width*ratio) self.new_height = int(im_height*ratio) @@ -797,12 +774,12 @@ # set image preview self.image_file_small = self.temp+"05.jpg" im.save( self.image_file_small ) - self.image1.set_from_file( self.image_file_small ) + self.main_image.set_from_file( self.image_file_small ) ## Set progress and refresh view. def progress(self, fract, text): - self.progressbar1.set_fraction(fract) - self.progressbar1.set_text(text) + self.progressbar.set_fraction(fract) + self.progressbar.set_text(text) self.refresh() ## Character correction after recogition (on basis that there should be numbers and few special chars). @@ -859,128 +836,7 @@ if not (data == olddata): print 'subst: "%s" => "%s"' % (item[0], item[1]) return data - -# def guiprint(self, text ): -# print text -# infile = open("log.txt","r") -# string = infile.read() -# infile.close() -# self.textbuffer.set_text(string) -# enditer = self.textbuffer.get_end_iter() -# self.textbuffer.insert(enditer,"\n%s" % text ) -## Run external shell command/application. -class RunExternal: - - error_msg = [ "/bin/sh: " ] - - ## initialize - def __init__(self, cmd, error_msg): - self.cmd = cmd - self.error_msg += error_msg - - ## call - def __call__(self): - (self.error, self.stdout, self.stderr) = self._run() - return self.error - - ## Execute external shell command. - def _run(self, piped=True): - if piped: - run = subprocess.Popen( self.cmd, - 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) - else: - os.system( self.cmd ) - return (False, "", "") - -#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 __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]) - -# 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) - -# #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. """ -# # "convert %s.tif -crop 1600x250+800+960 -depth 8 %s.tif" -# # "convert %s.tif -crop 1700x250+750+960 -depth 8 %s.tif" -# # "convert %s.tif -crop 3400x500+1500+1900 -depth 8 %s.tif" -# # "convert %s.tif -depth 8 %s.tif" -# # "convert %s.tif -depth 8 -rotate %d %s.tif" -# # "convert %s.tif -depth 8 -rotate %d %s" -# #cmd_convert = "convert %s -depth 8 -rotate %d %s" -# -# def __init__(self, inp_filename, rotate, out_filename): -# self.inp_filename = inp_filename -# self.out_filename = out_filename -# self.angle = rotate -# self.depth = 8 -# -# def __call__(self): -# (self.error, self.stdout, self.stderr) = self._run() -# return self.error -# -# # thanks to: http://www.assembla.com/wiki/show/pythonmagickwand -# def _run(self): -# """ This rotates, changes depth, format and writes a new file. """ -# try: -# i = Image(self.inp_filename) -# i.rotate(self.angle) -# i.depth(self.depth) -# i.format = self.out_filename[-3:].upper() -# i.save(self.out_filename) -# except: -# return (True, "error", sys.exc_info()[1]) -# -# return (False, "ok", "") - ## sSANE/PIL interface python wrapper/bindings. class RunSANE: # "scanimage --format=tif --resolution 300 --mode Gray > %s.tif" @@ -990,78 +846,50 @@ resolution = 600 ## Init of sane interface -> device. - def __init__(self, main): - self.main = main + def __init__(self): print "init sane python interface ..." # Get the path set up properly #sys.path.append('.') - self.list_store = self.main.treeview1.get_model() - if self.list_store == None: - # create treeview things - self.list_store = gtk.ListStore(gobject.TYPE_STRING) - self.main.treeview1.set_model(self.list_store) - col = gtk.TreeViewColumn("Select Device to use:", gtk.CellRendererText(),text=0) - self.main.treeview1.append_column(col) - else: - self.list_store.clear() # get blacklist - self.read_blacklist() + self.blacklist = BlacklistMgr.read_blacklist() # init SANE self.n = 4. - self.main.progress(0.,"init sane python interface ...") + main.progress(0.,"init sane python interface ...") try: self.version = sane.init() - self.main.progress(1./self.n,"init sane python interface ... search devices") + main.progress(1./self.n,"init sane python interface ... search devices") # get sane devices - self.devices1 = sane.get_devices() - # init filtered list - self.devices = [] - - print "\n" - # add found devices to treeview - for i in range(len(self.devices1)): - # filter devices: remove blacklisted devices - if not self.devices1[i][1]+" "+self.devices1[i][2] in self.blacklist: - self.devices.append(self.devices1[i]) - print str(i)+": "+self.devices1[i][1]+" "+self.devices1[i][2] - self.list_store.append([self.devices1[i][1]+" "+self.devices1[i][2]]) -# else: -# print str(i)+": "+self.devices1[i][1]+" "+self.devices1[i][2]+" BLOCKED" - # self.devices is now filtered - + 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: - self.main.progress(0./self.n,"No device found.") + main.progress(0./self.n,"No device found.") + main.device_chooser_button.set_visible(False) self.found_scanner = False - elif len(self.list_store) > 1: - # more than one device, choose one. - self.main.progress(2./self.n,"More than one device found.") - if sys.argv[1:]: - # choose one by command line - devnr = raw_input("Choose device: ") - self.main.progress(2./self.n,"More than one device found. Choose device number %i" % devnr) - # continue to init scanner - self.init_scanner(devnr) - else: - # simply continue and select device in GUI ( see init_sane ) - self.main.progress(2./self.n,"More than one device found.") - self.main.notebook.set_current_page(2) - self.main.button3.set_visible(True) - 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 - self.main.progress(2./self.n,"Device: %s" % self.devices[0][1]+" "+self.devices[0][2]) + # 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): @@ -1070,7 +898,7 @@ # finish init device self.dev = self.devices[devnr][0] # choose device print "%s" % self.dev - self.main.progress(3./self.n,"Device initialized. Open scanner...") + main.progress(3./self.n,"Device initialized. Open scanner...") # open scanner device self.scanner = sane.open(self.dev) @@ -1078,17 +906,18 @@ self.opts = self.scanner.get_options() self.found_scanner = True - self.main.progress(4./self.n,"Ready: %s" % self.devices[devnr][1]+" "+self.devices[devnr][2]) + main.progress(4./self.n,"Ready: %s" % self.devices[devnr][1]+" "+s... [truncated message content] |