source: orange/Orange/OrangeWidgets/Prototypes/OWPickle.py @ 10462:f615f9bb8348

Revision 10462:f615f9bb8348, 3.7 KB checked in by Ales Erjavec <ales.erjavec@…>, 2 years ago (diff)

Added unicode filename support for save/load widgets.

Line 
1"""
2<name>Save Object</name>
3<description>Save (pickle) any object</description>
4<contact>ales.erjavec(@ at @)fri.uni-lj.si</contact>
5<tags>save,pickle</tags>
6
7"""
8
9from OWWidget import *
10import OWGUI
11
12class OWPickle(OWWidget):
13    settingsList = ["last_save_file", "filename_history"]
14    def __init__(self, parent=None, signalManager=None, name="Save Object"):
15        OWWidget.__init__(self, parent, signalManager, name, wantMainArea=False)
16       
17        self.inputs = [("Object", object, self.set_object)]
18       
19        self.last_save_file = os.path.expanduser("~/orange_object.pck")
20        self.filename_history = []
21        self.selected_file_index = 0
22       
23        self.loadSettings()
24       
25        #####
26        # GUI
27        #####
28        box = OWGUI.widgetBox(self.controlArea, "File",
29                              orientation="horizontal",
30                              addSpace=True)
31       
32        self.files_combo = OWGUI.comboBox(box, self, "selected_file_index",
33                                         items=[os.path.basename(f) for f in self.filename_history],
34                                         tooltip="Select a recently saved file",
35                                         callback=self.on_recent_selection)
36       
37        self.browse_button = OWGUI.button(box, self, "...",
38                                          tooltip="Browse local file system",
39                                          callback=self.browse)
40       
41        self.browse_button.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon))
42        self.browse_button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
43         
44        box = OWGUI.widgetBox(self.controlArea, "Save")
45        self.save_button = OWGUI.button(box, self, "Save current object",
46                                       callback=self.save_object,
47                                       autoDefault=True)
48       
49        self.save_button.setEnabled(False)
50       
51        OWGUI.rubber(self.controlArea)
52       
53        self.resize(200, 100)
54       
55        self.object_ = None
56       
57    def on_recent_selection(self):
58        filename = self.filename_history[self.selected_file_index]
59        self.filename_history.pop(self.selected_file_index)
60        self.filename_history.insert(0, filename)
61        self.files_combo.removeItem(self.selected_file_index)
62        self.files_combo.insertItem(0, os.path.basename(filename))
63        self.selected_file_index = 0
64   
65    def browse(self):
66        filename = QFileDialog.getSaveFileName(self, "Save Object As ...",
67                    self.last_save_file, "Pickle files (*.pickle *.pck);; All files (*.*)")
68        filename = unicode(filename)
69        if filename:
70            if filename in self.filename_history:
71                self.selected_file_index = self.filename_history.index(filename)
72                self.on_recent_selection()
73                return
74           
75            self.last_save_file = filename
76            self.filename_history.insert(0, filename)
77            self.files_combo.insertItem(0, os.path.basename(filename))
78            self.files_combo.setCurrentIndex(0)
79            self.save_button.setEnabled(self.object_ is not None and bool(self.filename_history))
80   
81    def save_object(self):
82        if self.object_ is not None:
83            filename = self.filename_history[self.selected_file_index]
84            import cPickle as pickle
85            self.error(0)
86            try:
87                pickle.dump(self.object_, open(filename, "wb"))
88            except Exception, ex:
89                self.error(0, "Could not save object! %s" % str(ex))
90                raise
91           
92           
93    def set_object(self, object_=None):
94        self.object_ = object_
95        self.save_button.setEnabled(object_ is not None and bool(self.filename_history))
Note: See TracBrowser for help on using the repository browser.