X-Git-Url: http://iramuteq.org/git?p=iramuteq;a=blobdiff_plain;f=iramuteq.py;h=1112acc229ad2c7d710019d1fb8f310b3de98650;hp=a5d5d9ae27dd4d5003910c5abb86e1e3d5d05f25;hb=e033f9e84abb3c12d92f1580425877aa58e9af30;hpb=d33694ef233bd4a28e69d88e9eef3c5c129442fe diff --git a/iramuteq.py b/iramuteq.py index a5d5d9a..1112acc 100644 --- a/iramuteq.py +++ b/iramuteq.py @@ -28,8 +28,10 @@ import logging #------------------------------------ import wx #import wx.aui -#import wx.lib.agw.aui as aui -import agw.aui as aui +if wx.__version__ >= '2.11' : + import wx.lib.agw.aui as aui +else : + import aui import wx.html import wx.grid import wx.lib.hyperlink as hl @@ -51,19 +53,21 @@ from tabverges import Verges #from textafcuci import AfcUci #from textchdalc import AnalyseAlceste from analysetxt import Alceste -from textdist import PamTxt +from textdist import AnalysePam from textstat import Stat from textaslexico import Lexico -from textsimi import SimiTxt +from textsimi import SimiTxt, SimiFromCluster from textwordcloud import WordCloud from profile_segment import ProfileSegment -from textcheckcorpus import checkcorpus +#from textcheckcorpus import checkcorpus from openanalyse import OpenAnalyse -from corpusNG import BuildFromAlceste, Builder +from corpus import BuildFromAlceste, Builder from sheet import MySheet from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled from chemins import ConstructRscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut from parse_factiva_xml import ImportFactiva +from tools import Extract + from tree import LeftTree ########################################################## ID_OpenData = wx.NewId() @@ -97,10 +101,11 @@ ID_SimiTxt = wx.NewId() ########################################################## #encodage if sys.platform == 'darwin' : - sys.setdefaultencoding('utf-8') - wx.SetDefaultPyEncoding('utf-8') + sys.setdefaultencoding('UTF-8') + wx.SetDefaultPyEncoding('UTF-8') else : sys.setdefaultencoding(locale.getpreferredencoding()) + #chemin de l'application AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0]))) #chemin des images @@ -120,21 +125,32 @@ CreateIraDirectory(UserConfigPath, AppliPath) #fichiers log pour windows (py2exe) log = logging.getLogger('iramuteq') fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log')) -ch = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') -ch.setFormatter(formatter) fh.setFormatter(formatter) -log.addHandler(ch) log.addHandler(fh) +if sys.platform != 'win32' and sys.platform != 'darwin': + ch = logging.StreamHandler() + ch.setFormatter(formatter) + log.addHandler(ch) log.setLevel(logging.INFO) - class writer(object): def write(self, data): if data.strip() != '' : - log.info('BUG : %s' % data) + log.info('ERROR : %s' % data) + +class printer(object) : + def write(self, data) : + if data.strip() != '' : + log.info('Print : %s' % data) + sys.stderr = writer() +sys.stdout = printer() + ConfigPath = ConstructConfigPath(UserConfigPath) + +langues = {'french' : wx.LANGUAGE_FRENCH, + 'english' : wx.LANGUAGE_ENGLISH,} ##################################################################### class IraFrame(wx.Frame): @@ -149,19 +165,18 @@ class IraFrame(wx.Frame): self.images_path = os.path.join(AppliPath,'images') self.UserConfigPath = UserConfigPath self.RscriptsPath = ConstructRscriptsPath(AppliPath) - self.DictPath = ConstructDicoPath(AppliPath) + #self.DictPath = ConstructDicoPath(AppliPath) + self.DictPath = ConstructDicoPath(UserConfigPath) self.ConfigGlob = ConfigGlob self.ConfigPath = ConstructConfigPath(UserConfigPath) self.pref = RawConfigParser() + #workaround for import problem + self.SimiFromCluster = SimiFromCluster #langues - mylocale = wx.Locale(wx.LANGUAGE_FRENCH) - mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale')) - mylocale.AddCatalog('iramuteq') - presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en']) - presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR']) - presLan_fr.install() - - + gettext.install('iramuteq', os.path.join(AppliPath,'locale'), unicode=True) + self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR']) + self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en']) + self.setlangue() # tell FrameManager to manage this frame #self._mgr = wx.aui.AuiManager() self._mgr = aui.AuiManager() @@ -172,37 +187,51 @@ class IraFrame(wx.Frame): self.mb = wx.MenuBar() file_menu = wx.Menu() - item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix"), _(u"Open a matrix")) + item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8')) item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) file_menu.AppendItem(item) - item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpora"), _(u"Open a text corpora")) + item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpora").decode('utf8'), _(u"Open a text corpora").decode('utf8')) item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) file_menu.AppendItem(item) - item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis"), _("Open an analysis")) + item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8')) item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) file_menu.AppendItem(item) - item1 = wx.MenuItem(file_menu, ID_Import, _(u"Import a factiva corpora..."), _("Import a factiva corpora...")) - item1.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_TIP)) - file_menu.AppendItem(item1) - #item1.Enable(True) - - item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as..."), _(u"Save tab as...")) + + menuFactiva = wx.Menu() + fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml").decode('utf8')) + fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8')) + fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8')) + menuFactiva.AppendItem(fact_from_xml) + menuFactiva.AppendItem(fact_from_mail) + menuFactiva.AppendItem(fact_from_txt) + file_menu.AppendMenu(-1, _(u"Import from factiva"), menuFactiva) + + menuTools = wx.Menu() + splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8')) + extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8')) + menuTools.AppendItem(splitvar) + menuTools.AppendItem(extractmod) + self.ID_splitvar = splitvar.GetId() + self.ID_extractmod = extractmod.GetId() + file_menu.AppendMenu(-1, _(u"Tools"), menuTools) + + + item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8')) item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS)) - #item.Enable(False) file_menu.AppendItem(item) file_menu.Append(wx.ID_EXIT, _(u"Exit")) edit_menu = wx.Menu() - edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences')) + edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences').decode('utf8')) view_menu = wx.Menu() - view_menu.Append(ID_ACCEUIL, _(u"Home page")) - view_menu.Append(ID_VIEWDATA, _(u"Show data")) - view_menu.Append(ID_RESULT, _(u'Show results')) + view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8')) + view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8')) + view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8')) #view_menu.AppendSeparator() analyse_menu = wx.Menu() @@ -210,22 +239,22 @@ class IraFrame(wx.Frame): analyse_menu.Append(ID_Chi2, u"Chi2") #analyse_menu.Append(ID_Student, u"t de Student") menu_classif = wx.Menu() - menu_classif.Append(ID_CHDAlceste, u"Méthode Alceste") - menu_classif.Append(ID_CHDSIM, u"Par matrice des distances") + menu_classif.Append(ID_CHDAlceste, u"Méthode GNEPA") + #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances") analyse_menu.AppendMenu(-1, u"Classification", menu_classif) - analyse_menu.Append(ID_AFCM, u"AFCM") + #analyse_menu.Append(ID_AFCM, u"AFCM") analyse_menu.Append(ID_SIMI, u"Analyse de similitudes") ID_RCODE = wx.NewId() analyse_menu.Append(ID_RCODE, u"Code R...") text_menu = wx.Menu() - text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus") + #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus") text_menu.Append(ID_TEXTSTAT, u"Statistiques textuelles") text_menu.Append(ID_ASLEX, u"Spécificités et AFC") #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire") menu_classiftxt = wx.Menu() - menu_classiftxt.Append(ID_TEXTALCESTE, u"Méthode Alceste") - menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances") + menu_classiftxt.Append(ID_TEXTALCESTE, u"Méthode GNEPA") + #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances") text_menu.AppendMenu(-1, u"Classification", menu_classiftxt) text_menu.Append(ID_SimiTxt, u'Analyse de similitude') ID_WC = wx.NewId() @@ -235,12 +264,12 @@ class IraFrame(wx.Frame): help_menu.Append(wx.ID_ABOUT, u'À propos...') help_menu.Append(wx.ID_HELP, u'Aide en ligne') - self.mb.Append(file_menu, _(u"File")) - self.mb.Append(edit_menu, _(u"Edition")) - self.mb.Append(view_menu, _(u"View")) - self.mb.Append(analyse_menu, _("Spreadsheet analysis")) - self.mb.Append(text_menu, _(u"Text analysis")) - self.mb.Append(help_menu, _(u"Help")) + self.mb.Append(file_menu, _(u"File").decode('utf8')) + self.mb.Append(edit_menu, _(u"Edition").decode('utf8')) + self.mb.Append(view_menu, _(u"View").decode('utf8')) + self.mb.Append(analyse_menu, _("Spreadsheet analysis").decode('utf8')) + self.mb.Append(text_menu, _(u"Text analysis").decode('utf8')) + self.mb.Append(help_menu, _(u"Help").decode('utf8')) self.SetMenuBar(self.mb) #-------------------------------------------------------------------- @@ -329,7 +358,11 @@ class IraFrame(wx.Frame): self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData) self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText) self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse) - self.Bind(wx.EVT_MENU, self.import_factiva, id= ID_Import) + self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml) + self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail) + self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt) + self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar) + self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod) self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq) self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2) self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student) @@ -337,7 +370,7 @@ class IraFrame(wx.Frame): self.Bind(wx.EVT_MENU, self.OnCHDAlceste, id=ID_CHDAlceste) self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM) self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE) - self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS) + #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS) self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT) self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX) self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM) @@ -388,10 +421,27 @@ class IraFrame(wx.Frame): if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman' self.type = '' +##############################################################@ + self.DisEnSaveTabAs(False) + self.ShowMenu(_("View"), False) + self.ShowMenu(_("Spreadsheet analysis"), False) + self.ShowMenu(_("Text analysis"), False) + + self._mgr.Update() + + self.DataPop = False + self.DataTxt = False + self.Text = '' + + self.lexique = None + self.corpus = None + + def finish_init(self) : try : self.pref.read(self.ConfigPath['preferences']) if IsNew(self) : UpgradeConf(self) + self.pref.read(self.ConfigPath['preferences']) New = True else : CopyConf(self) @@ -400,6 +450,9 @@ class IraFrame(wx.Frame): UpgradeConf(self) self.pref.read(self.ConfigPath['preferences']) New = True + self.sound = self.pref.getboolean('iramuteq', 'sound') + self.check_update = self.pref.getboolean('iramuteq', 'checkupdate') + self.version = ConfigGlob.get('DEFAULT', 'version') #configuration des chemins de R self.PathPath = ConfigParser() self.PathPath.read(ConfigPath['path']) @@ -433,36 +486,41 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]: evt.Veto() dlg.Destroy() - self.DataPop = False - self.DataTxt = False - self.Text = '' - self.sound = self.pref.getboolean('iramuteq', 'sound') - self.check_update = self.pref.getboolean('iramuteq', 'checkupdate') - self.version = ConfigGlob.get('DEFAULT', 'version') - self.lexique = None - self.corpus = None -##############################################################@ - self.DisEnSaveTabAs(False) - self.ShowMenu(_("View"), False) - self.ShowMenu(_("Spreadsheet analysis"), False) - self.ShowMenu(_("Text analysis"), False) - - self._mgr.Update() + + + def setlangue(self) : + try : + self.pref.read(self.ConfigPath['preferences']) + guilangue = self.pref.get('iramuteq', 'guilanguage') + if guilangue == 'french' : + self.presLan_fr.install() + else : + self.presLan_en.install() + mylocale = wx.Locale(langues[guilangue]) + mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale')) + mylocale.AddCatalog('iramuteq') + except : + self.presLan_fr.install() + mylocale = wx.Locale(langues['french']) + mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale')) + mylocale.AddCatalog('iramuteq') + def OnVerif(self, evt) : pack = CheckRPackages(self) if pack : - dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION) + dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION) dlg.CenterOnParent() if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]: evt.Veto() - #FIXME marche pas sous mac ? def DisEnSaveTabAs(self, DISEN): #Disable SaveTabAs file_menu = self.mb.GetMenu(0) items = file_menu.GetMenuItems() - items[4].Enable(DISEN) + for item in items : + if item.GetId() == ID_SaveTab : + item.Enable(DISEN) def ShowMenu(self, menu, Show=True): menu_pos = self.mb.FindMenu(menu) @@ -651,7 +709,8 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" parent = nobject.GetParent() if isinstance(parent, IraFrame) : npage = self.nb.GetPage(new) - self.tree.GiveFocus(uuid=npage.parametres['uuid']) + if 'parametres' in dir(npage) : + self.tree.GiveFocus(uuid=npage.parametres['uuid']) def OnCloseTab(self, evt): #log.info('Closing tab %s' % str(evt.GetEventObject())) @@ -846,35 +905,35 @@ Voulez-vous fermer quand même ?""" except: BugReport(self) - def OnCheckcorpus(self, evt): - try : - checkcorpus(self) - except : - BugReport(self) +# def OnCheckcorpus(self, evt): +# try : +# checkcorpus(self) +# except : +# BugReport(self) def OnTextStat(self, event, corpus = None): - print 'PAS DE BUG SUR TEXT STAT' - #try: + #print 'PAS DE BUG SUR TEXT STAT' + try: if corpus is None : corpus = self.tree.getcorpus() self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7)) if self.Text.val == wx.ID_OK : PlaySound(self) - #except: - # BugReport(self) + except: + BugReport(self) def OnTextSpec(self, event, corpus = None): - #try: + try: #self.Text = AsLexico(self) - print('ATTENTION : PLUS DE BUG SUR LEXICO') + #print('ATTENTION : PLUS DE BUG SUR LEXICO') if corpus is None : corpus = self.tree.getcorpus() self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3)) if self.Text.val == wx.ID_OK : PlaySound(self) - #except: - # BugReport(self) + except: + BugReport(self) def OnTextAfcm(self, event): try: @@ -883,12 +942,31 @@ Voulez-vous fermer quand même ?""" except: BugReport(self) - def import_factiva(self,event): + def import_factiva_xml(self,event): + try : + ImportFactiva(self, 'xml') + except : + BugReport(self) + + def import_factiva_mail(self, evt) : try : - ImportFactiva(self) + ImportFactiva(self, 'mail') except : BugReport(self) + def import_factiva_txt(self, evt) : + try : + ImportFactiva(self, 'txt') + except : + BugReport(self) + + def ExtractTools(self, evt) : + ID = evt.GetId() + if ID == self.ID_splitvar : + Extract(self, 'splitvar') + else : + Extract(self, 'mods') + def OnTextAlceste(self, event, corpus = None): try: #print('ATTENTION : PLUS DE BUG SUR ALCESTE') @@ -901,17 +979,23 @@ Voulez-vous fermer quand même ?""" except: BugReport(self) - def OnPamSimple(self, event): + def OnPamSimple(self, event, corpus = None): try: - self.Text = PamTxt(self) + if corpus is None : + corpus = self.tree.getcorpus() + self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = progressbar(self,6)) if self.Text.val == wx.ID_OK: PlaySound(self) except: BugReport(self) + + def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) : + DoSimi(self, param = parametres, fromprof = fromprof, pathout = pathout, listactives = listactives, actives = actives, tableau = tableau) def OnSimi(self,evt): try : #print 'ATTENTION !!!! VERGES' + #print 'PLUS DE BUG SUR SIMI' self.res = DoSimi(self, param = None) #self.res = Verges(self) if self.res.val == wx.ID_OK : @@ -1093,6 +1177,7 @@ class MySplashScreen(wx.SplashScreen): def ShowMain(self): frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(1100, 800)) frame.Show() + frame.finish_init() frame.Upgrade() frame.OnOpenFromCmdl() # if self.fc.IsRunning():