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

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

Added unicode filename support for save/load widgets.

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