X-Git-Url: http://iramuteq.org/git?p=iramuteq;a=blobdiff_plain;f=iramuteq.py;h=6dfa3ea8bbf9debf9c7c2bf708b790fbfc8117b4;hp=ef99d2010dd211cec239cefe2b4b5c8555fe8b14;hb=101e493f4787c751b2b1e1fabff4b5b61a14114d;hpb=11658a48940defe4f9b849e9e32606a646751388 diff --git a/iramuteq.py b/iramuteq.py old mode 100644 new mode 100755 index ef99d20..6dfa3ea --- a/iramuteq.py +++ b/iramuteq.py @@ -1,8 +1,9 @@ #!/bin/env python # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2008-2012, Pierre Ratinaud +#Copyright (c) 2008-2020, Pierre Ratinaud #License: GNU GPL +#test from optparse import OptionParser @@ -13,6 +14,7 @@ parser.add_option("-f", "--file", dest="filename", import sys reload(sys) +#sys.path.insert(0, '/usr/lib/python2.7/dist-packages/wxPython-4.0.1-py2.7-linux-amd64.egg') import locale import tempfile import codecs @@ -28,6 +30,7 @@ import wx.lib.agw.aui as aui import wx.html import wx.grid import wx.lib.hyperlink as hl +#import wx.lib.agw.hyperlink as hl #------------------------------------ from functions import BugReport, PlaySound, History, progressbar from checkversion import NewVersion @@ -36,6 +39,7 @@ from tableau import Tableau from dialog import PrefDialog from tabfrequence import Frequences, FreqMultiple from tabchi2 import ChiSquare +from tabchi2mcnemar import McNemar #from tabstudent import MakeStudent from tabchddist import ChdCluster from tabafcm import DoAFCM @@ -44,15 +48,16 @@ from tabsimi import DoSimi from tabrsimple import InputText from tabverges import Prototypical from tabsplitvar import SplitMatrixFromVar -#from textdist import AnalysePam +#frog textdist import AnalysePam from textstat import Stat from textaslexico import Lexico +from textlabbe import DistLabbe from textsimi import SimiTxt, SimiFromCluster from textwordcloud import WordCloud, ClusterCloud -from textreinert import Reinert +from textreinert import Reinert, ReDoReinert #from textcheckcorpus import checkcorpus from openanalyse import OpenAnalyse -from corpus import Builder, SubBuilder +from corpus import Builder, SubBuilder, MergeClusters from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled from chemins import RscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut from parse_factiva_xml import ImportFactiva @@ -68,6 +73,7 @@ ID_OpenText = wx.NewId() ID_OnOpenAnalyse = wx.NewId() ID_Freq = wx.NewId() ID_Chi2 = wx.NewId() +ID_Chi2mc = wx.NewId() ID_Student = wx.NewId() ID_CHDSIM = wx.NewId() ID_CHDReinert = wx.NewId() @@ -101,6 +107,8 @@ ID_Fact_copy = wx.NewId() ID_exportmeta = wx.NewId() ID_importdmi = wx.NewId() ID_merge = wx.NewId() +ID_merge_clusters = wx.NewId() +ID_labbe = wx.NewId() ########################################################## #elements de configuration ########################################################## @@ -126,7 +134,7 @@ user_home = os.getenv('HOME') if user_home is None : user_home = os.path.expanduser('~') -UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq')) +UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq-%s' % ConfigGlob.get('DEFAULT', 'version_nb'))) #Si pas de fichiers de config utilisateur, on cree le repertoire CreateIraDirectory(UserConfigPath, AppliPath) #fichiers log pour windows (py2exe) @@ -173,6 +181,7 @@ code_langues = {'french' : 'fr_FR', images_analyses = { 'textroot' : 'textroot.png', 'alceste' : 'reinert.png', + 'reinert' : 'reinert.png', 'corpus' : 'textcorpus.png', 'wordcloud' :'wordcloud.png', 'stat' :'stats.png', @@ -185,6 +194,7 @@ images_analyses = { 'freq' : 'frequences.png', 'freqmulti' : 'frequences.png', 'chi2' : 'chi2.png', + 'chi2mcnemar' : 'chi2.png', 'reinertmatrix' : 'reinertmatrix.png', 'simimatrix' : 'simimatrix.png', 'simiclustermatrix' : 'simimatrix.png', @@ -199,14 +209,15 @@ images_analyses = { 'subcorpusthema' : 'subcorpusthema.png', 'preferences' : 'preferences.png', 'exportmetatable' : 'exportmetatable.png', - 'importdmi' : 'twitter.png' + 'importdmi' : 'twitter.png', + 'labbe' : 'spec.png' } ##################################################################### class IraFrame(wx.Frame): def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition, - size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE | - wx.SUNKEN_BORDER | + size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE | + wx.SUNKEN_BORDER | wx.CLIP_CHILDREN): log.info('Starting... ' ) log.info('version : %s' % ConfigGlob.get('DEFAULT', 'version')) @@ -236,7 +247,7 @@ class IraFrame(wx.Frame): self.setlangue() #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']) - # tell FrameManager to manage this frame + # tell FrameManager to manage this frame #self._mgr = wx.aui.AuiManager() self._mgr = aui.AuiManager() self._mgr.SetManagedWindow(self) @@ -253,11 +264,11 @@ class IraFrame(wx.Frame): #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) item.SetBitmap(self.images_analyses['matroot']) file_menu.AppendItem(item) - + item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8')) item.SetBitmap(self.images_analyses['textroot']) file_menu.AppendItem(item) - + item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8')) item.SetBitmap(self.images_analyses['iramuteq']) file_menu.AppendItem(item) @@ -265,18 +276,21 @@ class IraFrame(wx.Frame): item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8')) item.SetBitmap(self.images_analyses['TXM']) file_menu.AppendItem(item) - + item = wx.MenuItem(file_menu, ID_ImportEuro, _(u"Import from Europress").decode('utf8'), _(u"Import from Europress").decode('utf8')) item.SetBitmap(self.images_analyses['europress']) - file_menu.AppendItem(item) - + file_menu.AppendItem(item) + item = wx.MenuItem(file_menu, ID_importdmi, _(u"Import from DMI-TCAT (exp.)").decode('utf8'), _(u"Import from DMI-TCAT (exp.)").decode('utf8')) item.SetBitmap(self.images_analyses['importdmi']) - file_menu.AppendItem(item) - + file_menu.AppendItem(item) + item = wx.MenuItem(file_menu, ID_merge, _(u'Merge graphs').decode('utf8'), _(u'Merge graphs').decode('utf8')) file_menu.AppendItem(item) - + + item = wx.MenuItem(file_menu, ID_merge_clusters, _(u'Corpus from merge clusters').decode('utf8'), _(u'Corpus from merge clusters').decode('utf8')) + file_menu.AppendItem(item) + menuFactiva = wx.Menu() fact_from_xml = wx.MenuItem(menuFactiva, ID_Fact_xml, _(u"from xml").decode('utf8')) fact_from_xml.SetBitmap(self.images_analyses['factiva_xml']) @@ -301,19 +315,19 @@ class IraFrame(wx.Frame): self.ID_extractthem = extractthem.GetId() file_menu.AppendMenu(-1, _(u"Tools").decode('utf8'), 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)) #file_menu.AppendItem(item) - + file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8')) - + edit_menu = wx.Menu() pref = wx.MenuItem(edit_menu, wx.ID_PREFERENCES, _(u'Preferences').decode('utf8')) pref.SetBitmap(self.images_analyses['preferences']) edit_menu.AppendItem(pref) #edit_menu.Append(wx.ID_PREFERENCES, _(u'Preferences').decode('utf8')) - + view_menu = wx.Menu() home = wx.MenuItem(view_menu, ID_ACCEUIL, _(u"Home page").decode('utf8')) home.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_GO_HOME, size = (16,16))) @@ -328,13 +342,14 @@ class IraFrame(wx.Frame): matanalyses = [[ID_Freq, _(u"Frequencies").decode('utf8'), 'freq'], [ID_FreqMulti, _(u"Multiple Frequencies").decode('utf8'), 'freqmulti'], [ID_Chi2, _(u"Chi2").decode('utf8'), 'chi2'], + [ID_Chi2mc, _(u"Chi2 McNemar").decode('utf8'), 'chi2mcnemar'], {'name' : _(u"Clustering").decode('utf8'), 'content' : [[ID_CHDReinert, _(u"Reinert's Method").decode('utf8'), 'reinertmatrix']]}, [ID_SIMI, _(u"Similarities Analysis").decode('utf8'), 'simimatrix'], [ID_proto, _(u"Prototypical Analysis").decode('utf8'), 'proto'], [ID_Splitfromvar, _(u"Split from variable").decode('utf8'), 'subcorpusmeta'], ] - + for analyse in matanalyses : if not isinstance(analyse, dict) : item = wx.MenuItem(matrix_menu, analyse[0], analyse[1]) @@ -365,17 +380,18 @@ class IraFrame(wx.Frame): #matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8')) #matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8')) ID_RCODE = wx.NewId() - #matrix_menu.Append(ID_RCODE, u"Code R...") + #matrix_menu.Append(ID_RCODE, u"Code R...") #menu_splittab = wx.Menu() #ID_SPLITVAR = wx.NewId() #splitvar = wx.MenuItem(menu_splittab, ID_SPLITVAR, _(u"Split from variable").decode('utf8')) #menu_splittab.AppendItem(splitvar) #matrix_menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), menu_splittab) self.matrix_menu = matrix_menu - + text_menu = wx.Menu() analyses_text = [[ID_TEXTSTAT, _(u"Statistics").decode('utf8'), 'stat'], [ID_ASLEX, _(u"Specificities and CA").decode('utf8'), 'spec'], + [ID_labbe, _(u"Labbe Distance").decode('utf8'),'labbe'], {'name' : _(u"Clustering").decode('utf8'), 'content' : [[ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'), 'alceste']]}, [ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'), 'simitxt'], @@ -385,7 +401,7 @@ class IraFrame(wx.Frame): [ID_Subtxtfromthem, _(u'Sub corpus from thematic').decode('utf8'), 'subcorpusthema']]}, [ID_exportmeta, _(u"Export metadata table").decode('utf8'), 'exportmetatable'], ] - + for analyse in analyses_text : if not isinstance(analyse, dict) : item = wx.MenuItem(text_menu, analyse[0], analyse[1]) @@ -406,11 +422,11 @@ class IraFrame(wx.Frame): # menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8')) # #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances") # text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt) -# text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8')) -# +# text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8')) +# # text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8')) self.text_menu = text_menu - + help_menu = wx.Menu() about = wx.MenuItem(help_menu, wx.ID_ABOUT, _(u"About...").decode('utf8')) about.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_INFORMATION, size = (16,16))) @@ -420,14 +436,14 @@ class IraFrame(wx.Frame): help.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_HELP, size = (16,16))) help_menu.AppendItem(help) #help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8')) - + 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(matrix_menu, _(u"Matrix 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) #-------------------------------------------------------------------- self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP) @@ -455,7 +471,7 @@ class IraFrame(wx.Frame): tb1.AddLabelTool(ID_ImportEuro, "ImportEuro", self.images_analyses['europress'], shortHelp= _(u"Import from Europress").decode('utf8'), longHelp=_(u"Import from Europress").decode('utf8')) tb1.AddSeparator() tb1.AddLabelTool(ID_importdmi, "ImportDMI", self.images_analyses['importdmi'], shortHelp= _(u"Import from DMI-TCAT (exp.)").decode('utf8'), longHelp=_(u"Import from DMI-TCAT (exp.)").decode('utf8')) - tb1.AddSeparator() + tb1.AddSeparator() tb1.AddLabelTool(ID_Fact_xml, "ImportFactxml", self.images_analyses['factiva_xml'], shortHelp= _(u"Factiva from xml").decode('utf8'), longHelp=_(u"Factiva from xml").decode('utf8')) tb1.AddLabelTool(ID_Fact_mail, "ImportFactmail", self.images_analyses['factiva_mail'], shortHelp= _(u"Factiva from mail").decode('utf8'), longHelp=_(u"Factiva from mail").decode('utf8')) tb1.AddLabelTool(ID_Fact_copy, "ImportFactcopy", self.images_analyses['factiva_copy'], shortHelp= _(u"Factiva from copy/paste").decode('utf8'), longHelp=_(u"Factiva from copy/paste").decode('utf8')) @@ -465,7 +481,7 @@ class IraFrame(wx.Frame): tb1.AddLabelTool(ID_ACCEUIL, "Home", wx.ArtProvider_GetBitmap(wx.ART_GO_HOME, size = (16,16)), shortHelp= _(u"Home page").decode('utf8'), longHelp=_(u"Home page").decode('utf8')) tb1.AddLabelTool(ID_RESULT, "Results", wx.ArtProvider_GetBitmap(wx.ART_LIST_VIEW, size = (16,16)), shortHelp= _(u'Show results').decode('utf8'), longHelp=_(u'Show results').decode('utf8')) tb1.Realize() - + tb_text = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.TB_FLAT | wx.TB_NODIVIDER) for analyse in analyses_text : @@ -475,7 +491,7 @@ class IraFrame(wx.Frame): for subana in analyse['content'] : tb_text.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1]) tb_text.Realize() - + tb_mat = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.TB_FLAT | wx.TB_NODIVIDER) for analyse in matanalyses : @@ -483,9 +499,9 @@ class IraFrame(wx.Frame): tb_mat.AddLabelTool(analyse[0], analyse[1], self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)), shortHelp = analyse[1], longHelp = analyse[1]) else : for subana in analyse['content'] : - tb_mat.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1]) + tb_mat.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1]) tb_mat.Realize() - + tb_help = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.TB_FLAT | wx.TB_NODIVIDER) tb_help.AddLabelTool(wx.ID_ABOUT, "About", wx.ArtProvider_GetBitmap(wx.ART_INFORMATION, size=(16,16)), shortHelp=_(u"About...").decode('utf8'), longHelp=_(u"About...").decode('utf8')) @@ -494,9 +510,9 @@ class IraFrame(wx.Frame): #------------------------------------------------------------------------------------------------ self.text_ctrl_txt = wx.TextCtrl(self, -1, "", wx.Point(0, 0), wx.Size(200, 200), wx.NO_BORDER | wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY) - + #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo(). - # Name("Text").CenterPane()) + # Name("Text").CenterPane()) self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo(). Name("Text").CenterPane()) #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text"). @@ -507,11 +523,12 @@ class IraFrame(wx.Frame): # with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f : # f.write('') self.history = History(os.path.join(UserConfigPath, 'history.db')) + #self.history.dostat() self.tree = LeftTree(self) self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Historic").decode('utf8')). Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True). MinimizeButton(True)) - + #self.nb = wx.aui.AuiNotebook(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.aui.AUI_NB_DEFAULT_STYLE | wx.aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.aui.AUI_NB_TAB_MOVE | wx.aui.AUI_NB_TAB_FLOAT| wx.NO_BORDER) self.nb = aui.AuiNotebook(self, -1, wx.DefaultPosition, wx.DefaultSize, aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | aui.AUI_NB_TAB_MOVE | aui.AUI_NB_TAB_FLOAT| wx.NO_BORDER) notebook_flags = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | aui.AUI_NB_TAB_MOVE | aui.AUI_NB_TAB_FLOAT| wx.NO_BORDER @@ -525,14 +542,14 @@ class IraFrame(wx.Frame): # CenterPane()) self._mgr.AddPane(self.nb, aui.AuiPaneInfo(). Name("Tab_content"). - CenterPane()) - + CenterPane()) + #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane()) #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane()) self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab) self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged) # add the toolbars to the manager - + #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo(). # Name("tb1").Caption("Fichiers"). # ToolbarPane().Top(). @@ -541,33 +558,33 @@ class IraFrame(wx.Frame): Name("tb1").Caption("Fichiers"). ToolbarPane().Top(). LeftDockable(True).RightDockable(False)) - + self._mgr.AddPane(tb_text, aui.AuiPaneInfo(). Name("tb_text").Caption("analyse_text"). ToolbarPane().Top(). LeftDockable(True).RightDockable(False)) - + self._mgr.AddPane(tb_mat, aui.AuiPaneInfo(). Name("tb_mat").Caption("analyse_matrix"). ToolbarPane().Top(). LeftDockable(True).RightDockable(False)) - + self._mgr.AddPane(tb_help, aui.AuiPaneInfo(). Name("tb_help").Caption("help"). ToolbarPane().Top(). LeftDockable(True).RightDockable(False)) - + self._mgr.GetPane('tb_text').Hide() self._mgr.GetPane('tb_mat').Hide() - + self.ShowAPane("Intro_Text") self._mgr.GetPane("lefttree").Show() self._mgr.GetPane("classif_tb").Hide() - # "commit" all changes made to FrameManager + # "commit" all changes made to FrameManager self._mgr.Update() # Show How To Use The Closing Panes Event -################################################################## +################################################################## self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL) self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT) self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData) @@ -582,6 +599,7 @@ class IraFrame(wx.Frame): self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq) self.Bind(wx.EVT_MENU, self.OnFreqMulti, id=ID_FreqMulti) self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2) + self.Bind(wx.EVT_MENU, self.OnChi2McNemar, id=ID_Chi2mc) self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student) self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM) self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert) @@ -593,6 +611,7 @@ class IraFrame(wx.Frame): #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.OnTextLabbe, id=ID_labbe) self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM) self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT) self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM) @@ -611,6 +630,7 @@ class IraFrame(wx.Frame): self.Bind(wx.EVT_MENU, self.OnImportDMI, id=ID_importdmi) self.Bind(wx.EVT_MENU, self.OnExportMeta, id=ID_exportmeta) self.Bind(wx.EVT_MENU, self.OnMergeGraph, id = ID_merge) + self.Bind(wx.EVT_MENU, self.OnMergeClusters, id = ID_merge_clusters) self.Bind(wx.EVT_CLOSE, self.OnClose) ################################################################## flags = self._mgr.GetAGWFlags() @@ -652,7 +672,7 @@ class IraFrame(wx.Frame): self.ShowMenu('view', True) self.ShowMenu('matrix', False) self.ShowMenu('text', False) - + self._mgr.Update() self.DataPop = False @@ -693,7 +713,7 @@ class IraFrame(wx.Frame): with open(ConfigPath['path'], 'w') as f : self.PathPath.write(f) else: - BestRPath = True + BestRPath = True if BestRPath : self.RPath = self.PathPath.get('PATHS', 'rpath') if New : @@ -732,18 +752,18 @@ class IraFrame(wx.Frame): if Show : self._mgr.GetPane('tb_text').Show() else : - self._mgr.GetPane('tb_text').Hide() + self._mgr.GetPane('tb_text').Hide() elif menu == 'matrix' : menu_pos = 3 if Show : self._mgr.GetPane('tb_mat').Show() else : - self._mgr.GetPane('tb_mat').Hide() + self._mgr.GetPane('tb_mat').Hide() elif menu == 'view' : menu_pos = 2 else : menu_pos = None - + #menu_pos = self.mb.FindMenu(menu) if not menu_pos is None : self.mb.EnableTop(menu_pos, Show) @@ -772,7 +792,7 @@ class IraFrame(wx.Frame): self.tableau.make_content() OpenAnalyse(self, self.tableau.parametres) self.tree.OnItemAppend(self.tableau.parametres) - del busy + del busy except : del busy BugReport(self) @@ -789,7 +809,7 @@ class IraFrame(wx.Frame): self.filename = self.input_path[0] if inputname: self.OpenText() - + def OnSubText(self, evt, corpus = None, parametres = None): if corpus is None : corpus = self.tree.getcorpus() @@ -806,7 +826,7 @@ class IraFrame(wx.Frame): OpenAnalyse(self, corpus.parametres) self.tree.OnItemAppend(corpus.parametres) del busy - + def OpenText(self): builder = Builder(self, 5) if builder.res == wx.ID_OK : @@ -830,7 +850,7 @@ class IraFrame(wx.Frame): count += 1 keepGoing = builder.dlg.Update(count, u"Chargement du dictionnaire") builder.dlg.Destroy() - + def OnExit(self, event): self.Close() @@ -841,7 +861,7 @@ class IraFrame(wx.Frame): info.Copyright = ConfigGlob.get('DEFAULT', 'copyright') info.Translators = ConfigGlob.get('DEFAULT', 'translators').decode('utf8').split(';') info.Description = u""" -Interface de R pour les Analyses Multidimensionnelles +Interface de R pour les Analyses Multidimensionnelles de Textes et de Questionnaires Un logiciel libre @@ -854,7 +874,7 @@ REPERE info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ") dev = ConfigGlob.get('DEFAULT', 'dev').decode('utf8').split(';') info.Developers = dev - info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier + info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier suivant les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation ; soit la version 2 de cette licence, soit (à votre convenance) une version ultérieure. @@ -905,7 +925,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" if self.nb.GetPageCount() == 1 and not notebook : self.LastTabClose() - + def LastTabClose(self) : if self.nb.GetPageCount() == 1 : if self.DataTxt : @@ -920,25 +940,25 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" self.x = self.x + 20 x = self.x pt = self.ClientToScreen(wx.Point(0, 0)) - + return wx.Point(pt.x + x, pt.y + x) - + def ShowAPane(self, panel): for pane in self._mgr.GetAllPanes() : - if not pane.IsToolbar() and pane.name != 'lefttree': + if not pane.IsToolbar() and pane.name != 'lefttree': pane.Hide() self._mgr.GetPane(panel).Show() self._mgr.Update() - + def OnAcceuil(self, event): self.ShowAPane(u"Intro_Text") event.Skip() - + def CreateHTMLCtrl(self): ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300)) if "gtk2" in wx.PlatformInfo: ctrl.SetStandardFonts() - ctrl.SetPage(u"text") + ctrl.SetPage(u"text") return ctrl def ShowTab(self, evt): @@ -958,16 +978,19 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" #print 'plus de bug@@@@@@@@@@@@@@@@@@@@@@' analyse(self, matrix, parametres = parametres, dlg = dlgnb) except: - BugReport(self) + BugReport(self) def OnFreq(self, event, matrix = None): self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3) - + def OnFreqMulti(self, event, matrix = None): self.analyse_matrix(FreqMultiple, analyse_type = 'freqmulti', matrix = matrix, dlgnb = 3) def OnChi2(self, event, matrix = None): - self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3) + self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3) + + def OnChi2McNemar(self, event, matrix = None): + self.analyse_matrix(McNemar, matrix = matrix, analyse_type = 'chi2mcnemar', dlgnb = 3) def OnSimiTab(self, event, matrix = None): self.analyse_matrix(DoSimi, matrix = matrix, analyse_type = 'simimatrix', dlgnb = 5) @@ -977,10 +1000,10 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" # matrix = self.tree.getmatrix() #AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = 3) self.analyse_matrix(AnalyseQuest, matrix = matrix, analyse_type = 'reinertmatrix', dlgnb = 5) - + def OnStudent(self, event): try: - MakeStudent(self) + MakeStudent(self) except: BugReport(self) @@ -998,7 +1021,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" PlaySound(self) except: BugReport(self) - + # def OnCHDReinert(self, event): # try: # # print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE') @@ -1010,35 +1033,49 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" def OnMergeGraph(self, evt): #FIXME AnalyseMerge(self, {'type': 'merge', 'fileout' : '/tmp/test.txt'}, dlg = 5) - + + def OnEliminate(self, corpus, parametres) : + print parametres + + def OnMergeClusters(self, evt) : + builder = MergeClusters(self, {}) + if builder.res == wx.ID_OK : + busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self) + wx.SafeYield() + corpus = builder.doanalyse() + self.history.add(corpus.parametres) + OpenAnalyse(self, corpus.parametres) + self.tree.OnItemAppend(corpus.parametres) + del busy + def OnProto(self, evt, matrix = None) : self.analyse_matrix(Prototypical, matrix = matrix, analyse_type = 'proto', dlgnb = 3) #Prototypical(self, {'type' : 'proto'}) - + def OnSplitVar(self, evt, matrix = None): if matrix is None : matrix = self.tree.getmatrix() self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', parametres = {'pathout': matrix.pathout.dirout}, dlgnb = 3) #matrix = self.tree.getmatrix() - + def OnSimiTxt(self, evt, corpus = None) : # print 'PLUS DE BUG SUR SIMITXT' try : #self.Text = SimiTxt(self) if corpus is None : - corpus = self.tree.getcorpus() + corpus = self.tree.getcorpus() self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = 3) if self.Text.val == wx.ID_OK : PlaySound(self) except : BugReport(self) - + def OnWordCloud(self, evt, corpus = None) : # print 'PLUS DE BUG SUR WORDCLOUD' try : if corpus is None : - corpus = self.tree.getcorpus() + corpus = self.tree.getcorpus() self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = 3) if self.Text.val == wx.ID_OK : PlaySound(self) @@ -1060,13 +1097,13 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" if corpus is None : corpus = self.tree.getcorpus() self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = 7) - + if self.Text.val == wx.ID_OK : PlaySound(self) except: BugReport(self) - - def OnTextSpec(self, event, corpus = None): + + def OnTextSpec(self, event, corpus = None): try: #self.Text = AsLexico(self) #print('ATTENTION : PLUS DE BUG SUR LEXICO') @@ -1077,7 +1114,18 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" PlaySound(self) except: BugReport(self) - + + def OnTextLabbe(self, event, corpus = None): + try: + if corpus is None : + corpus = self.tree.getcorpus() + self.Text = DistLabbe(self, corpus, parametres = {'type' : 'labbe'}, dlg = 3) + if self.Text.val == wx.ID_OK : + PlaySound(self) + except: + BugReport(self) + + def OnTextAfcm(self, event): try: AfcUci(self) @@ -1108,23 +1156,23 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" ImportFactiva(self, 'txm') except : BugReport(self) - + def OnImportEuropress(self, evt) : try : ImportFactiva(self, 'euro') except : BugReport(self) - + def OnImportDMI(self, evt): ImportDMI(self, {}) - + def OnExportMeta(self, evt, corpus = None): if corpus is None : corpus = self.tree.getcorpus() try : ExportMetaTable(self, corpus) except : - BugReport(self) + BugReport(self) def ExtractTools(self, evt) : ID = evt.GetId() @@ -1140,7 +1188,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" #print('ATTENTION : PLUS DE BUG SUR ALCESTE') #RunAnalyse(self, corpus, Alceste, OptAlceste) if corpus is None : - corpus = self.tree.getcorpus() + corpus = self.tree.getcorpus() self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6) if self.Text.val == wx.ID_OK: PlaySound(self) @@ -1159,7 +1207,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" def SimiCluster(self, parametres = {}, fromprof = False, tableau = None) : self.analyse_matrix(DoSimi, parametres = parametres, analyse_type = 'simiclustermatrix', matrix = tableau, dlgnb = 5) - + # def OnSimi(self,evt): # try : #print 'ATTENTION !!!! VERGES' @@ -1174,7 +1222,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" def OnHelp(self, event): webbrowser.open('http://www.iramuteq.org/documentation') - + def OnPref(self, event): dlg = PrefDialog(self) dlg.CenterOnParent() @@ -1185,7 +1233,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" if self.check_update: NewVersion(self) else: - print 'pas de verif' + print 'pas de verif' #IsNew(self) #CheckRPackages(self) @@ -1223,8 +1271,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" OpenAnalyse(self, self.filename) if not truepath: print 'This file does not exist' - - + class IntroPanel(wx.Panel): def __init__(self, parent): @@ -1246,7 +1293,7 @@ class IntroPanel(wx.Panel): grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0) grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0) grid_sizer_2 = wx.BoxSizer(wx.HORIZONTAL) - + iralink = hl.HyperLinkCtrl(self, wx.ID_ANY, u"http://www.iramuteq.org", URL="http://www.iramuteq.org") iralink.SetColours(linkcolor, linkcolor, "RED") iralink.SetBackgroundColour(bckgrdcolor) @@ -1254,19 +1301,19 @@ class IntroPanel(wx.Panel): iralink.SetUnderlines(False, False, True) iralink.SetBold(True) iralink.UpdateLink() - + PanelPres = wx.Panel(self) bckgrdcolor = wx.Colour(randint(0, 255), randint(0, 255), randint(0, 255)) PanelPres.SetBackgroundColour(bckgrdcolor) - + label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1)) label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa")) label_1.SetForegroundColour(wx.RED) - + iraicone = wx.Image(os.path.join(ImagePath,'iraicone100x100.png'), wx.BITMAP_TYPE_ANY).ConvertToBitmap() but_ira = wx.StaticBitmap(self, -1, bitmap = iraicone) - + label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n') label2.SetForegroundColour(txtcolour) label2.SetBackgroundColour(bckgrdcolor) @@ -1277,11 +1324,11 @@ class IntroPanel(wx.Panel): self.hyper2.SetUnderlines(False, False, True) self.hyper2.SetBold(True) self.hyper2.UpdateLink() - + label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ') label_lerass.SetForegroundColour(txtcolour) label_lerass.SetBackgroundColour(bckgrdcolor) - + self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com") self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED") self.hyper_lerass.SetBackgroundColour(bckgrdcolor) @@ -1289,18 +1336,18 @@ class IntroPanel(wx.Panel): self.hyper_lerass.SetUnderlines(False, False, True) self.hyper_lerass.SetBold(True) self.hyper_lerass.UpdateLink() - + blank = wx.StaticText(PanelPres, -1, u'\n') blank1 = wx.StaticText(PanelPres, -1, u'\n') - + labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8')) labellicence.SetForegroundColour(txtcolour) labellicence.SetBackgroundColour(bckgrdcolor) - + labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright')) labelcopy.SetForegroundColour(txtcolour) labelcopy.SetBackgroundColour(bckgrdcolor) - + python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap() r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap() lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap() @@ -1310,13 +1357,12 @@ class IntroPanel(wx.Panel): self.Bind(wx.EVT_BUTTON, self.OnPython, but_python) self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique) self.Bind(wx.EVT_BUTTON, self.OnR, but_r) - - + grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0) grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0) grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0) sizer4.Add(label_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5) - + sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5) sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5) sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5) @@ -1333,18 +1379,18 @@ class IntroPanel(wx.Panel): grid_sizer_2.Add(but_python, 1, wx.ALIGN_BOTTOM) grid_sizer_2.Add(but_lexique, 1, wx.ALIGN_BOTTOM) grid_sizer_2.Add(but_r, 1, wx.ALIGN_BOTTOM) - + sizer1.Add(PanelPres, 0, wx.EXPAND |wx.ALL, 10) sizer1.Add(grid_sizer_2, 2, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 1) self.SetSizer(sizer1) sizer1.Fit(self) - + def OnPython(self,evt): webbrowser.open('http://www.python.org') - + def OnLexique(self,evt): webbrowser.open('http://www.lexique.org') - + def OnR(self,evt): webbrowser.open('http://www.r-project.org') @@ -1360,7 +1406,7 @@ class MySplashScreen(wx.SplashScreen): def OnClose(self, evt): evt.Skip() self.Hide() - + if self.fc.IsRunning(): self.fc.Stop() self.ShowMain() @@ -1377,7 +1423,7 @@ class MySplashScreen(wx.SplashScreen): # if self.fc.IsRunning(): # self.Raise() #wx.CallAfter(frame.ShowTip) - + class MyApp(wx.App): def OnInit(self): """ @@ -1385,7 +1431,7 @@ class MyApp(wx.App): the main frame when it is time to do so. """ wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1) - self.SetAppName("Iramuteq") + self.SetAppName("Iramuteq") splash = MySplashScreen() splash.Show() return True