2 # -*- coding: utf-8 -*-
3 #Author: Pierre Ratinaud
4 #Copyright (c) 2008-2012, Pierre Ratinaud
7 from optparse import OptionParser
9 parser = OptionParser()
10 parser.add_option("-f", "--file", dest="filename",
11 help="open FILE", metavar="FILE", default=False)
12 (options, args) = parser.parse_args()
23 from random import randint
24 from ConfigParser import *
28 #------------------------------------
31 if wx.__version__ >= '2.11' :
32 import wx.lib.agw.aui as aui
37 import wx.lib.hyperlink as hl
38 #------------------------------------
39 from functions import BugReport, PlaySound, ReadLexique, History, DoConf, ReadDicoAsDico, progressbar
40 from checkversion import NewVersion
41 from guifunct import *
42 from tableau import Tableau
43 from dialog import PrefDialog, EncodeDialog, CorpusPref
44 from tabfrequence import Frequences
45 from tabchi2 import ChiSquare
46 #from tabstudent import MakeStudent
47 from tabchddist import ChdCluster
48 from tabafcm import DoAFCM
49 from tabchdalc import AnalyseQuest
50 from tabsimi import DoSimi
51 from tabrsimple import InputText
52 from tabverges import Verges
53 #from textafcuci import AfcUci
54 #from textchdalc import AnalyseAlceste
55 from analysetxt import Alceste
56 from textdist import AnalysePam
57 from textstat import Stat
58 from textaslexico import Lexico
59 from textsimi import SimiTxt, SimiFromCluster
60 from textwordcloud import WordCloud
61 from profile_segment import ProfileSegment
62 #from textcheckcorpus import checkcorpus
63 from openanalyse import OpenAnalyse
64 from corpus import BuildFromAlceste, Builder
65 from sheet import MySheet
66 from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
67 from chemins import ConstructRscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
68 from parse_factiva_xml import ImportFactiva
69 from tools import Extract
71 from tree import LeftTree
72 ##########################################################
73 ID_OpenData = wx.NewId()
74 ID_Import = wx.NewId()
75 ID_OpenText = wx.NewId()
76 ID_OnOpenAnalyse = wx.NewId()
79 ID_Student = wx.NewId()
80 ID_CHDSIM = wx.NewId()
81 ID_CHDAlceste = wx.NewId()
82 ID_TEXTAFCM = wx.NewId()
83 ID_TEXTSTAT = wx.NewId()
85 ID_TEXTALCESTE = wx.NewId()
86 ID_TEXTPAM = wx.NewId()
87 ID_CHECKCORPUS = wx.NewId()
88 ID_Tabcontent = wx.NewId()
91 ID_CloseTab = wx.NewId()
92 ID_SaveTab = wx.NewId()
93 ID_CreateText = wx.NewId()
94 ID_ACCEUIL = wx.NewId()
95 ID_RESULT = wx.NewId()
96 ID_VIEWDATA = wx.NewId()
97 ID_HTMLcontent = wx.NewId()
98 ID_SimiTxt = wx.NewId()
99 ##########################################################
100 #elements de configuration
101 ##########################################################
103 if sys.platform == 'darwin' :
104 sys.setdefaultencoding('utf-8')
105 wx.SetDefaultPyEncoding('utf-8')
107 sys.setdefaultencoding(locale.getpreferredencoding())
108 #chemin de l'application
109 AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0])))
111 ImagePath = os.path.join(AppliPath, 'images')
112 #configuration generale
113 DictConfigPath = ConstructGlobalPath(AppliPath)
114 ConfigGlob = ConfigParser()
115 ConfigGlob.read(DictConfigPath['global'])
116 #repertoire de l'utilisateur
117 if os.getenv('HOME') != None:
118 user_home = os.getenv('HOME')
120 user_home = os.getenv('HOMEPATH')
121 UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq'))
122 #Si pas de fichiers de config utilisateur, on cree le repertoire
123 CreateIraDirectory(UserConfigPath, AppliPath)
124 #fichiers log pour windows (py2exe)
125 log = logging.getLogger('iramuteq')
126 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
127 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
128 fh.setFormatter(formatter)
130 if sys.platform != 'win32' and sys.platform != 'darwin':
131 ch = logging.StreamHandler()
132 ch.setFormatter(formatter)
134 log.setLevel(logging.INFO)
136 class writer(object):
137 def write(self, data):
138 if data.strip() != '' :
139 log.info('ERROR : %s' % data)
141 class printer(object) :
142 def write(self, data) :
143 if data.strip() != '' :
144 log.info('Print : %s' % data)
146 sys.stderr = writer()
147 sys.stdout = printer()
149 ConfigPath = ConstructConfigPath(UserConfigPath)
150 #####################################################################
152 class IraFrame(wx.Frame):
153 def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
154 size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE |
157 log.info('Starting...')
158 wx.Frame.__init__(self, parent, id, title, pos, size, style)
160 self.AppliPath = AppliPath
161 self.images_path = os.path.join(AppliPath,'images')
162 self.UserConfigPath = UserConfigPath
163 self.RscriptsPath = ConstructRscriptsPath(AppliPath)
164 #self.DictPath = ConstructDicoPath(AppliPath)
165 self.DictPath = ConstructDicoPath(UserConfigPath)
166 self.ConfigGlob = ConfigGlob
167 self.ConfigPath = ConstructConfigPath(UserConfigPath)
168 self.pref = RawConfigParser()
169 #workaround for import problem
170 self.SimiFromCluster = SimiFromCluster
172 mylocale = wx.Locale(wx.LANGUAGE_FRENCH)
173 mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
174 mylocale.AddCatalog('iramuteq')
175 presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
176 presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
180 # tell FrameManager to manage this frame
181 #self._mgr = wx.aui.AuiManager()
182 self._mgr = aui.AuiManager()
183 self._mgr.SetManagedWindow(self)
186 #--------------------------------------------------------------------------------
187 self.mb = wx.MenuBar()
189 file_menu = wx.Menu()
190 item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix"), _(u"Open a matrix"))
191 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
192 file_menu.AppendItem(item)
194 item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpora"), _(u"Open a text corpora"))
195 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
196 file_menu.AppendItem(item)
198 item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis"), _("Open an analysis"))
199 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
200 file_menu.AppendItem(item)
203 menuFactiva = wx.Menu()
204 fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml"))
205 fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail"))
206 fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste"))
207 menuFactiva.AppendItem(fact_from_xml)
208 menuFactiva.AppendItem(fact_from_mail)
209 menuFactiva.AppendItem(fact_from_txt)
210 file_menu.AppendMenu(-1, _(u"Import from factiva"), menuFactiva)
212 menuTools = wx.Menu()
213 splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable"))
214 extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods"))
215 menuTools.AppendItem(splitvar)
216 menuTools.AppendItem(extractmod)
217 self.ID_splitvar = splitvar.GetId()
218 self.ID_extractmod = extractmod.GetId()
219 file_menu.AppendMenu(-1, _(u"Tools"), menuTools)
222 item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as..."), _(u"Save tab as..."))
223 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
224 file_menu.AppendItem(item)
226 file_menu.Append(wx.ID_EXIT, _(u"Exit"))
228 edit_menu = wx.Menu()
229 edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences'))
231 view_menu = wx.Menu()
232 view_menu.Append(ID_ACCEUIL, _(u"Home page"))
233 view_menu.Append(ID_VIEWDATA, _(u"Show data"))
234 view_menu.Append(ID_RESULT, _(u'Show results'))
235 #view_menu.AppendSeparator()
237 analyse_menu = wx.Menu()
238 analyse_menu.Append(ID_Freq, u"Fréquences")
239 analyse_menu.Append(ID_Chi2, u"Chi2")
240 #analyse_menu.Append(ID_Student, u"t de Student")
241 menu_classif = wx.Menu()
242 menu_classif.Append(ID_CHDAlceste, u"Méthode GNEPA")
243 menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
244 analyse_menu.AppendMenu(-1, u"Classification", menu_classif)
245 analyse_menu.Append(ID_AFCM, u"AFCM")
246 analyse_menu.Append(ID_SIMI, u"Analyse de similitudes")
247 ID_RCODE = wx.NewId()
248 analyse_menu.Append(ID_RCODE, u"Code R...")
250 text_menu = wx.Menu()
251 #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
252 text_menu.Append(ID_TEXTSTAT, u"Statistiques textuelles")
253 text_menu.Append(ID_ASLEX, u"Spécificités et AFC")
254 #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
255 menu_classiftxt = wx.Menu()
256 menu_classiftxt.Append(ID_TEXTALCESTE, u"Méthode GNEPA")
257 menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
258 text_menu.AppendMenu(-1, u"Classification", menu_classiftxt)
259 text_menu.Append(ID_SimiTxt, u'Analyse de similitude')
261 text_menu.Append(ID_WC, u'Nuage de mots')
263 help_menu = wx.Menu()
264 help_menu.Append(wx.ID_ABOUT, u'À propos...')
265 help_menu.Append(wx.ID_HELP, u'Aide en ligne')
267 self.mb.Append(file_menu, _(u"File"))
268 self.mb.Append(edit_menu, _(u"Edition"))
269 self.mb.Append(view_menu, _(u"View"))
270 self.mb.Append(analyse_menu, _("Spreadsheet analysis"))
271 self.mb.Append(text_menu, _(u"Text analysis"))
272 self.mb.Append(help_menu, _(u"Help"))
274 self.SetMenuBar(self.mb)
275 #--------------------------------------------------------------------
276 self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
277 self.statusbar.SetStatusWidths([-2, -3])
278 self.statusbar.SetStatusText(u"Prêt", 0)
279 self.statusbar.SetStatusText(u"Bienvenue", 1)
281 # min size for the frame itself isn't completely done.
282 # see the end up FrameManager::Update() for the test
283 # code. For now, just hard code a frame minimum size
284 self.SetMinSize(wx.Size(400, 400))
286 # create some toolbars
287 tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
288 wx.TB_FLAT | wx.TB_NODIVIDER)
289 tb1.SetToolBitmapSize(wx.Size(16, 16))
290 tb1.AddLabelTool(ID_OpenData, "OpenData", wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, wx.Size(16, 16)), shortHelp="Questionnaire", longHelp="Ouvrir un questionnaire")
292 tb1.AddLabelTool(ID_OpenText, "OpenText", wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, wx.Size(16, 16)), shortHelp="Texte", longHelp="Ouvrir un corpus texte")
296 #------------------------------------------------------------------------------------------------
298 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)
300 #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
301 # Name("Text").CenterPane())
302 self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
303 Name("Text").CenterPane())
304 #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
306 self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
308 #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
309 # with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
311 self.history = History(os.path.join(UserConfigPath, 'history.db'))
312 self.tree = LeftTree(self)
313 self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption("Navigateur").
314 Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
315 MinimizeButton(True))
317 #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)
318 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)
319 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
320 self.nb.SetAGWWindowStyleFlag(notebook_flags)
321 self.nb.SetArtProvider(aui.ChromeTabArt())
322 #self.nb.SetArtProvider(aui.VC8TabArt())
323 #self.nb.parent = self
324 #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
325 #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
326 # Name("Tab_content").
328 self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
331 self.Sheet = MySheet(self)
332 #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
333 self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
334 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
335 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
336 # add the toolbars to the manager
338 #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
339 # Name("tb1").Caption("Fichiers").
340 # ToolbarPane().Top().
341 # LeftDockable(False).RightDockable(False))
342 self._mgr.AddPane(tb1, aui.AuiPaneInfo().
343 Name("tb1").Caption("Fichiers").
345 LeftDockable(True).RightDockable(False))
347 self.ShowAPane("Intro_Text")
348 self._mgr.GetPane("lefttree").Show()
349 self._mgr.GetPane("classif_tb").Hide()
350 # "commit" all changes made to FrameManager
353 # Show How To Use The Closing Panes Event
354 ##################################################################
355 self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
356 self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
357 self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
358 self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
359 self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
360 self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
361 self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
362 self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
363 self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
364 self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
365 self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
366 self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
367 self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
368 self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
369 self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
370 self.Bind(wx.EVT_MENU, self.OnCHDAlceste, id=ID_CHDAlceste)
371 self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
372 self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
373 #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
374 self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
375 self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
376 self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
377 self.Bind(wx.EVT_MENU, self.OnTextAlceste, id=ID_TEXTALCESTE)
378 self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
379 self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
380 self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
381 self.Bind(wx.EVT_MENU, self.OnSimi, id=ID_SIMI)
382 self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
383 self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
384 self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
385 self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
386 self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
387 self.Bind(wx.EVT_CLOSE, self.OnClose)
388 ##################################################################
389 flags = self._mgr.GetAGWFlags()
390 #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
391 #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
392 #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
393 flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
394 self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
395 self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
396 self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
399 self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
400 self.SetIcon(self._icon)
401 ##########################
403 self.input_path = [False]
404 self.TEMPDIR = tempfile.mkdtemp('iramuteq')
405 self.FileTabList = []
411 self.g_header = False
418 self.SysEncoding = sys.getdefaultencoding()
419 self.syscoding = sys.getdefaultencoding()
420 #print 'SysEncoding',self.SysEncoding
421 if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
424 ##############################################################@
425 self.DisEnSaveTabAs(False)
426 self.ShowMenu(_("View"), False)
427 self.ShowMenu(_("Spreadsheet analysis"), False)
428 self.ShowMenu(_("Text analysis"), False)
439 def finish_init(self) :
441 self.pref.read(self.ConfigPath['preferences'])
450 self.pref.read(self.ConfigPath['preferences'])
452 self.sound = self.pref.getboolean('iramuteq', 'sound')
453 self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
454 self.version = ConfigGlob.get('DEFAULT', 'version')
455 #configuration des chemins de R
456 self.PathPath = ConfigParser()
457 self.PathPath.read(ConfigPath['path'])
459 if not CheckRPath(self.PathPath) :
460 if sys.platform == 'win32':
461 BestRPath = FindRPAthWin32()
463 BestRPath = FindRPathNix()
465 self.PathPath.set('PATHS', 'rpath', BestRPath)
466 with open(ConfigPath['path'], 'w') as f :
467 self.PathPath.write(f)
471 self.RPath = self.PathPath.get('PATHS', 'rpath')
474 if not RLibsAreInstalled(self) :
478 Le chemin de l'executable de R n'a pas été trouvé.
479 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
480 Si R n'est pas installé dans le répertoire par défaut
481 (souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
482 vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
483 dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
485 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
490 def OnVerif(self, evt) :
491 pack = CheckRPackages(self)
493 dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
495 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
498 #FIXME marche pas sous mac ?
499 def DisEnSaveTabAs(self, DISEN):
501 file_menu = self.mb.GetMenu(0)
502 items = file_menu.GetMenuItems()
504 if item.GetId() == ID_SaveTab :
507 def ShowMenu(self, menu, Show=True):
508 menu_pos = self.mb.FindMenu(menu)
509 self.mb.EnableTop(menu_pos, Show)
510 self.mb.UpdateMenus()
513 #--------------------------------------------------------------------
514 def OnClose(self, event):
516 with open(self.ConfigPath['path'], 'w') as f :
517 self.PathPath.write(f)
518 if self.DictTab != {} :
519 savestates = [self.DictTab[item][0] for item in self.DictTab]
520 if False in savestates :
521 notsave = [item for item in self.DictTab if self.DictTab[item][0] == False]
523 Certains résultats ne sont pas enregistrés.
524 Voulez-vous fermer quand même ?"""
525 dlg = wx.MessageDialog(self, msg, "Sauvegarde",
526 wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
528 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
533 for item in notsave :
534 for tmpfile in self.DictTab[item][1:] :
536 print 'remove : ' + tmpfile
548 #if sys.platform == 'win32' :
549 # os.system("taskkill /im iramuteq.exe /f")
550 # print 'meurtre de process'
552 def OnOpenData(self, event):
553 inputname, self.input_path = OnOpen(self, "Data")
555 self.filename = self.input_path[0]
556 self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
557 get_table_param(self, self.input_path[0])
558 self.tableau.make_content()
559 self.tableau.show_tab()
561 def OnOpenAnalyse(self, event):
562 self.AnalysePath = OnOpen(self, "Analyse")
563 OpenAnalyse(self, self.AnalysePath[1][0], True)
564 self.ShowMenu(_("View"))
566 def OnOpenText(self, event):
567 inputname, self.input_path = OnOpen(self, "Texte")
568 self.filename = self.input_path[0]
572 def OnViewData(self, event):
575 if self.type == "Data":
576 if not self.DataPop :
577 self.Sheet.Populate(self.content)
580 self.ShowAPane(u"Data")
581 elif self.type == "Texte" or self.type == 'Analyse' :
582 if not self.DataTxt :
583 self.text_ctrl_txt.Clear()
584 self.text_ctrl_txt.write(self.content)
585 self.text_ctrl_txt.ShowPosition(0)
588 self.ShowAPane(u"Text")
592 #dial = EncodeDialog(self)
593 dlg = wx.ProgressDialog("Ouverture...",
594 "Veuillez patienter...",
597 style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
600 builder = Builder(self, dlg)
601 if builder.res == wx.ID_OK :
603 corpus = builder.doanalyse()
604 self.history.add(corpus.parametres)
605 self.tree.OnItemAppend(corpus.parametres)
606 OpenAnalyse(self, corpus.parametres)
609 #self.content = DoConf().totext(corpus.parametres)
610 # parametres = DoConf(os.path.join(UserConfigPath,'corpus.cfg')).getoptions('corpus')
611 # parametres['originalpath'] = self.filename
613 # parametres['pathout'] = PathOut(self.filename, 'corpus').dirout
614 # dial = CorpusPref(self, parametres)
615 # dial.CenterOnParent()
616 # dial.txtpath.SetLabel(self.filename)
617 # res = dial.ShowModal()
618 # parametres = dial.doparametres()
620 # ReadLexique(self, lang = parametres['lang'])
621 # self.expressions = ReadDicoAsDico(self.DictPath.get(parametres['lang'], 'french_exp'))
622 # corpus = BuildFromAlceste(self.filename, parametres, self.lexique, self.expressions).corpus
623 #self.corpus_encodage = dial.encodages[dial.list_encodages.GetSelection()][0]
624 #self.corpus_lang = dial.langues[dial.choice_dict.GetSelection()]
627 keepGoing = dlg.Update(count, u"Lecture du fichier")
628 # msg = u"Ce fichier ne semble pas être encodé en %s" % self.corpus_encodage
629 # dial = wx.MessageDialog(self, msg, u"Problème d'encodage", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
630 # dial.CenterOnParent()
631 # res = dial.ShowModal()
634 self.ShowMenu(_("View"))
635 self.ShowMenu(_("Text analysis"))
636 self.ShowMenu(_(u"Spreadsheet analysis"), False)
641 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
643 #self.OnViewData(wx.EVT_BUTTON)
645 def OnExit(self, event):
648 def OnAbout(self, event):
649 info = wx.AboutDialogInfo()
650 info.Name = ConfigGlob.get('DEFAULT', 'name')
651 info.Version = ConfigGlob.get('DEFAULT', 'version')
652 info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
653 info.Description = u"""
654 Interface de R pour les Analyses Multidimensionnelles
655 de Textes et de Questionnaires
658 construit avec des logiciels libres.
664 info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
665 dev = ConfigGlob.get('DEFAULT', 'dev').split(';')
666 info.Developers = dev
667 info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier
668 suivant les termes de la Licence Publique Générale GNU telle que publiée
669 par la Free Software Foundation ; soit la version 2 de cette licence,
670 soit (à votre convenance) une version ultérieure.
672 Iramuteq est diffusé dans l'espoir qu'il sera utile,
673 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite
674 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER.
675 Voyez la Licence Publique Générale GNU pour plus de détails.
677 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
678 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
679 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
682 def GetDockArt(self):
683 return self._mgr.GetArtProvider()
688 def OnPageChanged(self, event) :
689 new = event.GetSelection()
690 nobject = event.GetEventObject()
691 parent = nobject.GetParent()
692 if isinstance(parent, IraFrame) :
693 npage = self.nb.GetPage(new)
694 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
696 def OnCloseTab(self, evt):
697 #log.info('Closing tab %s' % str(evt.GetEventObject()))
698 ctrl = evt.GetEventObject()
699 if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
703 page = self.nb.GetPage(self.nb.GetSelection())
704 if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
705 self.history.rmtab(page.parametres)
706 self.tree.CloseItem(uuid = page.parametres['uuid'])
707 TabTitle = self.nb.GetPageText(self.nb.GetSelection())
708 if self.DictTab != {} :
709 if TabTitle in self.DictTab :
710 ListFile=self.DictTab[TabTitle]
711 if False in ListFile:
713 Certains résultats ne sont pas enregistrer.
714 Voulez-vous fermer quand même ?"""
715 dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
718 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
723 for f in ListFile[1:] :
728 elif True in ListFile :
731 del self.DictTab[TabTitle]
736 if self.nb.GetPageCount() == 1 and remove and not notebook :
739 def LastTabClose(self) :
740 if self.nb.GetPageCount() == 1 :
741 self.DisEnSaveTabAs(False)
743 self.ShowAPane("Text")
745 self.ShowAPane("Data")
747 self.ShowAPane("Intro_Text")
749 def OnSaveTabAs(self, event):
750 SelectTab = self.nb.GetSelection()
751 TabTitle = self.nb.GetPageText(SelectTab)
752 FileToSave = self.DictTab[TabTitle]
755 self, message="Enregistrer sous...", defaultDir=os.getcwd(),
756 defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
758 dlg.SetFilterIndex(2)
761 if dlg.ShowModal() == wx.ID_OK:
763 Dirname = os.path.dirname(Path)
764 Filename = dlg.GetFilename()
769 shutil.copyfile(FileToSave[-1], Path)
770 os.remove(FileToSave[len(FileToSave) - 1])
771 NewListFile.append(True)
772 NewListFile.append(Path)
773 for f in FileToSave[1:-1] :
774 Fileout = os.path.join(Dirname, os.path.basename(f))
775 shutil.copyfile(f, Fileout)
776 NewListFile.append(Fileout)
779 self.DictTab[TabText] = NewListFile
780 del self.DictTab[TabTitle]
781 self.nb.SetPageText(SelectTab, TabText)
783 def GetStartPosition(self):
787 pt = self.ClientToScreen(wx.Point(0, 0))
789 return wx.Point(pt.x + x, pt.y + x)
791 def ShowAPane(self, panel):
792 for pane in self._mgr.GetAllPanes() :
793 if not pane.IsToolbar() and pane.name != 'lefttree':
795 self._mgr.GetPane(panel).Show()
798 def OnAcceuil(self, event):
799 self.ShowAPane(u"Intro_Text")
802 def CreateHTMLCtrl(self):
803 ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
804 if "gtk2" in wx.PlatformInfo:
805 ctrl.SetStandardFonts()
806 ctrl.SetPage(u"text")
809 def ShowTab(self, evt):
810 self.ShowAPane("Tab_content")
812 ################################################################
814 ################################################################
816 def OnFreq(self, event):
822 def OnChi2(self, event):
824 # print('PAS DE DEBUG SUR CHI2')
825 chi = ChiSquare(self)
829 def OnStudent(self, event):
835 def OnRCode(self, event):
841 def OnCHDSIM(self, event):
843 # print 'ATTENTION!!!!'
844 chdsim = ChdCluster(self)
845 if chdsim.val == wx.ID_OK:
850 def OnCHDAlceste(self, event):
852 # print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
853 self.quest = AnalyseQuest(self)
854 if self.quest.val == wx.ID_OK:
859 def OnSimiTxt(self, evt, corpus = None) :
860 # print 'PLUS DE BUG SUR SIMITXT'
862 #self.Text = SimiTxt(self)
864 corpus = self.tree.getcorpus()
865 self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = progressbar(self, 3))
866 if self.Text.val == wx.ID_OK :
871 def OnWordCloud(self, evt, corpus = None) :
872 # print 'PLUS DE BUG SUR WORDCLOUD'
875 corpus = self.tree.getcorpus()
876 self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = progressbar(self, 3))
877 if self.Text.val == wx.ID_OK :
883 def OnAFCM(self, event):
889 # def OnCheckcorpus(self, evt):
895 def OnTextStat(self, event, corpus = None):
896 print 'PAS DE BUG SUR TEXT STAT'
899 corpus = self.tree.getcorpus()
900 self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7))
902 if self.Text.val == wx.ID_OK :
907 def OnTextSpec(self, event, corpus = None):
909 #self.Text = AsLexico(self)
910 print('ATTENTION : PLUS DE BUG SUR LEXICO')
912 corpus = self.tree.getcorpus()
913 self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
914 if self.Text.val == wx.ID_OK :
919 def OnTextAfcm(self, event):
926 def import_factiva_xml(self,event):
928 ImportFactiva(self, 'xml')
932 def import_factiva_mail(self, evt) :
934 ImportFactiva(self, 'mail')
938 def import_factiva_txt(self, evt) :
940 ImportFactiva(self, 'txt')
944 def ExtractTools(self, evt) :
946 if ID == self.ID_splitvar :
947 Extract(self, 'splitvar')
949 Extract(self, 'mods')
951 def OnTextAlceste(self, event, corpus = None):
953 #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
954 #RunAnalyse(self, corpus, Alceste, OptAlceste)
956 corpus = self.tree.getcorpus()
957 self.Text = Alceste(self, corpus, parametres = {'type': 'alceste'}, dlg = progressbar(self,6))
958 if self.Text.val == wx.ID_OK:
963 def OnPamSimple(self, event, corpus = None):
966 corpus = self.tree.getcorpus()
967 self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = progressbar(self,6))
968 if self.Text.val == wx.ID_OK:
973 def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
974 DoSimi(self, param = parametres, fromprof = fromprof, pathout = pathout, listactives = listactives, actives = actives, tableau = tableau)
976 def OnSimi(self,evt):
978 #print 'ATTENTION !!!! VERGES'
979 print 'PLUS DE BUG SUR SIMI'
980 self.res = DoSimi(self, param = None)
981 #self.res = Verges(self)
982 if self.res.val == wx.ID_OK :
986 #################################################################
988 def OnHelp(self, event):
989 webbrowser.open('http://www.iramuteq.org/documentation')
991 def OnPref(self, event):
992 dlg = PrefDialog(self)
994 self.val = dlg.ShowModal()
997 if self.check_update:
1000 print 'pas de verif'
1002 #CheckRPackages(self)
1004 def OnOpenFromCmdl(self):
1006 if options.filename :
1007 if os.path.exists(options.filename):
1008 self.filename = os.path.abspath(options.filename)
1012 if os.path.exists(os.path.realpath(args[0])):
1013 self.filename = os.path.abspath(os.path.realpath(args[0]))
1019 if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1020 self.tableau = Tableau(self, self.filename)
1021 get_table_param(self, self.filename)
1022 self.tableau.make_content()
1023 self.tableau.show_tab()
1024 #open_data(self, self.filename)
1025 elif os.path.splitext(self.filename)[1] == '.txt':
1027 elif os.path.splitext(self.filename)[1] == '.ira' :
1028 #self.corpus = Corpus(self)
1029 #self.Text = OpenAnalyse(self, self.filename)
1030 OpenAnalyse(self, self.filename)
1032 print 'ce fichier n\'existe pas'
1036 class IntroPanel(wx.Panel):
1037 def __init__(self, parent):
1038 wx.Panel.__init__(self, parent)
1039 #col = randint(0, 255)
1040 #col1 = randint(0,255)
1041 #col2 = randint(0,255)
1043 bckgrdcolor = wx.Colour(col, col, col)
1044 self.SetBackgroundColour(bckgrdcolor)
1045 txtcolour = wx.Colour(250, 250, 250)
1046 linkcolor = wx.Colour(255, 0, 0)
1047 sizer1 = wx.BoxSizer(wx.VERTICAL)
1048 sizer2 = wx.BoxSizer(wx.VERTICAL)
1049 sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1050 sizer4 = wx.BoxSizer(wx.VERTICAL)
1051 sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1052 grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1053 grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1054 grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1055 PanelPres = wx.Panel(self)
1056 PanelPres.SetBackgroundColour(bckgrdcolor)
1057 label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1058 label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1059 label_1.SetForegroundColour(wx.RED)
1060 label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1061 label2.SetForegroundColour(txtcolour)
1062 label2.SetBackgroundColour(bckgrdcolor)
1063 #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1064 #label3.SetForegroundColour(txtcolour)
1065 #label3.SetBackgroundColour(bckgrdcolor)
1066 self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1067 self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1068 self.hyper2.SetBackgroundColour(bckgrdcolor)
1069 self.hyper2.EnableRollover(True)
1070 self.hyper2.SetUnderlines(False, False, True)
1071 self.hyper2.SetBold(True)
1072 self.hyper2.UpdateLink()
1073 label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1074 label_lerass.SetForegroundColour(txtcolour)
1075 label_lerass.SetBackgroundColour(bckgrdcolor)
1076 self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1077 self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1078 self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1079 self.hyper_lerass.EnableRollover(True)
1080 self.hyper_lerass.SetUnderlines(False, False, True)
1081 self.hyper_lerass.SetBold(True)
1082 self.hyper_lerass.UpdateLink()
1083 blank = wx.StaticText(PanelPres, -1, u'\n')
1084 blank1 = wx.StaticText(PanelPres, -1, u'\n')
1085 labellicence = wx.StaticText(PanelPres, -1, u'Licence GNU GPL')
1086 labellicence.SetForegroundColour(txtcolour)
1087 labellicence.SetBackgroundColour(bckgrdcolor)
1088 labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1089 labelcopy.SetForegroundColour(txtcolour)
1090 labelcopy.SetBackgroundColour(bckgrdcolor)
1091 python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1092 r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1093 lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1094 but_python = wx.BitmapButton(self, -1, python_img)
1095 but_lexique = wx.BitmapButton(self, -1, lexique_img)
1096 but_r = wx.BitmapButton(self, -1, r_img)
1097 self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1098 self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1099 self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1102 #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1103 grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1104 grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1105 grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1106 sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1107 sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1108 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1109 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1110 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1111 sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1112 sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1113 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1114 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1115 sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1116 sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1117 sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1118 sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1119 PanelPres.SetSizer(sizer2)
1120 sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1121 sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1122 sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1123 grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1124 grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1125 grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1127 sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1128 sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1129 self.SetSizer(sizer1)
1132 def OnPython(self,evt):
1133 webbrowser.open('http://www.python.org')
1135 def OnLexique(self,evt):
1136 webbrowser.open('http://www.lexique.org')
1139 webbrowser.open('http://www.r-project.org')
1141 class MySplashScreen(wx.SplashScreen):
1143 bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1144 wx.SplashScreen.__init__(self, bmp,
1145 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1147 self.Bind(wx.EVT_CLOSE, self.OnClose)
1148 self.fc = wx.FutureCall(1, self.ShowMain)
1150 def OnClose(self, evt):
1154 if self.fc.IsRunning():
1159 frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(1100, 800))
1163 frame.OnOpenFromCmdl()
1164 # if self.fc.IsRunning():
1166 #wx.CallAfter(frame.ShowTip)
1168 class MyApp(wx.App):
1171 Create and show the splash screen. It will then create and show
1172 the main frame when it is time to do so.
1174 wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1175 self.SetAppName("Iramuteq")
1176 splash = MySplashScreen()
1184 if __name__ == '__main__':