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 PamTxt
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 Alceste")
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 Alceste")
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'
425 self.pref.read(self.ConfigPath['preferences'])
434 self.pref.read(self.ConfigPath['preferences'])
436 #configuration des chemins de R
437 self.PathPath = ConfigParser()
438 self.PathPath.read(ConfigPath['path'])
440 if not CheckRPath(self.PathPath) :
441 if sys.platform == 'win32':
442 BestRPath = FindRPAthWin32()
444 BestRPath = FindRPathNix()
446 self.PathPath.set('PATHS', 'rpath', BestRPath)
447 with open(ConfigPath['path'], 'w') as f :
448 self.PathPath.write(f)
452 self.RPath = self.PathPath.get('PATHS', 'rpath')
455 if not RLibsAreInstalled(self) :
459 Le chemin de l'executable de R n'a pas été trouvé.
460 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
461 Si R n'est pas installé dans le répertoire par défaut
462 (souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
463 vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
464 dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
466 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
472 self.sound = self.pref.getboolean('iramuteq', 'sound')
473 self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
474 self.version = ConfigGlob.get('DEFAULT', 'version')
477 ##############################################################@
478 self.DisEnSaveTabAs(False)
479 self.ShowMenu(_("View"), False)
480 self.ShowMenu(_("Spreadsheet analysis"), False)
481 self.ShowMenu(_("Text analysis"), False)
485 def OnVerif(self, evt) :
486 pack = CheckRPackages(self)
488 dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
490 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
493 #FIXME marche pas sous mac ?
494 def DisEnSaveTabAs(self, DISEN):
496 file_menu = self.mb.GetMenu(0)
497 items = file_menu.GetMenuItems()
499 if item.GetId() == ID_SaveTab :
502 def ShowMenu(self, menu, Show=True):
503 menu_pos = self.mb.FindMenu(menu)
504 self.mb.EnableTop(menu_pos, Show)
505 self.mb.UpdateMenus()
508 #--------------------------------------------------------------------
509 def OnClose(self, event):
511 with open(self.ConfigPath['path'], 'w') as f :
512 self.PathPath.write(f)
513 if self.DictTab != {} :
514 savestates = [self.DictTab[item][0] for item in self.DictTab]
515 if False in savestates :
516 notsave = [item for item in self.DictTab if self.DictTab[item][0] == False]
518 Certains résultats ne sont pas enregistrés.
519 Voulez-vous fermer quand même ?"""
520 dlg = wx.MessageDialog(self, msg, "Sauvegarde",
521 wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
523 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
528 for item in notsave :
529 for tmpfile in self.DictTab[item][1:] :
531 print 'remove : ' + tmpfile
543 #if sys.platform == 'win32' :
544 # os.system("taskkill /im iramuteq.exe /f")
545 # print 'meurtre de process'
547 def OnOpenData(self, event):
548 inputname, self.input_path = OnOpen(self, "Data")
550 self.filename = self.input_path[0]
551 self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
552 get_table_param(self, self.input_path[0])
553 self.tableau.make_content()
554 self.tableau.show_tab()
556 def OnOpenAnalyse(self, event):
557 self.AnalysePath = OnOpen(self, "Analyse")
558 OpenAnalyse(self, self.AnalysePath[1][0], True)
559 self.ShowMenu(_("View"))
561 def OnOpenText(self, event):
562 inputname, self.input_path = OnOpen(self, "Texte")
563 self.filename = self.input_path[0]
567 def OnViewData(self, event):
570 if self.type == "Data":
571 if not self.DataPop :
572 self.Sheet.Populate(self.content)
575 self.ShowAPane(u"Data")
576 elif self.type == "Texte" or self.type == 'Analyse' :
577 if not self.DataTxt :
578 self.text_ctrl_txt.Clear()
579 self.text_ctrl_txt.write(self.content)
580 self.text_ctrl_txt.ShowPosition(0)
583 self.ShowAPane(u"Text")
587 #dial = EncodeDialog(self)
588 dlg = wx.ProgressDialog("Ouverture...",
589 "Veuillez patienter...",
592 style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
595 builder = Builder(self, dlg)
596 if builder.res == wx.ID_OK :
598 corpus = builder.doanalyse()
599 self.history.add(corpus.parametres)
600 self.tree.OnItemAppend(corpus.parametres)
601 OpenAnalyse(self, corpus.parametres)
604 #self.content = DoConf().totext(corpus.parametres)
605 # parametres = DoConf(os.path.join(UserConfigPath,'corpus.cfg')).getoptions('corpus')
606 # parametres['originalpath'] = self.filename
608 # parametres['pathout'] = PathOut(self.filename, 'corpus').dirout
609 # dial = CorpusPref(self, parametres)
610 # dial.CenterOnParent()
611 # dial.txtpath.SetLabel(self.filename)
612 # res = dial.ShowModal()
613 # parametres = dial.doparametres()
615 # ReadLexique(self, lang = parametres['lang'])
616 # self.expressions = ReadDicoAsDico(self.DictPath.get(parametres['lang'], 'french_exp'))
617 # corpus = BuildFromAlceste(self.filename, parametres, self.lexique, self.expressions).corpus
618 #self.corpus_encodage = dial.encodages[dial.list_encodages.GetSelection()][0]
619 #self.corpus_lang = dial.langues[dial.choice_dict.GetSelection()]
622 keepGoing = dlg.Update(count, u"Lecture du fichier")
623 # msg = u"Ce fichier ne semble pas être encodé en %s" % self.corpus_encodage
624 # dial = wx.MessageDialog(self, msg, u"Problème d'encodage", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
625 # dial.CenterOnParent()
626 # res = dial.ShowModal()
629 self.ShowMenu(_("View"))
630 self.ShowMenu(_("Text analysis"))
631 self.ShowMenu(_(u"Spreadsheet analysis"), False)
636 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
638 #self.OnViewData(wx.EVT_BUTTON)
640 def OnExit(self, event):
643 def OnAbout(self, event):
644 info = wx.AboutDialogInfo()
645 info.Name = ConfigGlob.get('DEFAULT', 'name')
646 info.Version = ConfigGlob.get('DEFAULT', 'version')
647 info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
648 info.Description = u"""
649 Interface de R pour les Analyses Multidimensionnelles
650 de Textes et de Questionnaires
653 construit avec des logiciels libres.
659 info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
660 dev = ConfigGlob.get('DEFAULT', 'dev').split(';')
661 info.Developers = dev
662 info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier
663 suivant les termes de la Licence Publique Générale GNU telle que publiée
664 par la Free Software Foundation ; soit la version 2 de cette licence,
665 soit (à votre convenance) une version ultérieure.
667 Iramuteq est diffusé dans l'espoir qu'il sera utile,
668 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite
669 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER.
670 Voyez la Licence Publique Générale GNU pour plus de détails.
672 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
673 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
674 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
677 def GetDockArt(self):
678 return self._mgr.GetArtProvider()
683 def OnPageChanged(self, event) :
684 new = event.GetSelection()
685 nobject = event.GetEventObject()
686 parent = nobject.GetParent()
687 if isinstance(parent, IraFrame) :
688 npage = self.nb.GetPage(new)
689 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
691 def OnCloseTab(self, evt):
692 #log.info('Closing tab %s' % str(evt.GetEventObject()))
693 ctrl = evt.GetEventObject()
694 if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
698 page = self.nb.GetPage(self.nb.GetSelection())
699 if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
700 self.history.rmtab(page.parametres)
701 self.tree.CloseItem(uuid = page.parametres['uuid'])
702 TabTitle = self.nb.GetPageText(self.nb.GetSelection())
703 if self.DictTab != {} :
704 if TabTitle in self.DictTab :
705 ListFile=self.DictTab[TabTitle]
706 if False in ListFile:
708 Certains résultats ne sont pas enregistrer.
709 Voulez-vous fermer quand même ?"""
710 dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
713 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
718 for f in ListFile[1:] :
723 elif True in ListFile :
726 del self.DictTab[TabTitle]
731 if self.nb.GetPageCount() == 1 and remove and not notebook :
734 def LastTabClose(self) :
735 if self.nb.GetPageCount() == 1 :
736 self.DisEnSaveTabAs(False)
738 self.ShowAPane("Text")
740 self.ShowAPane("Data")
742 self.ShowAPane("Intro_Text")
744 def OnSaveTabAs(self, event):
745 SelectTab = self.nb.GetSelection()
746 TabTitle = self.nb.GetPageText(SelectTab)
747 FileToSave = self.DictTab[TabTitle]
750 self, message="Enregistrer sous...", defaultDir=os.getcwd(),
751 defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
753 dlg.SetFilterIndex(2)
756 if dlg.ShowModal() == wx.ID_OK:
758 Dirname = os.path.dirname(Path)
759 Filename = dlg.GetFilename()
764 shutil.copyfile(FileToSave[-1], Path)
765 os.remove(FileToSave[len(FileToSave) - 1])
766 NewListFile.append(True)
767 NewListFile.append(Path)
768 for f in FileToSave[1:-1] :
769 Fileout = os.path.join(Dirname, os.path.basename(f))
770 shutil.copyfile(f, Fileout)
771 NewListFile.append(Fileout)
774 self.DictTab[TabText] = NewListFile
775 del self.DictTab[TabTitle]
776 self.nb.SetPageText(SelectTab, TabText)
778 def GetStartPosition(self):
782 pt = self.ClientToScreen(wx.Point(0, 0))
784 return wx.Point(pt.x + x, pt.y + x)
786 def ShowAPane(self, panel):
787 for pane in self._mgr.GetAllPanes() :
788 if not pane.IsToolbar() and pane.name != 'lefttree':
790 self._mgr.GetPane(panel).Show()
793 def OnAcceuil(self, event):
794 self.ShowAPane(u"Intro_Text")
797 def CreateHTMLCtrl(self):
798 ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
799 if "gtk2" in wx.PlatformInfo:
800 ctrl.SetStandardFonts()
801 ctrl.SetPage(u"text")
804 def ShowTab(self, evt):
805 self.ShowAPane("Tab_content")
807 ################################################################
809 ################################################################
811 def OnFreq(self, event):
817 def OnChi2(self, event):
819 # print('PAS DE DEBUG SUR CHI2')
820 chi = ChiSquare(self)
824 def OnStudent(self, event):
830 def OnRCode(self, event):
836 def OnCHDSIM(self, event):
838 # print 'ATTENTION!!!!'
839 chdsim = ChdCluster(self)
840 if chdsim.val == wx.ID_OK:
845 def OnCHDAlceste(self, event):
847 # print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
848 self.quest = AnalyseQuest(self)
849 if self.quest.val == wx.ID_OK:
854 def OnSimiTxt(self, evt, corpus = None) :
855 # print 'PLUS DE BUG SUR SIMITXT'
857 #self.Text = SimiTxt(self)
859 corpus = self.tree.getcorpus()
860 self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = progressbar(self, 3))
861 if self.Text.val == wx.ID_OK :
866 def OnWordCloud(self, evt, corpus = None) :
867 # print 'PLUS DE BUG SUR WORDCLOUD'
870 corpus = self.tree.getcorpus()
871 self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = progressbar(self, 3))
872 if self.Text.val == wx.ID_OK :
878 def OnAFCM(self, event):
884 def OnCheckcorpus(self, evt):
890 def OnTextStat(self, event, corpus = None):
891 print 'PAS DE BUG SUR TEXT STAT'
894 corpus = self.tree.getcorpus()
895 self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7))
897 if self.Text.val == wx.ID_OK :
902 def OnTextSpec(self, event, corpus = None):
904 #self.Text = AsLexico(self)
905 print('ATTENTION : PLUS DE BUG SUR LEXICO')
907 corpus = self.tree.getcorpus()
908 self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
909 if self.Text.val == wx.ID_OK :
914 def OnTextAfcm(self, event):
921 def import_factiva_xml(self,event):
923 ImportFactiva(self, 'xml')
927 def import_factiva_mail(self, evt) :
929 ImportFactiva(self, 'mail')
933 def import_factiva_txt(self, evt) :
935 ImportFactiva(self, 'txt')
939 def ExtractTools(self, evt) :
941 if ID == self.ID_splitvar :
942 Extract(self, 'splitvar')
944 Extract(self, 'mods')
946 def OnTextAlceste(self, event, corpus = None):
948 #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
949 #RunAnalyse(self, corpus, Alceste, OptAlceste)
951 corpus = self.tree.getcorpus()
952 self.Text = Alceste(self, corpus, parametres = {'type': 'alceste'}, dlg = progressbar(self,6))
953 if self.Text.val == wx.ID_OK:
958 def OnPamSimple(self, event):
960 self.Text = PamTxt(self)
961 if self.Text.val == wx.ID_OK:
966 def OnSimi(self,evt):
968 #print 'ATTENTION !!!! VERGES'
969 self.res = DoSimi(self, param = None)
970 #self.res = Verges(self)
971 if self.res.val == wx.ID_OK :
975 #################################################################
977 def OnHelp(self, event):
978 webbrowser.open('http://www.iramuteq.org/documentation')
980 def OnPref(self, event):
981 dlg = PrefDialog(self)
983 self.val = dlg.ShowModal()
986 if self.check_update:
991 #CheckRPackages(self)
993 def OnOpenFromCmdl(self):
995 if options.filename :
996 if os.path.exists(options.filename):
997 self.filename = os.path.abspath(options.filename)
1001 if os.path.exists(os.path.realpath(args[0])):
1002 self.filename = os.path.abspath(os.path.realpath(args[0]))
1008 if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1009 self.tableau = Tableau(self, self.filename)
1010 get_table_param(self, self.filename)
1011 self.tableau.make_content()
1012 self.tableau.show_tab()
1013 #open_data(self, self.filename)
1014 elif os.path.splitext(self.filename)[1] == '.txt':
1016 elif os.path.splitext(self.filename)[1] == '.ira' :
1017 #self.corpus = Corpus(self)
1018 #self.Text = OpenAnalyse(self, self.filename)
1019 OpenAnalyse(self, self.filename)
1021 print 'ce fichier n\'existe pas'
1025 class IntroPanel(wx.Panel):
1026 def __init__(self, parent):
1027 wx.Panel.__init__(self, parent)
1028 #col = randint(0, 255)
1029 #col1 = randint(0,255)
1030 #col2 = randint(0,255)
1032 bckgrdcolor = wx.Colour(col, col, col)
1033 self.SetBackgroundColour(bckgrdcolor)
1034 txtcolour = wx.Colour(250, 250, 250)
1035 linkcolor = wx.Colour(255, 0, 0)
1036 sizer1 = wx.BoxSizer(wx.VERTICAL)
1037 sizer2 = wx.BoxSizer(wx.VERTICAL)
1038 sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1039 sizer4 = wx.BoxSizer(wx.VERTICAL)
1040 sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1041 grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1042 grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1043 grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1044 PanelPres = wx.Panel(self)
1045 PanelPres.SetBackgroundColour(bckgrdcolor)
1046 label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1047 label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1048 label_1.SetForegroundColour(wx.RED)
1049 label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1050 label2.SetForegroundColour(txtcolour)
1051 label2.SetBackgroundColour(bckgrdcolor)
1052 #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1053 #label3.SetForegroundColour(txtcolour)
1054 #label3.SetBackgroundColour(bckgrdcolor)
1055 self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1056 self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1057 self.hyper2.SetBackgroundColour(bckgrdcolor)
1058 self.hyper2.EnableRollover(True)
1059 self.hyper2.SetUnderlines(False, False, True)
1060 self.hyper2.SetBold(True)
1061 self.hyper2.UpdateLink()
1062 label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1063 label_lerass.SetForegroundColour(txtcolour)
1064 label_lerass.SetBackgroundColour(bckgrdcolor)
1065 self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1066 self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1067 self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1068 self.hyper_lerass.EnableRollover(True)
1069 self.hyper_lerass.SetUnderlines(False, False, True)
1070 self.hyper_lerass.SetBold(True)
1071 self.hyper_lerass.UpdateLink()
1072 blank = wx.StaticText(PanelPres, -1, u'\n')
1073 blank1 = wx.StaticText(PanelPres, -1, u'\n')
1074 labellicence = wx.StaticText(PanelPres, -1, u'Licence GNU GPL')
1075 labellicence.SetForegroundColour(txtcolour)
1076 labellicence.SetBackgroundColour(bckgrdcolor)
1077 labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1078 labelcopy.SetForegroundColour(txtcolour)
1079 labelcopy.SetBackgroundColour(bckgrdcolor)
1080 python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1081 r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1082 lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1083 but_python = wx.BitmapButton(self, -1, python_img)
1084 but_lexique = wx.BitmapButton(self, -1, lexique_img)
1085 but_r = wx.BitmapButton(self, -1, r_img)
1086 self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1087 self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1088 self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1091 #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1092 grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1093 grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1094 grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1095 sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1096 sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1097 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1098 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1099 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1100 sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1101 sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1102 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1103 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1104 sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1105 sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1106 sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1107 sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1108 PanelPres.SetSizer(sizer2)
1109 sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1110 sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1111 sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1112 grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1113 grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1114 grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1116 sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1117 sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1118 self.SetSizer(sizer1)
1121 def OnPython(self,evt):
1122 webbrowser.open('http://www.python.org')
1124 def OnLexique(self,evt):
1125 webbrowser.open('http://www.lexique.org')
1128 webbrowser.open('http://www.r-project.org')
1130 class MySplashScreen(wx.SplashScreen):
1132 bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1133 wx.SplashScreen.__init__(self, bmp,
1134 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1136 self.Bind(wx.EVT_CLOSE, self.OnClose)
1137 self.fc = wx.FutureCall(1, self.ShowMain)
1139 def OnClose(self, evt):
1143 if self.fc.IsRunning():
1148 frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(1100, 800))
1151 frame.OnOpenFromCmdl()
1152 # if self.fc.IsRunning():
1154 #wx.CallAfter(frame.ShowTip)
1156 class MyApp(wx.App):
1159 Create and show the splash screen. It will then create and show
1160 the main frame when it is time to do so.
1162 wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1163 self.SetAppName("Iramuteq")
1164 splash = MySplashScreen()
1172 if __name__ == '__main__':