#/usr/bin/env python # small hack to sort images. import sys, gtk, pprint, random from gtk import gdk class App (object): def __init__ (self, imagelist, statefilename="state.py"): self.win = gtk.Window () self.win.set_title ("Compare images (cursor left / right / down)") self.win.set_size_request (700, 500) self.win.connect ('destroy', self.quit) self.win.connect ('delete_event', self.quit) self.win.connect ('key_press_event', self.key_press_event) self.win.set_reallocate_redraws (True) # self.win.fullscreen () self.da = gtk.DrawingArea () self.da.connect ('expose_event', self.expose_event) self.da.connect ('configure_event', self.configure_event) self.win.add (self.da) self.win.show_all () self.left = None self.left_pixbuf = None self.right = None self.right_pixbuf = None self.fullscreen = False self.imagelist = imagelist[:] random.shuffle (self.imagelist) self.statefilename = statefilename self.craplist = {} self.sort_state = 0 self.sort_result = 0 self.sortmem = {} def quit (self, *args): sys.exit (1) def savestate (self): f = open (self.statefilename, "a") f.write ("self.sortmem = %s\n" % pprint.pformat (self.sortmem)) f.write ("self.craplist = %s\n" % pprint.pformat (self.craplist)) f.close () def loadstate (self): try: execfile (self.statefilename) except IOError: pass def start_sort (self): self.imagelist.sort (self.image_compare) print "CRAP:" for i in self.craplist.keys (): print i print "-- sorted images (worst --> best)" for i in self.imagelist: if self.craplist.has_key (i) == False: print i self.savestate () def image_compare (self, left, right): self.left = left self.right = right if self.craplist.has_key (left): if self.craplist.has_key (right): return 0 else: return -1 if self.craplist.has_key (right): return 1 if self.sortmem.has_key ((left, right)): return self.sortmem[(left, right)] self.left_pixbuf = None self.right_pixbuf = None self.da.queue_draw () self.sort_state += 1 self.sort_result = 0 gtk.main () self.sort_state -= 1 self.sortmem[(left, right)] = self.sort_result return self.sort_result def key_press_event (self, widget, kp_event): key = gdk.keyval_name (kp_event.keyval) if key in ['F', 'f', 'F11']: if self.fullscreen: self.win.unfullscreen () else: self.win.fullscreen () self.fullscreen = not self.fullscreen elif key in ['1']: if self.sort_state > 0: self.sort_result = 1 self.craplist[self.right] = 1 gtk.mainquit () elif key in ['2', '3', 'Left']: if self.sort_state > 0: self.sort_result = 1 gtk.mainquit () elif key in ['4', '5', '6' 'Down']: if self.sort_state > 0: self.sort_result = 0 gtk.mainquit () elif key in ['percent']: if self.sort_state > 0: self.sort_result = 0 self.craplist[self.left] = 1 self.craplist[self.right] = 1 gtk.mainquit () elif key in ['7', '8', 'Right']: if self.sort_state > 0: self.sort_result = -1 gtk.mainquit () elif key in ['9']: if self.sort_state > 0: self.sort_result = -1 self.craplist[self.left] = 1 gtk.mainquit () elif key in ['s', 'S']: self.savestate () elif key in ['l', 'L']: self.loadstate () elif key in ['q', 'Q', 'Escape']: self.quit () def configure_event (self, widget, co_event): self.width = co_event.width self.height = co_event.height def expose_event (self, widget, exp_area): offset = 0 self.da.window.draw_rectangle (self.da.style.black_gc, True, 0, 0, self.width, self.height) if self.left and not self.right: offset = self.width / 4 if self.left and not self.left_pixbuf: self.left_pixbuf = gdk.pixbuf_new_from_file (self.left) if self.left_pixbuf: pb_w = self.left_pixbuf.get_width () pb_h = self.left_pixbuf.get_height () self.da.window.draw_pixbuf (self.da.style.black_gc, self.left_pixbuf, 0, 0, offset + self.width / 4 - pb_w / 2, (self.height - pb_h) / 2, -1, -1, gdk.RGB_DITHER_MAX, 0, 0) if self.right and not self.right_pixbuf: self.right_pixbuf = gdk.pixbuf_new_from_file (self.right) if self.right_pixbuf: pb_w = self.right_pixbuf.get_width () pb_h = self.right_pixbuf.get_height () self.da.window.draw_pixbuf (self.da.style.black_gc, self.right_pixbuf, 0, 0, 3 * self.width / 4 - pb_w / 2, (self.height - pb_h) / 2, -1, -1, gdk.RGB_DITHER_MAX, 0, 0) def main (imagelist, filename): a = App (imagelist, filename) a.loadstate () a.start_sort () a.savestate () if __name__=='__main__': main (sys.argv[1:], "state.py")