# -*- coding:latin1 -*- # # Copyright (C) 2015-2019 Nico Latzer nl@mnet-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # $Id$ import os.path import os import Pmw import Tkinter #import ttk from PIL import Image, ImageTk import pyexiv2 #imgsilo={} #def prepareIcons(path): # imgsilo['pdf']=Tkinter.PhotoImage(file='%s/pdf.gif' % path ) #from time import localtime, asctime from mx.DateTime import DateTimeFrom #DISP_FONT=('Helvetica',9) class ScrolledImageFrame(Pmw.ScrolledFrame): def __init__(self, parent=None, **kw): # Define the megawidget options. optiondefs = ( #('background', None, None ), #('iconpath', None, Pmw.INITOPT), #('fmtdate', '%Y-%m-%d %H:%M', Pmw.INITOPT ), ('thumbsize',(128,128),Pmw.INITOPT), ('cmdForDisplay','open "%s" ', None), ) self.defineoptions(kw, optiondefs) # Initialise base class (after defining options). Pmw.ScrolledFrame.__init__(self, parent) # Create the components. // already created # Check keywords and initialise options. self.initialiseoptions() self._elems=[] def _scanForImageFiles(self, path, *args): tmp=list() for el in os.listdir(path ): if os.path.splitext(el)[-1].lower() not in args: continue fn = os.path.join(path,el) if os.path.isfile(fn): ctime,size = os.path.getctime(fn),os.path.getsize(fn) tmp.append( (fn,ctime,size) ) tmp.sort( lambda a,b: cmp(a[1],b[1]) ) return tmp def setlist(self, path ): self._elems = self._scanForImageFiles( path, '.jpeg','.jpg') p = self.interior() for i,el in enumerate(self._elems): fn,ctime,size=el #print fn metadata = pyexiv2.ImageMetadata(fn ) metadata.read() print "exif keys", metadata.exif_keys try: disp_time = metadata['Exif.Image.DateTime'].value except KeyError: disp_time = DateTimeFrom(ctime).strftime('%c') #me,ext = os.path.splitext(fn) btn = Tkinter.Button(p, text= "%s\n%s" % ( os.path.basename(fn),disp_time ) , command=lambda idx=i: self.showImage(idx), relief='flat', #font=DISP_FONT ) btn.grid(row=1, column=i, sticky='s', padx=2 ) try: img = Image.open(fn) #exif = img._getexif() img.thumbnail(self['thumbsize']) #w,h=img.size #while w>self['thumbsize']: # w,h=w//2,h//2 # img=img.resize( (w,h),Image.ANTIALIAS) photo = ImageTk.PhotoImage(img) btn.configure(compound='top', image=photo ) btn._tmp=photo #keep reference except: import sys print sys.exc_info() pass def showImage(self, idx,*args): fn= self._elems[idx][0] #me,ext = os.path.splitext(fn) #if ext[1:]=='pdf': # #os.system('evince -w %s' % fn) # #os.system('open %s' % fn) os.system(self["cmdForDisplay"] % fn ) #user-prefs variant if __name__=='__main__': root = Tkinter.Tk() #prepareIcons() ax = ScrolledImageFrame(root) ax.pack() path='silo/Paro' ax.setlist(path) root.mainloop()