# -*- 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='