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()
20 from random import randint
21 from ConfigParser import ConfigParser, RawConfigParser
25 #------------------------------------
27 import wx.lib.agw.aui as aui
30 import wx.lib.hyperlink as hl
31 #------------------------------------
32 from functions import BugReport, PlaySound, History
33 from checkversion import NewVersion
34 from guifunct import *
35 from tableau import Tableau
36 from dialog import PrefDialog
37 from tabfrequence import Frequences, FreqMultiple
38 from tabchi2 import ChiSquare
39 #from tabstudent import MakeStudent
40 from tabchddist import ChdCluster
41 from tabafcm import DoAFCM
42 from tabchdalc import AnalyseQuest
43 from tabsimi import DoSimi
44 from tabrsimple import InputText
45 from tabverges import Prototypical
46 from tabsplitvar import SplitMatrixFromVar
47 #from textdist import AnalysePam
48 from textstat import Stat
49 from textaslexico import Lexico
50 from textsimi import SimiTxt, SimiFromCluster
51 from textwordcloud import WordCloud, ClusterCloud
52 from textreinert import Reinert
53 #from textcheckcorpus import checkcorpus
54 from openanalyse import OpenAnalyse
55 from corpus import Builder, SubBuilder
56 from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
57 from chemins import RscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
58 from parse_factiva_xml import ImportFactiva
59 from tools import Extract
61 from tree import LeftTree
62 ##########################################################
63 ID_OpenData = wx.NewId()
64 ID_Import = wx.NewId()
65 ID_OpenText = wx.NewId()
66 ID_OnOpenAnalyse = wx.NewId()
69 ID_Student = wx.NewId()
70 ID_CHDSIM = wx.NewId()
71 ID_CHDReinert = wx.NewId()
72 ID_TEXTAFCM = wx.NewId()
73 ID_TEXTSTAT = wx.NewId()
75 ID_TEXTREINERT = wx.NewId()
76 ID_TEXTPAM = wx.NewId()
77 ID_CHECKCORPUS = wx.NewId()
78 ID_Tabcontent = wx.NewId()
81 ID_CloseTab = wx.NewId()
82 ID_SaveTab = wx.NewId()
83 ID_CreateText = wx.NewId()
84 ID_ACCEUIL = wx.NewId()
85 ID_RESULT = wx.NewId()
86 ID_VIEWDATA = wx.NewId()
87 ID_HTMLcontent = wx.NewId()
88 ID_SimiTxt = wx.NewId()
90 ID_ImportTXM = wx.NewId()
91 ID_FreqMulti = wx.NewId()
92 ID_Splitfromvar = wx.NewId()
93 ID_Subtxtfrommeta = wx.NewId()
94 ID_Subtxtfromthem = wx.NewId()
96 ID_ImportEuro = wx.NewId()
97 ##########################################################
98 #elements de configuration
99 ##########################################################
101 if sys.platform == 'darwin' :
102 sys.setdefaultencoding('UTF-8')
103 wx.SetDefaultPyEncoding('UTF-8')
105 sys.setdefaultencoding(locale.getpreferredencoding())
107 #chemin de l'application
108 AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0])))
110 ImagePath = os.path.join(AppliPath, 'images')
111 #configuration generale
112 DictConfigPath = ConstructGlobalPath(AppliPath)
113 ConfigGlob = ConfigParser()
114 ConfigGlob.read(DictConfigPath['global'])
115 DefaultConf = ConfigParser()
116 DefaultConf.read(DictConfigPath['preferences'])
117 #repertoire de l'utilisateur
118 if os.getenv('HOME') != None:
119 user_home = os.getenv('HOME')
121 user_home = os.getenv('HOMEPATH')
122 UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq'))
123 #Si pas de fichiers de config utilisateur, on cree le repertoire
124 CreateIraDirectory(UserConfigPath, AppliPath)
125 #fichiers log pour windows (py2exe)
126 log = logging.getLogger('iramuteq')
127 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
128 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
129 fh.setFormatter(formatter)
131 if sys.platform != 'win32' and sys.platform != 'darwin':
132 ch = logging.StreamHandler()
133 ch.setFormatter(formatter)
135 log.setLevel(logging.INFO)
137 class writer(object):
138 def write(self, data):
139 if data.strip() != '' :
140 log.info('ERROR : %s' % data)
142 class printer(object) :
143 def write(self, data) :
144 if data.strip() != '' :
145 log.info('Print : %s' % data)
147 sys.stderr = writer()
148 sys.stdout = printer()
150 ConfigPath = ConstructConfigPath(UserConfigPath)
152 langues = {'french' : wx.LANGUAGE_FRENCH,
153 'english' : wx.LANGUAGE_ENGLISH,
154 'portuguese' : wx.LANGUAGE_PORTUGUESE,
155 'italian' : wx.LANGUAGE_ITALIAN,
156 'spanish' : wx.LANGUAGE_SPANISH
159 code_langues = {'french' : 'fr_FR',
161 'portuguese' : 'pt_PT',
167 'textroot' : 'textroot.png',
168 'alceste' : 'reinert.png',
169 'corpus' : 'textcorpus.png',
170 'wordcloud' :'wordcloud.png',
172 'simitxt' : 'simitxt.png',
173 'clustersimitxt' :'clustersimitxt.png',
174 'clustercloud' : 'clustercloud.png',
176 'matroot' : 'matroot.png',
177 'matrix' : 'matrix.png',
178 'freq' : 'frequences.png',
179 'freqmulti' : 'frequences.png',
181 'reinertmatrix' : 'reinertmatrix.png',
182 'simimatrix' : 'simimatrix.png',
183 'simiclustermatrix' : 'simimatrix.png',
184 'proto' : 'proto.png',
186 'europress' : 'europress.png',
188 #####################################################################
190 class IraFrame(wx.Frame):
191 def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
192 size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE |
195 log.info('Starting...')
196 wx.Frame.__init__(self, parent, id, title, pos, size, style)
198 self.AppliPath = AppliPath
199 self.images_path = os.path.join(AppliPath,'images')
200 self.UserConfigPath = UserConfigPath
201 #self.RscriptsPath = ConstructRscriptsPath(AppliPath)
202 self.RscriptsPath = PathOut(dirout=os.path.join(AppliPath, 'Rscripts'))
203 self.RscriptsPath.basefiles(RscriptsPath)
204 #self.DictPath = ConstructDicoPath(AppliPath)
205 self.DictPath = ConstructDicoPath(UserConfigPath)
206 self.ConfigGlob = ConfigGlob
207 self.ConfigPath = ConstructConfigPath(UserConfigPath)
208 self.pref = RawConfigParser()
209 #workaround for import problem
210 self.SimiFromCluster = SimiFromCluster
212 gettext.install('iramuteq', os.path.join(AppliPath,'locale'), unicode=True)
213 #langues = ['fr_FR', 'en', 'pt_PT']
217 for langue in code_langues :
218 self.preslangue[langue] = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=[code_langues[langue]])
220 #self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
221 #self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
222 # tell FrameManager to manage this frame
223 #self._mgr = wx.aui.AuiManager()
224 self._mgr = aui.AuiManager()
225 self._mgr.SetManagedWindow(self)
228 #--------------------------------------------------------------------------------
229 self.images_analyses = images_analyses
230 for img in images_analyses :
231 self.images_analyses[img] = wx.Image(os.path.join(self.images_path, self.images_analyses[img]), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()
232 self.mb = wx.MenuBar()
234 file_menu = wx.Menu()
235 item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8'))
236 #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
237 item.SetBitmap(self.images_analyses['matroot'])
238 file_menu.AppendItem(item)
240 item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8'))
241 item.SetBitmap(self.images_analyses['textroot'])
242 file_menu.AppendItem(item)
244 item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
245 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, size = (16,16)))
246 file_menu.AppendItem(item)
249 menuFactiva = wx.Menu()
250 fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml").decode('utf8'))
251 fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
252 fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
253 menuFactiva.AppendItem(fact_from_xml)
254 menuFactiva.AppendItem(fact_from_mail)
255 menuFactiva.AppendItem(fact_from_txt)
256 file_menu.AppendMenu(-1, _(u"Import from factiva").decode('utf8'), menuFactiva)
258 item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8'))
259 item.SetBitmap(self.images_analyses['TXM'])
260 file_menu.AppendItem(item)
262 item = wx.MenuItem(file_menu, ID_ImportEuro, _(u"Import from Europress").decode('utf8'), _(u"Import from Europress").decode('utf8'))
263 item.SetBitmap(self.images_analyses['europress'])
264 file_menu.AppendItem(item)
266 menuTools = wx.Menu()
267 splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
268 extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
269 extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
270 menuTools.AppendItem(splitvar)
271 menuTools.AppendItem(extractmod)
272 menuTools.AppendItem(extractthem)
273 self.ID_splitvar = splitvar.GetId()
274 self.ID_extractmod = extractmod.GetId()
275 self.ID_extractthem = extractthem.GetId()
276 file_menu.AppendMenu(-1, _(u"Tools").decode('utf8'), menuTools)
279 #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
280 #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
281 #file_menu.AppendItem(item)
283 file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
285 edit_menu = wx.Menu()
286 pref = wx.MenuItem(edit_menu, wx.ID_PREFERENCES, _(u'Preferences').decode('utf8'))
287 pref.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_HELP_SETTINGS, size = (16,16)))
288 edit_menu.AppendItem(pref)
289 #edit_menu.Append(wx.ID_PREFERENCES, _(u'Preferences').decode('utf8'))
291 view_menu = wx.Menu()
292 view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
293 view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
294 view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
295 #view_menu.AppendSeparator()
296 matrix_menu = wx.Menu()
297 matanalyses = [[ID_Freq, _(u"Frequencies").decode('utf8'), 'freq'],
298 [ID_Freq, _(u"Multiple Frequencies").decode('utf8'), 'freqmulti'],
299 [ID_Chi2, _(u"Chi2").decode('utf8'), 'chi2'],
300 {'name' : _(u"Clustering").decode('utf8'),
301 'content' : [[ID_CHDReinert, _(u"Reinert's Method").decode('utf8'), 'reinertmatrix']]},
302 [ID_SIMI, _(u"Similarities Analysis").decode('utf8'), 'simimatrix'],
303 [ID_proto, _(u"Prototypical Analysis").decode('utf8'), 'proto'],
304 [ID_Splitfromvar, _(u"Split from variable").decode('utf8'), '']]
306 for analyse in matanalyses :
307 if not isinstance(analyse, dict) :
308 item = wx.MenuItem(matrix_menu, analyse[0], analyse[1])
309 item.SetBitmap(self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)))
310 matrix_menu.AppendItem(item)
313 for subana in analyse['content'] :
314 item = wx.MenuItem(nmenu, subana[0], subana[1])
315 item.SetBitmap(self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)))
316 nmenu.AppendItem(item)
317 matrix_menu.AppendMenu(-1, analyse['name'], nmenu)
318 #item = wx.MenuItem(matrix_menu, ID_Freq, _(u"Frequencies").decode('utf8'))
319 #item.SetBitmap(self.images_analyses['freq'])
320 #matrix_menu.AppendItem(item)
321 #matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
322 #item = wx.MenuItem(matrix_menu, ID_Freq, _(u"Multiple Frequencies").decode('utf8'))
323 #item.SetBitmap(self.images_analyses['freqmulti'])
324 #matrix_menu.Append(ID_FreqMulti, _(u'Multiple frequencies').decode('utf8'))
325 #matrix_menu.AppendItem(item)
326 #matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
327 #matrix_menu.Append(ID_Student, u"t de Student")
328 #menu_classif = wx.Menu()
329 #menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
330 #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
331 #matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
332 #matrix_menu.Append(ID_AFCM, u"AFCM")
333 #matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
334 #matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
335 ID_RCODE = wx.NewId()
336 #matrix_menu.Append(ID_RCODE, u"Code R...")
337 #menu_splittab = wx.Menu()
338 #ID_SPLITVAR = wx.NewId()
339 #splitvar = wx.MenuItem(menu_splittab, ID_SPLITVAR, _(u"Split from variable").decode('utf8'))
340 #menu_splittab.AppendItem(splitvar)
341 #matrix_menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), menu_splittab)
342 self.matrix_menu = matrix_menu
344 text_menu = wx.Menu()
345 analyses_text = [[ID_TEXTSTAT, _(u"Statistics").decode('utf8'), 'stat'],
346 [ID_ASLEX, _(u"Specificities and CA").decode('utf8'), 'spec'],
347 {'name' : _(u"Clustering").decode('utf8'),
348 'content' : [[ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'), 'alceste']]},
349 [ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'), 'simitxt'],
350 [ID_WC, _(u"WordCloud").decode('utf8'), 'wordcloud'],
351 {'name' : _(u"Sub corpus").decode('utf8'),
352 'content' : [[ID_Subtxtfrommeta, _(u'Sub corpus from metadata').decode('utf8'), None],
353 [ID_Subtxtfromthem, _(u'Sub corpus from thematic').decode('utf8'), None]]},
356 for analyse in analyses_text :
357 if not isinstance(analyse, dict) :
358 item = wx.MenuItem(text_menu, analyse[0], analyse[1])
359 item.SetBitmap(self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)))
360 text_menu.AppendItem(item)
363 for subana in analyse['content'] :
364 item = wx.MenuItem(nmenu, subana[0], subana[1])
365 item.SetBitmap(self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)))
366 nmenu.AppendItem(item)
367 text_menu.AppendMenu(-1, analyse['name'], nmenu)
368 #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
369 # text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
370 # text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
371 # #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
372 # menu_classiftxt = wx.Menu()
373 # menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
374 # #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
375 # text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
376 # text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'))
378 # text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
379 self.text_menu = text_menu
381 help_menu = wx.Menu()
382 help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
383 help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
385 self.mb.Append(file_menu, _(u"File").decode('utf8'))
386 self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
387 self.mb.Append(view_menu, _(u"View").decode('utf8'))
388 self.mb.Append(matrix_menu, _(u"Matrix analysis").decode('utf8'))
389 self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
390 self.mb.Append(help_menu, _(u"Help").decode('utf8'))
392 self.SetMenuBar(self.mb)
393 #--------------------------------------------------------------------
394 self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
395 self.statusbar.SetStatusWidths([-2, -3])
396 self.statusbar.SetStatusText(_(u"Ready").decode('utf8'), 0)
397 self.statusbar.SetStatusText(_(u"Welcome").decode('utf8'), 1)
399 # min size for the frame itself isn't completely done.
400 # see the end up FrameManager::Update() for the test
401 # code. For now, just hard code a frame minimum size
402 self.SetMinSize(wx.Size(400, 400))
404 # create some toolbars
405 tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
406 wx.TB_FLAT | wx.TB_NODIVIDER)
407 tb1.SetToolBitmapSize(wx.Size(16, 16))
408 tb1.AddLabelTool(ID_OpenData, "OpenData", self.images_analyses['matroot'], shortHelp=_(u"Matrix").decode('utf8'), longHelp=_(u"Open a matrix").decode('utf8'))
410 tb1.AddLabelTool(ID_OpenText, "OpenText", self.images_analyses['textroot'], shortHelp=_(u"Text").decode('utf8'), longHelp=_(u"Open a text corpus").decode('utf8'))
414 tb_text = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
415 wx.TB_FLAT | wx.TB_NODIVIDER)
416 for analyse in analyses_text :
417 if not isinstance(analyse, dict) :
418 tb_text.AddLabelTool(analyse[0], analyse[1], self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)), shortHelp = analyse[1], longHelp = analyse[1])
420 for subana in analyse['content'] :
421 tb_text.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1])
424 tb_mat = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
425 wx.TB_FLAT | wx.TB_NODIVIDER)
426 for analyse in matanalyses :
427 if not isinstance(analyse, dict) :
428 tb_mat.AddLabelTool(analyse[0], analyse[1], self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)), shortHelp = analyse[1], longHelp = analyse[1])
430 for subana in analyse['content'] :
431 tb_mat.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1])
433 #------------------------------------------------------------------------------------------------
435 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)
437 #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
438 # Name("Text").CenterPane())
439 self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
440 Name("Text").CenterPane())
441 #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
443 self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
445 #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
446 # with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
448 self.history = History(os.path.join(UserConfigPath, 'history.db'))
449 self.tree = LeftTree(self)
450 self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Historic").decode('utf8')).
451 Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
452 MinimizeButton(True))
454 #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)
455 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)
456 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
457 self.nb.SetAGWWindowStyleFlag(notebook_flags)
458 self.nb.SetArtProvider(aui.ChromeTabArt())
459 #self.nb.SetArtProvider(aui.VC8TabArt())
460 #self.nb.parent = self
461 #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
462 #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
463 # Name("Tab_content").
465 self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
469 #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
470 #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
471 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
472 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
473 # add the toolbars to the manager
475 #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
476 # Name("tb1").Caption("Fichiers").
477 # ToolbarPane().Top().
478 # LeftDockable(False).RightDockable(False))
479 self._mgr.AddPane(tb1, aui.AuiPaneInfo().
480 Name("tb1").Caption("Fichiers").
482 LeftDockable(True).RightDockable(False))
484 self._mgr.AddPane(tb_text, aui.AuiPaneInfo().
485 Name("tb_text").Caption("analyse_text").
487 LeftDockable(True).RightDockable(False))
489 self._mgr.AddPane(tb_mat, aui.AuiPaneInfo().
490 Name("tb_mat").Caption("analyse_matrix").
492 LeftDockable(True).RightDockable(False))
494 self._mgr.GetPane('tb_text').Hide()
495 self._mgr.GetPane('tb_mat').Hide()
497 self.ShowAPane("Intro_Text")
498 self._mgr.GetPane("lefttree").Show()
499 self._mgr.GetPane("classif_tb").Hide()
500 # "commit" all changes made to FrameManager
503 # Show How To Use The Closing Panes Event
504 ##################################################################
505 self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
506 self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
507 self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
508 self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
509 self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
510 self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
511 self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
512 self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
513 self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
514 self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
515 self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
516 self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
517 self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
518 self.Bind(wx.EVT_MENU, self.OnFreqMulti, id=ID_FreqMulti)
519 self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
520 self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
521 self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
522 self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
523 self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
524 self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
525 self.Bind(wx.EVT_MENU, self.OnSplitVar, id = ID_Splitfromvar)
526 #self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
527 #self.Bind(wx.EVT_MENU, self.OnSplitVar, id=ID_SPLITVAR)
528 #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
529 self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
530 self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
531 self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
532 self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
533 self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
534 self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
535 self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
536 self.Bind(wx.EVT_MENU, self.OnSubText, id = ID_Subtxtfrommeta)
537 self.Bind(wx.EVT_MENU, self.OnSubText, id = ID_Subtxtfromthem)
538 self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
539 self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
540 #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
541 self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
542 self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
543 self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
544 self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM)
545 self.Bind(wx.EVT_MENU, self.OnImportEuropress, id=ID_ImportEuro)
546 self.Bind(wx.EVT_CLOSE, self.OnClose)
547 ##################################################################
548 flags = self._mgr.GetAGWFlags()
549 #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
550 #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
551 #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
552 flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
553 self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
554 self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
555 self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
558 self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
559 self.SetIcon(self._icon)
560 ##########################
562 self.input_path = [False]
563 self.TEMPDIR = tempfile.mkdtemp('iramuteq')
564 self.FileTabList = []
570 self.g_header = False
577 self.SysEncoding = sys.getdefaultencoding()
578 self.syscoding = sys.getdefaultencoding()
579 #print 'SysEncoding',self.SysEncoding
580 if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
583 ##############################################################@
584 self.DisEnSaveTabAs(False)
585 self.ShowMenu('view', False)
586 self.ShowMenu('matrix', False)
587 self.ShowMenu('text', False)
598 def finish_init(self) :
600 self.pref.read(self.ConfigPath['preferences'])
603 self.pref.read(self.ConfigPath['preferences'])
610 self.pref.read(self.ConfigPath['preferences'])
612 self.sound = self.pref.getboolean('iramuteq', 'sound')
613 self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
614 self.version = ConfigGlob.get('DEFAULT', 'version')
615 #configuration des chemins de R
616 self.PathPath = ConfigParser()
617 self.PathPath.read(ConfigPath['path'])
619 if not CheckRPath(self.PathPath) :
620 if sys.platform == 'win32':
621 BestRPath = FindRPAthWin32()
623 BestRPath = FindRPathNix()
625 self.PathPath.set('PATHS', 'rpath', BestRPath)
626 with open(ConfigPath['path'], 'w') as f :
627 self.PathPath.write(f)
631 self.RPath = self.PathPath.get('PATHS', 'rpath')
634 if not RLibsAreInstalled(self) :
637 msg = '\n'.join([_(u"Can't find R executable"), _(u"If R is not installed, get it from http://www.r-project.org.").decode('utf8'),
638 _(u"If R is installed, report its path in Preferences.").decode('utf8'),
639 _(u"IRaMuTeQ does not work without R.").decode('utf8')])
640 dlg = wx.MessageDialog(self, msg, _(u"Problem").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
642 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
646 def setlangue(self) :
647 self.pref.read(self.ConfigPath['preferences'])
649 guilangue = self.pref.get('iramuteq', 'guilanguage')
651 guilangue = DefaultConf.get('iramuteq', 'guilanguage')
652 self.preslangue.get(guilangue, 'english').install()
654 def OnVerif(self, evt) :
655 pack = CheckRPackages(self)
657 dlg = wx.MessageDialog(self, _(u"Installation OK").decode('utf8'), _(u"Installation").decode('utf8'), wx.OK | wx.ICON_INFORMATION | wx.STAY_ON_TOP)
659 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
662 def DisEnSaveTabAs(self, DISEN):
664 file_menu = self.mb.GetMenu(0)
665 items = file_menu.GetMenuItems()
667 if item.GetId() == ID_SaveTab :
670 def ShowMenu(self, menu, Show=True):
674 self._mgr.GetPane('tb_text').Show()
676 self._mgr.GetPane('tb_text').Hide()
677 elif menu == 'matrix' :
680 self._mgr.GetPane('tb_mat').Show()
682 self._mgr.GetPane('tb_mat').Hide()
683 elif menu == 'view' :
688 #menu_pos = self.mb.FindMenu(menu)
689 if not menu_pos is None :
690 self.mb.EnableTop(menu_pos, Show)
691 self.mb.UpdateMenus()
694 #--------------------------------------------------------------------
695 def OnClose(self, event):
697 with open(self.ConfigPath['path'], 'w') as f :
698 self.PathPath.write(f)
703 def OnOpenData(self, event):
704 inputname, self.input_path = OnOpen(self, "Data")
706 #filename = self.input_path[0]
707 self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
708 val = get_table_param(self, self.input_path[0])
710 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
713 self.tableau.make_content()
714 OpenAnalyse(self, self.tableau.parametres)
715 self.tree.OnItemAppend(self.tableau.parametres)
720 #self.tableau.show_tab()
722 def OnOpenAnalyse(self, event):
723 self.AnalysePath = OnOpen(self, "Analyse")
724 if self.AnalysePath :
725 OpenAnalyse(self, self.AnalysePath[1][0], True)
726 self.ShowMenu('view')
728 def OnOpenText(self, event):
729 inputname, self.input_path = OnOpen(self, "Texte")
730 self.filename = self.input_path[0]
734 def OnViewData(self, event):
735 if self.type == "Data":
736 if not self.DataPop :
737 self.Sheet.Populate(self.content)
740 self.ShowAPane(u"Data")
741 elif self.type == "Texte" or self.type == 'Analyse' :
742 if not self.DataTxt :
743 self.text_ctrl_txt.Clear()
744 self.text_ctrl_txt.write(self.content)
745 self.text_ctrl_txt.ShowPosition(0)
748 self.ShowAPane(u"Text")
751 def OnSubText(self, evt, corpus = None, parametres = None):
753 corpus = self.tree.getcorpus()
754 if evt.GetId() == ID_Subtxtfrommeta :
755 parametres = {'frommeta' : True}
756 elif evt.GetId() == ID_Subtxtfromthem :
757 parametres = {'fromtheme' : True}
758 builder = SubBuilder(self, corpus, parametres)
759 if builder.res == wx.ID_OK :
760 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
762 corpus = builder.doanalyse()
763 self.history.add(corpus.parametres)
764 self.tree.OnItemAppend(corpus.parametres)
765 OpenAnalyse(self, corpus.parametres)
769 dlg = wx.ProgressDialog("Ouverture...",
770 "Veuillez patienter...",
773 style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
776 builder = Builder(self, dlg)
777 if builder.res == wx.ID_OK :
779 corpus = builder.doanalyse()
780 self.history.add(corpus.parametres)
781 self.tree.OnItemAppend(corpus.parametres)
782 OpenAnalyse(self, corpus.parametres)
788 keepGoing = dlg.Update(count, u"Lecture du fichier")
789 self.ShowMenu('view')
790 self.ShowMenu('text')
791 self.ShowMenu('matrix', False)
796 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
798 #self.OnViewData(wx.EVT_BUTTON)
800 def OnExit(self, event):
803 def OnAbout(self, event):
804 info = wx.AboutDialogInfo()
805 info.Name = ConfigGlob.get('DEFAULT', 'name')
806 info.Version = ConfigGlob.get('DEFAULT', 'version')
807 info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
808 info.Translators = ConfigGlob.get('DEFAULT', 'translators').decode('utf8').split(';')
809 info.Description = u"""
810 Interface de R pour les Analyses Multidimensionnelles
811 de Textes et de Questionnaires
814 construit avec des logiciels libres.
820 info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
821 dev = ConfigGlob.get('DEFAULT', 'dev').decode('utf8').split(';')
822 info.Developers = dev
823 info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier
824 suivant les termes de la Licence Publique Générale GNU telle que publiée
825 par la Free Software Foundation ; soit la version 2 de cette licence,
826 soit (à votre convenance) une version ultérieure.
828 Iramuteq est diffusé dans l'espoir qu'il sera utile,
829 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite
830 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER.
831 Voyez la Licence Publique Générale GNU pour plus de détails.
833 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
834 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
835 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
838 def GetDockArt(self):
839 return self._mgr.GetArtProvider()
844 def OnPageChanged(self, event) :
845 new = event.GetSelection()
846 nobject = event.GetEventObject()
847 parent = nobject.GetParent()
848 if isinstance(parent, IraFrame) :
849 npage = self.nb.GetPage(new)
850 if 'parametres' in dir(npage) :
851 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
852 if npage.parametres.get('matrix', False) :
853 self.ShowMenu('text', False)
854 self.ShowMenu('matrix', True)
855 elif npage.parametres.get('corpus', False) :
856 self.ShowMenu('text')
857 self.ShowMenu('matrix', False)
859 def OnCloseTab(self, evt):
860 #log.info('Closing tab %s' % str(evt.GetEventObject()))
861 ctrl = evt.GetEventObject()
862 if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
866 page = self.nb.GetPage(self.nb.GetSelection())
867 if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
868 self.history.rmtab(page.parametres)
869 self.tree.CloseItem(uuid = page.parametres['uuid'])
870 TabTitle = self.nb.GetPageText(self.nb.GetSelection())
872 if self.nb.GetPageCount() == 1 and not notebook :
875 def LastTabClose(self) :
876 if self.nb.GetPageCount() == 1 :
877 #self.DisEnSaveTabAs(False)
879 self.ShowAPane("Text")
881 self.ShowAPane("Data")
883 self.ShowAPane("Intro_Text")
885 def GetStartPosition(self):
889 pt = self.ClientToScreen(wx.Point(0, 0))
891 return wx.Point(pt.x + x, pt.y + x)
893 def ShowAPane(self, panel):
894 for pane in self._mgr.GetAllPanes() :
895 if not pane.IsToolbar() and pane.name != 'lefttree':
897 self._mgr.GetPane(panel).Show()
900 def OnAcceuil(self, event):
901 self.ShowAPane(u"Intro_Text")
904 def CreateHTMLCtrl(self):
905 ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
906 if "gtk2" in wx.PlatformInfo:
907 ctrl.SetStandardFonts()
908 ctrl.SetPage(u"text")
911 def ShowTab(self, evt):
912 self.ShowAPane("Tab_content")
914 ################################################################
916 ################################################################
917 def analyse_matrix(self, analyse, analyse_type = '', matrix = None, parametres = None, dlgnb = 1):
919 matrix = self.tree.getmatrix()
920 if parametres is not None :
921 parametres['type'] = analyse_type
923 parametres = {'type' : analyse_type}
925 #print 'plus de bug@@@@@@@@@@@@@@@@@@@@@@'
926 analyse(self, matrix, parametres = parametres, dlg = dlgnb)
930 def OnFreq(self, event, matrix = None):
931 self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
933 def OnFreqMulti(self, event, matrix = None):
934 self.analyse_matrix(FreqMultiple, analyse_type = 'freqmulti', matrix = matrix, dlgnb = 3)
936 def OnChi2(self, event, matrix = None):
937 self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3)
939 def OnSimiTab(self, event, matrix = None):
940 self.analyse_matrix(DoSimi, matrix = matrix, analyse_type = 'simimatrix', dlgnb = 5)
942 def OnCHDReinert(self, event, matrix = None):
944 # matrix = self.tree.getmatrix()
945 #AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = 3)
946 self.analyse_matrix(AnalyseQuest, matrix = matrix, analyse_type = 'reinertmatrix', dlgnb = 5)
948 def OnStudent(self, event):
954 def OnRCode(self, event):
960 def OnCHDSIM(self, event):
962 # print 'ATTENTION!!!!'
963 chdsim = ChdCluster(self)
964 if chdsim.val == wx.ID_OK:
969 # def OnCHDReinert(self, event):
971 # # print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
972 # self.quest = AnalyseQuest(self)
973 # if self.quest.val == wx.ID_OK:
978 def OnProto(self, evt, matrix = None) :
979 self.analyse_matrix(Prototypical, matrix = matrix, analyse_type = 'proto', dlgnb = 3)
980 #Prototypical(self, {'type' : 'proto'})
982 def OnSplitVar(self, evt, matrix = None):
984 matrix = self.tree.getmatrix()
985 self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', parametres = {'pathout': matrix.pathout.dirout}, dlgnb = 3)
986 #matrix = self.tree.getmatrix()
989 def OnSimiTxt(self, evt, corpus = None) :
990 # print 'PLUS DE BUG SUR SIMITXT'
992 #self.Text = SimiTxt(self)
994 corpus = self.tree.getcorpus()
995 self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = 3)
996 if self.Text.val == wx.ID_OK :
1001 def OnWordCloud(self, evt, corpus = None) :
1002 # print 'PLUS DE BUG SUR WORDCLOUD'
1005 corpus = self.tree.getcorpus()
1006 self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = 3)
1007 if self.Text.val == wx.ID_OK :
1012 def OnClusterCloud(self, corpus, parametres = None) :
1013 self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = 3)
1015 def OnAFCM(self, event):
1021 def OnTextStat(self, event, corpus = None):
1022 #print 'PAS DE BUG SUR TEXT STAT'
1025 corpus = self.tree.getcorpus()
1026 self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = 7)
1028 if self.Text.val == wx.ID_OK :
1033 def OnTextSpec(self, event, corpus = None):
1035 #self.Text = AsLexico(self)
1036 #print('ATTENTION : PLUS DE BUG SUR LEXICO')
1038 corpus = self.tree.getcorpus()
1039 self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = 3)
1040 if self.Text.val == wx.ID_OK :
1045 def OnTextAfcm(self, event):
1052 def import_factiva_xml(self,event):
1054 ImportFactiva(self, 'xml')
1058 def import_factiva_mail(self, evt) :
1060 ImportFactiva(self, 'mail')
1064 def import_factiva_txt(self, evt) :
1066 ImportFactiva(self, 'txt')
1070 def OnImportTXM(self, evt) :
1072 ImportFactiva(self, 'txm')
1076 def OnImportEuropress(self, evt) :
1078 ImportFactiva(self, 'euro')
1082 def ExtractTools(self, evt) :
1084 if ID == self.ID_splitvar :
1085 Extract(self, 'splitvar')
1086 elif ID == self.ID_extractmod :
1087 Extract(self, 'mods')
1088 elif ID == self.ID_extractthem :
1089 Extract(self, 'them')
1091 def OnTextReinert(self, event, corpus = None):
1093 #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
1094 #RunAnalyse(self, corpus, Alceste, OptAlceste)
1096 corpus = self.tree.getcorpus()
1097 self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6)
1098 if self.Text.val == wx.ID_OK:
1103 def OnPamSimple(self, event, corpus = None):
1106 corpus = self.tree.getcorpus()
1107 self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = 6)
1108 if self.Text.val == wx.ID_OK:
1113 def SimiCluster(self, parametres = {}, fromprof = False, tableau = None) :
1114 self.analyse_matrix(DoSimi, parametres = parametres, analyse_type = 'simiclustermatrix', matrix = tableau, dlgnb = 5)
1116 # def OnSimi(self,evt):
1118 #print 'ATTENTION !!!! VERGES'
1119 #print 'PLUS DE BUG SUR SIMI'
1120 # self.res = DoSimi(self, param = None)
1121 #self.res = Verges(self)
1122 # if self.res.val == wx.ID_OK :
1126 #################################################################
1128 def OnHelp(self, event):
1129 webbrowser.open('http://www.iramuteq.org/documentation')
1131 def OnPref(self, event):
1132 dlg = PrefDialog(self)
1133 dlg.CenterOnParent()
1134 self.val = dlg.ShowModal()
1137 if self.check_update:
1140 print 'pas de verif'
1142 #CheckRPackages(self)
1144 def OnOpenFromCmdl(self):
1146 if options.filename :
1147 if os.path.exists(options.filename):
1148 self.filename = os.path.abspath(options.filename)
1152 if os.path.exists(os.path.realpath(args[0])):
1153 self.filename = os.path.abspath(os.path.realpath(args[0]))
1159 if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1160 self.tableau = Tableau(self, self.filename)
1161 val = get_table_param(self, self.filename)
1162 if val == wx.ID_OK :
1163 self.tableau.make_content()
1164 OpenAnalyse(self, self.tableau.parametres)
1165 self.tree.OnItemAppend(self.tableau.parametres)
1166 #get_table_param(self, self.filename)
1167 #self.tableau.make_content()
1168 #self.tableau.show_tab()
1169 #open_data(self, self.filename)
1170 elif os.path.splitext(self.filename)[1] == '.txt':
1172 elif os.path.splitext(self.filename)[1] == '.ira' :
1173 #self.corpus = Corpus(self)
1174 #self.Text = OpenAnalyse(self, self.filename)
1175 OpenAnalyse(self, self.filename)
1177 print 'ce fichier n\'existe pas'
1181 class IntroPanel(wx.Panel):
1182 def __init__(self, parent):
1183 wx.Panel.__init__(self, parent)
1184 col = randint(0, 255)
1185 col1 = randint(0,255)
1186 col2 = randint(0,255)
1188 bckgrdcolor = wx.Colour(col, col1, col2)
1189 self.SetBackgroundColour(bckgrdcolor)
1190 txtcolour = wx.Colour(250, 250, 250)
1191 linkcolor = wx.Colour(255, 0, 0)
1192 sizer1 = wx.BoxSizer(wx.VERTICAL)
1193 sizer2 = wx.BoxSizer(wx.VERTICAL)
1194 sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1195 sizer4 = wx.BoxSizer(wx.VERTICAL)
1196 sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1197 grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1198 grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1199 grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1200 PanelPres = wx.Panel(self)
1201 PanelPres.SetBackgroundColour(bckgrdcolor)
1202 label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1203 label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1204 label_1.SetForegroundColour(wx.RED)
1205 label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1206 label2.SetForegroundColour(txtcolour)
1207 label2.SetBackgroundColour(bckgrdcolor)
1208 #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1209 #label3.SetForegroundColour(txtcolour)
1210 #label3.SetBackgroundColour(bckgrdcolor)
1211 self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1212 self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1213 self.hyper2.SetBackgroundColour(bckgrdcolor)
1214 self.hyper2.EnableRollover(True)
1215 self.hyper2.SetUnderlines(False, False, True)
1216 self.hyper2.SetBold(True)
1217 self.hyper2.UpdateLink()
1218 label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1219 label_lerass.SetForegroundColour(txtcolour)
1220 label_lerass.SetBackgroundColour(bckgrdcolor)
1221 self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1222 self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1223 self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1224 self.hyper_lerass.EnableRollover(True)
1225 self.hyper_lerass.SetUnderlines(False, False, True)
1226 self.hyper_lerass.SetBold(True)
1227 self.hyper_lerass.UpdateLink()
1228 blank = wx.StaticText(PanelPres, -1, u'\n')
1229 blank1 = wx.StaticText(PanelPres, -1, u'\n')
1230 labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1231 labellicence.SetForegroundColour(txtcolour)
1232 labellicence.SetBackgroundColour(bckgrdcolor)
1233 labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1234 labelcopy.SetForegroundColour(txtcolour)
1235 labelcopy.SetBackgroundColour(bckgrdcolor)
1236 python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1237 r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1238 lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1239 but_python = wx.BitmapButton(self, -1, python_img)
1240 but_lexique = wx.BitmapButton(self, -1, lexique_img)
1241 but_r = wx.BitmapButton(self, -1, r_img)
1242 self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1243 self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1244 self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1247 #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1248 grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1249 grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1250 grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1251 sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1252 sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1253 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1254 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1255 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1256 sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1257 sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1258 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1259 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1260 sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1261 sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1262 sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1263 sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1264 PanelPres.SetSizer(sizer2)
1265 sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1266 sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1267 sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1268 grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1269 grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1270 grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1272 sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1273 sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1274 self.SetSizer(sizer1)
1277 def OnPython(self,evt):
1278 webbrowser.open('http://www.python.org')
1280 def OnLexique(self,evt):
1281 webbrowser.open('http://www.lexique.org')
1284 webbrowser.open('http://www.r-project.org')
1286 class MySplashScreen(wx.SplashScreen):
1288 bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1289 wx.SplashScreen.__init__(self, bmp,
1290 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1292 self.Bind(wx.EVT_CLOSE, self.OnClose)
1293 self.fc = wx.FutureCall(1, self.ShowMain)
1295 def OnClose(self, evt):
1299 if self.fc.IsRunning():
1304 displaySize = wx.DisplaySize()
1305 w = displaySize[0]/1.2
1306 h = displaySize[1]/1.2
1307 frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1311 frame.OnOpenFromCmdl()
1312 # if self.fc.IsRunning():
1314 #wx.CallAfter(frame.ShowTip)
1316 class MyApp(wx.App):
1319 Create and show the splash screen. It will then create and show
1320 the main frame when it is time to do so.
1322 wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1323 self.SetAppName("Iramuteq")
1324 splash = MySplashScreen()
1332 if __name__ == '__main__':