# -*- coding: utf-8 -*- import time,sys,os,os.path,itertools import win32com.client,win32clipboard import _winreg import urllib,base64,binascii,time import htmlentitydefs GlobalPVersion='3.15b' """ 3.13 ouverture popmenu par code 3.12 + arbre + popmenu + fenêtres filles 3.06 possibilité d'injection de Ponx 3.05 optimisation tableau 3.02 '==None' ==> 'is None' 3.01 correction d'un bug """ try: name, ponxdir, typ = _winreg.EnumValue(_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\CLSID\{EC501258-201C-449C-BE20-837A316EA382}\PythonCOMPath'), 0) ponxdir+='\\' pluie_toolsdir=ponxdir+'putils\\' if not sys.path.__contains__(ponxdir[:-1]): sys.path.append(ponxdir[:-1]) include_dir=ponxdir+'pluie\\include\\' pluimg_dir=ponxdir+'pluie\\pluimg\\' except: ponxdir=os.getcwd()+'\\' pluie_toolsdir=ponxdir+'putils\\' include_dir=ponxdir+'include\\' pluimg_dir=ponxdir+'pluimg\\' try: import pluie_ini try: ponxdir=pluie_ini.ponxdir except: pass try: pluie_toolsdir=pluie_ini.pluie_toolsdir except: pass try: include_dir=pluie_ini.include_dir except: pass try: pluimg_dir=pluie_ini.pluimg_dir except: pass except: pass # #*** piqué à Ponx *** def clipboardtxt(chaine=None): import win32clipboard,win32con try: win32clipboard.OpenClipboard() if chaine is None: try: chaine=win32clipboard.GetClipboardData(win32con.CF_TEXT) #win32clipboard.EmptyClipboard() #win32clipboard.SetClipboardText(chaine) return(chaine) except: chaineretour='' return('') else: try: win32clipboard.EmptyClipboard() win32clipboard.SetClipboardText(chaine) except: pass except: pass try: win32clipboard.CloseClipboard() except: pass def u1252(chu): try: if type(chu) is unicode: return chu.encode('cp1252','replace') else: return chu except: return repr(chu) def u850(chu): try: if type(chu) is unicode: return chu.encode('cp850','replace') else: return chu.decode('cp1252').encode('cp850','replace') except: return repr(chu) def u437(chu): try: if type(chu) is unicode: return chu.encode('cp437','replace') else: return chu.decode('cp1252').encode('cp437','replace') except: return repr(chu) def upe(chu): return str(chu) class ieevents: def OnVisible(self, visible): print "Visible changed:", visible class form(object): ie_id=100000 fichecourante=None conteneurcourant=None def __init__(self, **pars): form.ie_id=100000 form.fichecourante=None form.conteneurcourant=None self.elemid={} self.elemid[u'']=None self.elemid['pluie_menu_box']=None if 'formcaller' in pars: self.formcaller=pars['formcaller'] ptaille='' if 'x' in pars: ptaille+=',left='+str(pars['x']) if 'left' in pars: ptaille+=',left='+str(pars['left']) if 'y' in pars: ptaille+=',top='+str(pars['y']) if 'top' in pars: ptaille+=',top='+str(pars['top']) if 'width' in pars: ptaille+=',width='+str(pars['width']) if 'height' in pars: ptaille+=',height='+str(pars['height']) self.window=self.formcaller.window.open(r'file:///'+os.getcwd().replace('\\','/')+'/pluie___.htm','',ptaille[1:]) time.sleep(0.1) self.ie=self.window form.fichecourante=self self.doc=self.window.Document self.body=self.window.Document.Body else: self.ie=win32com.client.Dispatch('InternetExplorer.Application') #self.ie=win32com.client.DispatchWithEvents('InternetExplorer.Application', ieevents) #self.ie.Navigate(r'about:NoAdd-ons') form.fichecourante=self self.ie.ToolBar=False self.ie.AddressBar=False self.ie.MenuBar=False self.ie.StatusBar=True if 'x' in pars: self.ie.Left=pars['x'] if 'left' in pars: self.ie.Left=pars['left'] if 'y' in pars: self.ie.Top=pars['y'] if 'top' in pars: self.ie.Top=pars['top'] if 'width' in pars: self.ie.Width=pars['width'] if 'height' in pars: self.ie.Height=pars['height'] if 'url' in pars: self.ie.Navigate(pars['url']) elif 'template' in pars: self.ie.Navigate(pars['template']) else: self.ie.Navigate(r'file:///'+os.getcwd().replace('\\','/')+'/pluie___.htm') """ stmp = r'file:///'+os.getcwd().replace('\\','/')+'/pluie___.htm' self.window=self.ie.Document.parentWindow print 210,stmp self.window.alert('AAAAAAA') self.window.location.href = stmp print 213 """ while self.ie.Busy==True: time.sleep(0.1) self.ie.Visible=True self.window=self.ie.Document.parentWindow self.doc=self.ie.Document self.body=self.ie.Document.Body self.alert=self.window.alert self.metevent=self.window.metevent self.pluietest=self.window.pluietest self.conteneurglobal=self.connectid('_GLOBAL_CONTENEUR_') def getx(self, par): return self.ie.Top def setx(self, valeur): self.ie.Top=valeur x = property(getx,setx) top=property(getx,setx) def gety(self, par): return self.ie.Left def sety(self, valeur): self.ie.Left=valeur y = property(gety,sety) left=property(gety,sety) def gety(self, par): return self.ie.Left def sety(self, valeur): self.ie.Left=valeur y = property(gety,sety) left=property(gety,sety) def getstatuaction(self, par): return self.window.statuaction def setstatuaction(self, valeur): self.window.statuaction=valeur statuaction = property(getstatuaction,setstatuaction) def visible(self, flag=True): """rend la fiche visible/invisible """ if flag==True: self.ie.Visible=1 else: self.ie.Visible=0 def close(self): try: tmp=self.formcaller self.window.close() self.ie=None del(self.ie) self.window=None del(self.window) pass except: self.ie.Quit() self.ie=None del(self.ie) pass def calljscript(self,code): """execute un code jscript dans le fiche """ self.ie.Navigate(' javascript:'+code) self.waitBusy() def getdocument(self): """HTML de le fiche """ return self.doc.documentElement.outerHTML def connectid(self,id): return self.doc.getElementById(id) def imprim(self): """imprime la page courante sans confirmation """ self.ie.Document.recalc() time.sleep(0.5) self.ie.Document.execCommand('Print',True) def imprime(self): """imprime la page courante sans confirmation """ self.ie.Document.recalc() time.sleep(0.5) self.ie.ExecWB(6,2,0,0) #pour choisir imprimante: self.ie.ExecWB(6,0,0,0) def saveas(self, nomfichier): """ sauve la page courante ; problème, ça sauve la page d'origine, non actualisée. voir plutôt sauvefiche() """ self.ie.Document.recalc() time.sleep(0.5) self.ie.Document.execCommand('SaveAs',True,nomfichier) def test(self): self.ie.ExecWB(7,0) #preview def sauvefiche(self,fichier='temp.htm'): st=self.doc.documentElement.outerHTML open(fichier,'wb').write(st.encode('cp1252','replace')) def poptext(self, texte="Pop-Texte", duree=3000, y=-1, couleur='OMBRE'): import os #prog=os.getcwd()+'\\PopText.exe' prog=pluie_toolsdir+'PopText.exe' lparam=[' "'+texte+'"',' '+str(duree),' '+str(y),' '+couleur] os.spawnv(os.P_NOWAIT, prog,lparam) class element(object): def __init__(self, typ=None, containeur=None, repere=None, valeur=None): self.form=form.fichecourante if containeur is self.form: containeur=self.form.conteneurglobal if containeur is None: if form.conteneurcourant is None: form.conteneurcourant=self.form.conteneurglobal containeur=form.conteneurcourant if not(form.conteneurcourant is containeur): form.conteneurcourant=containeur form.ie_id+=1 self.typ=typ self.conteneur=containeur if self.typ=='text': self.handle=self.form.doc.createTextNode(valeur) self.attrib=self.handle else: self.handle=self.form.doc.createElement(self.typ) self.style=self.handle.style self.attrib=self.handle self.attrib.id=str(form.ie_id) self.id=str(form.ie_id) self.met(repere) self.form.elemid[unicode(form.ie_id)]=self def met(self, repere=None): """ if repere, insertion avant (before) si repere is None, ajout en fin """ if repere is None: if self.conteneur is self.form.conteneurglobal: self.conteneur.appendChild(self.handle) else: self.conteneur.handle.appendChild(self.handle) else: if self.conteneur is self.form.conteneurglobal: self.conteneur.insertBefore(self.handle, repere.handle) else: self.conteneur.handle.insertBefore(self.handle, repere.handle) def setattribut(self,nom,valeur): setattr(self.handle,nom,valeur) def getattribut(self,nom): return getattr(self.handle,nom) def setstyle(self,nom,valeur): setattr(self.handle.style,nom,valeur) def getstyle(self,nom): return getattr(self.handle.style,nom) def listattrib(self, mode='specified'): """ 'all' tous les attributs 'specified' uniquement ceux spécifiés (non standards) """ st='' for a in self.handle.attributes: if mode=='all': st+='\r\n'+u1252(a.name).ljust(22)+str(a.specified).ljust(8)+u1252(a.value) else: if a.specified: st+='\r\n'+u1252(a.name).ljust(22)+u1252(a.value) return st def labeltxt(self, texte=""): ttext=self.form.doc.createTextNode(texte) self.handle.appendChild(ttext) def replacelabel(self, texte=""): ttext=self.form.doc.createTextNode(texte) self.handle.replaceChild(ttext, self.handle.firstChild) #------------------------ fin form.element def aj_txt(self, txt='', containeur=None, repere=None): """Ajout d'un texte (label) brut """ tmp=self.element('text',containeur,repere, valeur=txt) return tmp def aj_text(self, txt='', containeur=None, repere=None): """Ajout d'un texte (label) dans un SPAN """ tmp=self.element('span',containeur,repere) tmp.labeltxt(txt) #tmp.style.color='#ffffff' return tmp def aj_br(self, nb=1, containeur=None, repere=None): for i in range(nb): tmp=self.element('br',containeur,repere) return tmp def aj_espace(self, nb=1, containeur=None, repere=None): st='' for i in range(nb): st+=' ' tmp=self.element('text',containeur,repere, valeur=st) return tmp def aj_bouton(self, txt=u'Bouton', containeur=None, repere=None): tmp=self.element('button',containeur,repere) tmp.attrib.className='freebouton' tmp.attrib.value=txt return tmp def aj_champ(self, label=None, longmax=8, taille=8, valeur='', containeur=None, repere=None): tmp=self.element('input',containeur,repere) tmp.attrib.className='champ' tmp.attrib.maxlength=str(longmax) tmp.attrib.size=str(taille) tmp.attrib.value=valeur tmp.attrib.type="text" if longmax>12: tmp.style.textAlign='left' else: tmp.style.textAlign='right' lc=None if not(label is None): lc=self.element('SPAN',containeur,tmp) lc.labeltxt(label) lc.attrib.className='labelchamp' self.metevent(tmp.id) return(tmp,lc) def aj_checkbox(self, label=None, valeur=False, containeur=None, repere=None): tmp=self.element("",containeur,repere) tmp.attrib.checked=valeur lc=None if not(label is None): lc=self.aj_text(label) lc.attrib.className='labelcheck' self.metevent(tmp.id) return(tmp,lc) def aj_select(self, valeur=[], multiple=None, nblig=0, containeur=None, repere=None): """ noter le 'multiple' dans select, pour une multiple sélection (sinon, un seul choix) Utilisez {Shift} ou {Ctrl} pour une sélection multiple noter le 'size' dans select, pour le nombre de lignes affichées (scroll si >) si pas de size, ou 1, liste déroulante en lecture, voir selected==True ou False ; puis lire la valeur si pas de select.style.width, largeur ajustée sur le texte le pus grand (dé)-sélectionner synamiquement une ligne : choix3.attrib.selected=True/False modifier dynamiquement un libellé : choix3txt.replacelabel(u'Nouvelle ligne 3') (sélectionner ensuite pour forcer l'affichage) """ st='0: st+=' size="'+str(nblig)+'"' st+='>' select=self.element(st,containeur,repere) lc=[] lct=[] for val,txt in valeur: tmpv=self.element("