Exemplo n.º 1
0
class KinectTestWindow(gtk.Window):

    REFRESH_DELAY = 500  # ms

    def __init__(self):
        self._paused = True
        self._kinect = Kinect()

        gtk.Window.__init__(self)
        self.set_default_size(1280, 960)

        vbox = gtk.VBox()
        self.add(vbox)

        # Kinect info visualisation.
        self._display = KinectDisplay(self._kinect)
        vbox.pack_start(self._display, True, True, 0)

        hbox = gtk.HBox()
        vbox.pack_start(hbox)

        # Game scheme representation.
        game_scene = GameSceneArea(self._kinect)
        self._display.add_observer(game_scene)
        hbox.pack_start(game_scene)

        button_vbox = gtk.VBox()
        hbox.pack_start(button_vbox)

        # Choose static data.
        self.choose = gtk.Button('Open', gtk.STOCK_OPEN)
        button_vbox.pack_start(self.choose)
        self.choose.connect("clicked", self._choose_cb)

        # Save button.
        self.save = gtk.Button('Save', gtk.STOCK_SAVE)
        self.save.set_sensitive(False)
        button_vbox.pack_start(self.save)
        self.save.connect("clicked", self._save_cb)

        # Pause/Autorefresh button.
        self.pause = gtk.Button('Pause', gtk.STOCK_MEDIA_PAUSE)
        button_vbox.pack_start(self.pause)
        self.pause.connect("clicked", self._pause_cb)

        self.connect("destroy", gtk.main_quit)
        self.show_all()

        # Auto-refresh at 10 frames per seconds.
        self.timer_id = gobject.timeout_add(self.REFRESH_DELAY,
                self._timedout)

    def _choose_cb(self, widget, data=None):
        # Create file chooser.
        dialog = gtk.FileChooserDialog("Open..",
                None,
                gtk.FILE_CHOOSER_ACTION_OPEN,
                (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                    gtk.STOCK_OPEN, gtk.RESPONSE_OK))
        dialog.set_default_response(gtk.RESPONSE_OK)

        # Get only numpy arrays.
        filter = gtk.FileFilter()
        filter.set_name("Numpy arrays")
        filter.add_pattern("*_depth.npy")
        dialog.add_filter(filter)

        response = dialog.run()
        chosen = response == gtk.RESPONSE_OK
        if chosen:
            # Extract file basename.
            filename = dialog.get_filename()[:-10]
            basename = os.path.basename(filename)
            self._kinect.set_filename(basename)
            print basename, 'selected'

        dialog.destroy()

        # Refresh GUI if needed.
        if chosen:
            self._display.refresh_data()
            self.queue_draw()

    def _save_cb(self, widget, data=None):
        rgb = self._kinect.latest_rgb
        depth = self._kinect.latest_depth
        fname_base = time.strftime('%Y-%m-%d_%H-%M-%S', time.localtime())
        numpy.save(fname_base + '_rgb', rgb)
        numpy.save(fname_base + '_depth', depth)
        print 'Saved with "%s" base filename' % fname_base

    def _pause_cb(self, widget, data=None):
        self._paused = not self._paused
        self.save.set_sensitive(self._paused)
        self.choose.set_sensitive(self._paused)

        if not self._paused:
            self.pause.set_label(gtk.STOCK_MEDIA_PAUSE)
            # Try to prevent unwanted redraw.
            if not data:
                self._display.refresh_data()
                self.queue_draw()
            self.timer_id = gobject.timeout_add(self.REFRESH_DELAY,
                    self._timedout)
        else:
            self.pause.set_label(gtk.STOCK_REFRESH)

    def _timedout(self):
        # Stop auto refresh if no Kinect is detected.
        if self._kinect.latest_present:
            self._display.refresh_data()
            self.queue_draw()
        else:
            if not self._paused:
                print 'No Kinect found, stopping auto-refresh'
                self._pause_cb(None, True)

        # Timer is repeated until False is returned.
        return not self._paused

    def run(self):
        gtk.main()