source: orange/orange/OrangeWidgets/Prototypes/OWUnpickle.py @ 9530:1f5c93b3fc4f

Revision 9530:1f5c93b3fc4f, 3.5 KB checked in by ales_erjavec <ales.erjavec@…>, 2 years ago (diff)

Added Save/Load Object widgets (generic pickle interface, references #984).

Line 
1"""
2<name>Load Object</name>
3<description>Load (unpickle) any python object</description>
4<contact>ales.erjavec(@ at @)fri.uni-lj.si</contact>
5<tags>load,unpickle,pickle</tags>
6
7"""
8
9from OWWidget import *
10import OWGUI
11
12
13class OWUnpickle(OWWidget):
14    settingsList = ["filename_history", "selected_file_index", "last_file"]
15   
16    def __init__(self, parent=None, signalManager=None, name="Load Object"):
17        OWWidget.__init__(self, parent, signalManager, name, wantMainArea=False)
18       
19        self.outputs = [("Object", object, Dynamic)]
20       
21        self.filename_history = []
22        self.selected_file_index = 0
23        self.last_file = os.path.expanduser("~/orange_object.pck")
24       
25        self.loadSettings()
26       
27        self.filename_history= filter(os.path.exists, self.filename_history)
28       
29        #####
30        # GUI
31        #####
32       
33        box = OWGUI.widgetBox(self.controlArea, "File", orientation="horizontal", addSpace=True)
34        self.files_combo = OWGUI.comboBox(box, self, "selected_file_index", 
35                                         items = [os.path.basename(p) for p in self.filename_history],
36                                         tooltip="Select a recent file", 
37                                         callback=self.on_recent_selection)
38       
39        self.browseButton = OWGUI.button(box, self, "...", callback=self.browse,
40                                         tooltip = "Browse file system")
41
42        self.browseButton.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon))
43        self.browseButton.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
44       
45        OWGUI.rubber(self.controlArea)
46       
47        self.resize(200, 50)
48       
49        if self.filename_history:
50            self.load_and_send()
51       
52       
53    def on_recent_selection(self):
54        filename = self.filename_history[self.selected_file_index]
55        self.filename_history.pop(self.selected_file_index)
56        self.filename_history.insert(0, filename)
57        self.files_combo.removeItem(self.selected_file_index)
58        self.files_combo.insertItem(0, os.path.basename(filename))
59        self.selected_file_index = 0
60       
61        self.load_and_send()
62       
63    def browse(self):
64        filename = QFileDialog.getOpenFileName(self, "Load Object From File",
65                        self.last_file, "Pickle files (*.pickle *.pck)\nAll files (*.*)")
66        filename = str(filename)
67        if filename:
68            if filename in self.filename_history:
69                self.selected_file_index = self.filename_history.index(filename)
70                self.on_recent_selection()
71                return
72            self.last_file = filename
73            self.filename_history.insert(0, filename)
74            self.files_combo.insertItem(0, os.path.basename(filename))
75            self.files_combo.setCurrentIndex(0)
76            self.selected_file_index = 0
77            self.load_and_send()
78           
79    def load_and_send(self):
80        filename = self.filename_history[self.selected_file_index]
81        import cPickle as pickle
82        self.error([0, 1])
83        try:
84            obj = pickle.load(open(filename, "rb"))
85        except Exception, ex:
86            self.error(0, "Could not load object! %s" % str(ex))
87            return
88       
89        if not isinstance(obj, object):
90            # Old style instance objects
91            self.error(1, "'%s' is not an instance of %r" % (os.path.basename(filename),
92                                                             object))
93            return 
94       
95        self.send("Object", obj)
Note: See TracBrowser for help on using the repository browser.