#!/usr/bin/env python # -*- coding: iso-8859-15 -*- # generated by wxGlade 0.6.3 on Thu Jun 19 11:34:25 2008 #Needs PIL __author__ = "Giuseppe Amato" __version__ = "1.0.0" __revised__ = "18-Feb-2009" import wx import string,os,os.path import thread,time import ProgressFrame # Example: enabling only web-related file format handlers import Image # import web-related file formats import GifImagePlugin import JpegImagePlugin import PngImagePlugin # don't look for more plugins Image._initialized = 1 # begin wxGlade: extracode # end wxGlade def getTree(path,files): for f in os.listdir(path): dest=path+"\\"+f if os.path.isfile(dest): files.append(dest) elif os.path.isdir(dest): getTree(dest,files) return files def Resize(file,width,height,quality=80): path,ext=os.path.splitext(file) name=os.path.basename(path) try: image=Image.open(file) except: print "Errore! -> file:",name+ext return w,h=image.size if width==-1 and height!=-1: w=height*w/h h=height if height==-1 and width!=-1: h=width*h/w w=width if width!=-1 and height!=-1: w=width h=height fmt=image.format try: image=image.resize((w,h),Image.ANTIALIAS).save(file,fmt,quality=quality) except: print "Errore! -> file:",name+ext return print name+ext,"...Ok!" class ResizeFrame(wx.Frame): def __init__(self, *args, **kwds): # begin wxGlade: ResizeFrame.__init__ kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.panel = wx.Panel(self, -1) self.label_1 = wx.StaticText(self.panel, -1, "Cartella di Destinazione:") self.rootTxt = wx.TextCtrl(self.panel, -1, "") self.folderBt = wx.Button(self.panel, -1, "Sfoglia...") self.rb1 = wx.RadioBox(self.panel, -1, "Scelta dei file da ridimensionare", choices=["Tutti", "File in sotto - cartella"], majorDimension=0, style=wx.RA_SPECIFY_COLS) self.label_2 = wx.StaticText(self.panel, -1, "Nome della sotto - cartella:") self.subTxt = wx.TextCtrl(self.panel, -1, "") self.widthCb = wx.CheckBox(self.panel, -1, "Larghezza:") self.wTxt = wx.TextCtrl(self.panel, -1, "640") self.HeightCb = wx.CheckBox(self.panel, -1, "Altezza:") self.hTxt = wx.TextCtrl(self.panel, -1, "480") self.QualCb = wx.CheckBox(self.panel, -1, u"Qualità:") self.qTxt = wx.TextCtrl(self.panel, -1, "80") self.resizeBt = wx.Button(self.panel, -1, "Ridimensiona") self.ExitBt = wx.Button(self.panel, -1, "Esci") self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.onFolderBt, self.folderBt) self.Bind(wx.EVT_RADIOBOX, self.onRbChange, self.rb1) self.Bind(wx.EVT_CHECKBOX, self.onWCb, self.widthCb) self.Bind(wx.EVT_CHECKBOX, self.onHCb, self.HeightCb) self.Bind(wx.EVT_CHECKBOX, self.onQCb, self.QualCb) self.Bind(wx.EVT_BUTTON, self.onResize, self.resizeBt) self.Bind(wx.EVT_BUTTON, self.onExit, self.ExitBt) # end wxGlade self.rootTxt.SetValue(os.getcwd()) def __set_properties(self): # begin wxGlade: ResizeFrame.__set_properties self.SetTitle("frame_1") self.rootTxt.SetMinSize((150, 18)) self.rb1.SetSelection(0) self.subTxt.Enable(False) self.widthCb.SetValue(1) self.hTxt.Enable(False) self.qTxt.Enable(False) # end wxGlade def __do_layout(self): # begin wxGlade: ResizeFrame.__do_layout pSizer = wx.BoxSizer(wx.VERTICAL) mSizer = wx.BoxSizer(wx.VERTICAL) sizer_1 = wx.BoxSizer(wx.HORIZONTAL) dimSizer = wx.FlexGridSizer(2, 2, 0, 0) subSizer = wx.FlexGridSizer(1, 2, 0, 0) sizer_3 = wx.BoxSizer(wx.HORIZONTAL) grid_sizer_1 = wx.FlexGridSizer(1, 2, 0, 0) mSizer.Add(self.label_1, 0, wx.ALL|wx.FIXED_MINSIZE, 5) grid_sizer_1.Add(self.rootTxt, 0, wx.ALL|wx.EXPAND, 5) grid_sizer_1.Add(self.folderBt, 0, wx.ALL, 5) grid_sizer_1.AddGrowableCol(0) sizer_3.Add(grid_sizer_1, 1, wx.EXPAND, 0) mSizer.Add(sizer_3, 0, wx.EXPAND, 0) mSizer.Add(self.rb1, 0, wx.ALL|wx.EXPAND, 5) subSizer.Add(self.label_2, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5) subSizer.Add(self.subTxt, 0, wx.ALL|wx.EXPAND, 5) subSizer.AddGrowableCol(1) mSizer.Add(subSizer, 0, wx.EXPAND, 0) dimSizer.Add(self.widthCb, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5) dimSizer.Add(self.wTxt, 0, wx.ALL|wx.EXPAND, 5) dimSizer.Add(self.HeightCb, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5) dimSizer.Add(self.hTxt, 0, wx.ALL|wx.EXPAND, 5) dimSizer.Add(self.QualCb, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5) dimSizer.Add(self.qTxt, 0, wx.ALL|wx.EXPAND, 5) dimSizer.AddGrowableCol(1) mSizer.Add(dimSizer, 0, wx.EXPAND, 0) sizer_1.Add(self.resizeBt, 0, wx.ALL, 5) sizer_1.Add(self.ExitBt, 0, wx.ALL, 5) mSizer.Add(sizer_1, 0, wx.TOP|wx.ALIGN_RIGHT, 10) self.panel.SetSizer(mSizer) pSizer.Add(self.panel, 1, wx.EXPAND, 0) self.SetSizer(pSizer) pSizer.Fit(self) self.Layout() # end wxGlade def onFolderBt(self, event): # wxGlade: ResizeFrame. dlg = wx.DirDialog(self, "Scegliere una Cartella:", style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON) if dlg.ShowModal() == wx.ID_OK: self.rootTxt.SetValue(dlg.GetPath()) dlg.Destroy() event.Skip() def onRbChange(self, event): # wxGlade: ResizeFrame. if event.GetInt()==1: self.subTxt.Enable() else: self.subTxt.Disable() event.Skip() def onWCb(self, event): # wxGlade: ResizeFrame. if self.widthCb.IsChecked(): self.wTxt.Enable() else: self.wTxt.Disable() event.Skip() def onHCb(self, event): # wxGlade: ResizeFrame. if self.HeightCb.IsChecked(): self.hTxt.Enable() else: self.hTxt.Disable() event.Skip() def onResize(self, event): # wxGlade: ResizeFrame. if self.widthCb.IsChecked(): w=int(self.wTxt.GetValue()) else: w=-1 if self.HeightCb.IsChecked(): h=int(self.hTxt.GetValue()) else: h=-1 if self.QualCb.IsChecked(): q=int(self.qTxt.GetValue()) else: q=80 files=[] getTree(self.rootTxt.GetValue(),files) self.pf=ProgressFrame.ProgressFrame(self,-1,"") self.pf.Show() thread.start_new_thread(self.resize,(files,w,h,q)) event.Skip() def resize(self, files,w,h,quality=80): self.pf.GlobalProgress.SetRange(100) n=len(files) for i in range(n): self.pf.CurImg.SetLabel(os.path.split(files[i])[1]) step=100*i/n self.pf.GlobalProgress.SetValue(step) self.pf.GlobalPerc.SetLabel("%d "%step+'%') Resize(files[i],w,h,quality) if step!=0: rim=((time.clock()-self.pf.getStartTime())*(100-step)/step) if (rim/60)>1: rimt="%d min"%(rim/60) else: rimt="%.0f s"%rim self.pf.getProgressLabel().SetLabel("Avanzamento Totale (Rimanente: %s)"%rimt) self.pf.GlobalProgress.SetValue(100) self.pf.GlobalPerc.SetLabel("%d "%100+'%') self.pf.onExit(None) def onExit(self, event): # wxGlade: ResizeFrame. self.Close(True) event.Skip() def onQCb(self, event): # wxGlade: ResizeFrame. if self.QualCb.IsChecked(): self.qTxt.Enable() else: self.qTxt.Disable() event.Skip() # end of class ResizeFrame #---------------------------------------------------------------------- ALPHA_ONLY = 1 DIGIT_ONLY = 2 class MyValidator(wx.PyValidator): def __init__(self, flag=None, pyVar=None): wx.PyValidator.__init__(self) self.flag = flag self.Bind(wx.EVT_CHAR, self.OnChar) def Clone(self): return MyValidator(self.flag) def Validate(self, win): tc = self.GetWindow() val = tc.GetValue() if self.flag == ALPHA_ONLY: for x in val: if x not in string.letters: return False elif self.flag == DIGIT_ONLY: for x in val: if x not in string.digits: return False return True def OnChar(self, event): key = event.KeyCode() if key < wx.WXK_SPACE or key == wx.WXK_DELETE or key > 255: event.Skip() return if self.flag == ALPHA_ONLY and chr(key) in string.letters: event.Skip() return if self.flag == DIGIT_ONLY and chr(key) in string.digits: event.Skip() return # Returning without calling even.Skip eats the event before it # gets to the text control return #---------------------------------------------------------------------- if __name__ == "__main__": app = wx.PySimpleApp(0) wx.InitAllImageHandlers() frame_1 = ResizeFrame(None, -1, "") app.SetTopWindow(frame_1) frame_1.Show() app.MainLoop()