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 import wx.lib.agw.aui as aui
34 import wx.lib.hyperlink as hl
35 #------------------------------------
36 from functions import BugReport, PlaySound, ReadLexique, History, DoConf, ReadDicoAsDico, progressbar
37 from checkversion import NewVersion
38 from guifunct import *
39 from tableau import Tableau
40 from dialog import PrefDialog, CorpusPref
41 from tabfrequence import Frequences
42 from tabchi2 import ChiSquare
43 #from tabstudent import MakeStudent
44 from tabchddist import ChdCluster
45 from tabafcm import DoAFCM
46 from tabchdalc import AnalyseQuest
47 from tabsimi import DoSimi
48 from tabrsimple import InputText
49 from tabverges import Prototypical
50 #from textafcuci import AfcUci
51 from textdist import AnalysePam
52 from textstat import Stat
53 from textaslexico import Lexico
54 from textsimi import SimiTxt, SimiFromCluster
55 from textwordcloud import WordCloud, ClusterCloud
56 from textreinert import Reinert
57 #from profile_segment import ProfileSegment
58 #from textcheckcorpus import checkcorpus
59 from openanalyse import OpenAnalyse
60 from corpus import Builder, SubBuilder
61 #from sheet import MySheet
62 from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
63 from chemins import RscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
64 from parse_factiva_xml import ImportFactiva
65 from tools import Extract
67 from tree import LeftTree
68 ##########################################################
69 ID_OpenData = wx.NewId()
70 ID_Import = wx.NewId()
71 ID_OpenText = wx.NewId()
72 ID_OnOpenAnalyse = wx.NewId()
75 ID_Student = wx.NewId()
76 ID_CHDSIM = wx.NewId()
77 ID_CHDReinert = wx.NewId()
78 ID_TEXTAFCM = wx.NewId()
79 ID_TEXTSTAT = wx.NewId()
81 ID_TEXTREINERT = wx.NewId()
82 ID_TEXTPAM = wx.NewId()
83 ID_CHECKCORPUS = wx.NewId()
84 ID_Tabcontent = wx.NewId()
87 ID_CloseTab = wx.NewId()
88 ID_SaveTab = wx.NewId()
89 ID_CreateText = wx.NewId()
90 ID_ACCEUIL = wx.NewId()
91 ID_RESULT = wx.NewId()
92 ID_VIEWDATA = wx.NewId()
93 ID_HTMLcontent = wx.NewId()
94 ID_SimiTxt = wx.NewId()
96 ID_ImportTXM = 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 #repertoire de l'utilisateur
116 if os.getenv('HOME') != None:
117 user_home = os.getenv('HOME')
119 user_home = os.getenv('HOMEPATH')
120 UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq'))
121 #Si pas de fichiers de config utilisateur, on cree le repertoire
122 CreateIraDirectory(UserConfigPath, AppliPath)
123 #fichiers log pour windows (py2exe)
124 log = logging.getLogger('iramuteq')
125 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
126 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
127 fh.setFormatter(formatter)
129 if sys.platform != 'win32' and sys.platform != 'darwin':
130 ch = logging.StreamHandler()
131 ch.setFormatter(formatter)
133 log.setLevel(logging.INFO)
135 class writer(object):
136 def write(self, data):
137 if data.strip() != '' :
138 log.info('ERROR : %s' % data)
140 class printer(object) :
141 def write(self, data) :
142 if data.strip() != '' :
143 log.info('Print : %s' % data)
145 sys.stderr = writer()
146 sys.stdout = printer()
148 ConfigPath = ConstructConfigPath(UserConfigPath)
150 langues = {'french' : wx.LANGUAGE_FRENCH,
151 'english' : wx.LANGUAGE_ENGLISH,}
152 #####################################################################
154 class IraFrame(wx.Frame):
155 def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
156 size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE |
159 log.info('Starting...')
160 wx.Frame.__init__(self, parent, id, title, pos, size, style)
162 self.AppliPath = AppliPath
163 self.images_path = os.path.join(AppliPath,'images')
164 self.UserConfigPath = UserConfigPath
165 #self.RscriptsPath = ConstructRscriptsPath(AppliPath)
166 self.RscriptsPath = PathOut(dirout=os.path.join(AppliPath, 'Rscripts'))
167 self.RscriptsPath.basefiles(RscriptsPath)
168 #self.DictPath = ConstructDicoPath(AppliPath)
169 self.DictPath = ConstructDicoPath(UserConfigPath)
170 self.ConfigGlob = ConfigGlob
171 self.ConfigPath = ConstructConfigPath(UserConfigPath)
172 self.pref = RawConfigParser()
173 #workaround for import problem
174 self.SimiFromCluster = SimiFromCluster
176 gettext.install('iramuteq', os.path.join(AppliPath,'locale'), unicode=True)
177 self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
178 self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
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").decode('utf8'), _(u"Open a matrix").decode('utf8'))
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 corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8'))
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").decode('utf8'), _(u"Open an analysis").decode('utf8'))
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").decode('utf8'))
205 fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
206 fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
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").decode('utf8'), menuFactiva)
212 item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8'))
213 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
214 file_menu.AppendItem(item)
216 menuTools = wx.Menu()
217 splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
218 extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
219 extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
220 menuTools.AppendItem(splitvar)
221 menuTools.AppendItem(extractmod)
222 menuTools.AppendItem(extractthem)
223 self.ID_splitvar = splitvar.GetId()
224 self.ID_extractmod = extractmod.GetId()
225 self.ID_extractthem = extractthem.GetId()
226 file_menu.AppendMenu(-1, _(u"Tools"), menuTools)
229 #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
230 #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
231 #file_menu.AppendItem(item)
233 file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
235 edit_menu = wx.Menu()
236 edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences').decode('utf8'))
238 view_menu = wx.Menu()
239 view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
240 view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
241 view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
242 #view_menu.AppendSeparator()
243 analyse_menu = wx.Menu()
244 analyse_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
245 analyse_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
246 #analyse_menu.Append(ID_Student, u"t de Student")
247 menu_classif = wx.Menu()
248 menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
249 #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
250 analyse_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
251 #analyse_menu.Append(ID_AFCM, u"AFCM")
252 analyse_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
253 analyse_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
254 ID_RCODE = wx.NewId()
255 analyse_menu.Append(ID_RCODE, u"Code R...")
256 self.analyse_menu = analyse_menu
258 text_menu = wx.Menu()
259 #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
260 text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
261 text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
262 #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
263 menu_classiftxt = wx.Menu()
264 menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
265 #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
266 text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
267 text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'))
269 text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
270 self.text_menu = text_menu
272 help_menu = wx.Menu()
273 help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
274 help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
276 self.mb.Append(file_menu, _(u"File").decode('utf8'))
277 self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
278 self.mb.Append(view_menu, _(u"View").decode('utf8'))
279 self.mb.Append(analyse_menu, _(u"Matrix analysis").decode('utf8'))
280 self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
281 self.mb.Append(help_menu, _(u"Help").decode('utf8'))
283 self.SetMenuBar(self.mb)
284 #--------------------------------------------------------------------
285 self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
286 self.statusbar.SetStatusWidths([-2, -3])
287 self.statusbar.SetStatusText(u"Prêt", 0)
288 self.statusbar.SetStatusText(u"Bienvenue", 1)
290 # min size for the frame itself isn't completely done.
291 # see the end up FrameManager::Update() for the test
292 # code. For now, just hard code a frame minimum size
293 self.SetMinSize(wx.Size(400, 400))
295 # create some toolbars
296 tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
297 wx.TB_FLAT | wx.TB_NODIVIDER)
298 tb1.SetToolBitmapSize(wx.Size(16, 16))
299 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")
301 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")
305 #------------------------------------------------------------------------------------------------
307 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)
309 #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
310 # Name("Text").CenterPane())
311 self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
312 Name("Text").CenterPane())
313 #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
315 self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
317 #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
318 # with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
320 self.history = History(os.path.join(UserConfigPath, 'history.db'))
321 self.tree = LeftTree(self)
322 self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Navigator").decode('utf8')).
323 Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
324 MinimizeButton(True))
326 #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)
327 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)
328 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
329 self.nb.SetAGWWindowStyleFlag(notebook_flags)
330 self.nb.SetArtProvider(aui.ChromeTabArt())
331 #self.nb.SetArtProvider(aui.VC8TabArt())
332 #self.nb.parent = self
333 #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
334 #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
335 # Name("Tab_content").
337 self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
341 #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
342 #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
343 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
344 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
345 # add the toolbars to the manager
347 #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
348 # Name("tb1").Caption("Fichiers").
349 # ToolbarPane().Top().
350 # LeftDockable(False).RightDockable(False))
351 self._mgr.AddPane(tb1, aui.AuiPaneInfo().
352 Name("tb1").Caption("Fichiers").
354 LeftDockable(True).RightDockable(False))
356 self.ShowAPane("Intro_Text")
357 self._mgr.GetPane("lefttree").Show()
358 self._mgr.GetPane("classif_tb").Hide()
359 # "commit" all changes made to FrameManager
362 # Show How To Use The Closing Panes Event
363 ##################################################################
364 self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
365 self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
366 self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
367 self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
368 self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
369 self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
370 self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
371 self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
372 self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
373 self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
374 self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
375 self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
376 self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
377 self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
378 self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
379 self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
380 self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
381 self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
382 self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
383 self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
384 #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
385 self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
386 self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
387 self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
388 self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
389 self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
390 self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
391 self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
392 self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
393 self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
394 #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
395 self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
396 self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
397 self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
398 self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM)
399 self.Bind(wx.EVT_CLOSE, self.OnClose)
400 ##################################################################
401 flags = self._mgr.GetAGWFlags()
402 #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
403 #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
404 #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
405 flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
406 self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
407 self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
408 self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
411 self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
412 self.SetIcon(self._icon)
413 ##########################
415 self.input_path = [False]
416 self.TEMPDIR = tempfile.mkdtemp('iramuteq')
417 self.FileTabList = []
423 self.g_header = False
430 self.SysEncoding = sys.getdefaultencoding()
431 self.syscoding = sys.getdefaultencoding()
432 #print 'SysEncoding',self.SysEncoding
433 if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
436 ##############################################################@
437 self.DisEnSaveTabAs(False)
438 self.ShowMenu(_("View").decode('utf8'), False)
439 self.ShowMenu(_("Matrix analysis").decode('utf8'), False)
440 self.ShowMenu(_("Text analysis").decode('utf8'), False)
451 def finish_init(self) :
453 self.pref.read(self.ConfigPath['preferences'])
456 self.pref.read(self.ConfigPath['preferences'])
463 self.pref.read(self.ConfigPath['preferences'])
465 self.sound = self.pref.getboolean('iramuteq', 'sound')
466 self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
467 self.version = ConfigGlob.get('DEFAULT', 'version')
468 #configuration des chemins de R
469 self.PathPath = ConfigParser()
470 self.PathPath.read(ConfigPath['path'])
472 if not CheckRPath(self.PathPath) :
473 if sys.platform == 'win32':
474 BestRPath = FindRPAthWin32()
476 BestRPath = FindRPathNix()
478 self.PathPath.set('PATHS', 'rpath', BestRPath)
479 with open(ConfigPath['path'], 'w') as f :
480 self.PathPath.write(f)
484 self.RPath = self.PathPath.get('PATHS', 'rpath')
487 if not RLibsAreInstalled(self) :
491 Le chemin de l'executable de R n'a pas été trouvé.
492 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
493 Si R n'est pas installé dans le répertoire par défaut
494 (souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
495 vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
496 dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
498 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
503 def setlangue(self) :
505 self.pref.read(self.ConfigPath['preferences'])
506 guilangue = self.pref.get('iramuteq', 'guilanguage')
507 if guilangue == 'french' :
508 self.presLan_fr.install()
510 self.presLan_en.install()
511 mylocale = wx.Locale(langues[guilangue])
512 mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
513 mylocale.AddCatalog('iramuteq')
515 self.presLan_fr.install()
516 mylocale = wx.Locale(langues['french'])
517 mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
518 mylocale.AddCatalog('iramuteq')
521 def OnVerif(self, evt) :
522 pack = CheckRPackages(self)
524 dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION)
526 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
529 def DisEnSaveTabAs(self, DISEN):
531 file_menu = self.mb.GetMenu(0)
532 items = file_menu.GetMenuItems()
534 if item.GetId() == ID_SaveTab :
537 def ShowMenu(self, menu, Show=True):
538 menu_pos = self.mb.FindMenu(menu)
539 self.mb.EnableTop(menu_pos, Show)
540 self.mb.UpdateMenus()
543 #--------------------------------------------------------------------
544 def OnClose(self, event):
546 with open(self.ConfigPath['path'], 'w') as f :
547 self.PathPath.write(f)
552 def OnOpenData(self, event):
553 inputname, self.input_path = OnOpen(self, "Data")
555 #filename = self.input_path[0]
556 self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
557 val = get_table_param(self, self.input_path[0])
559 self.tableau.make_content()
560 OpenAnalyse(self, self.tableau.parametres)
561 self.tree.OnItemAppend(self.tableau.parametres)
562 #self.tableau.show_tab()
564 def OnOpenAnalyse(self, event):
565 self.AnalysePath = OnOpen(self, "Analyse")
566 OpenAnalyse(self, self.AnalysePath[1][0], True)
567 self.ShowMenu(_("View"))
569 def OnOpenText(self, event):
570 inputname, self.input_path = OnOpen(self, "Texte")
571 self.filename = self.input_path[0]
575 def OnViewData(self, event):
578 if self.type == "Data":
579 if not self.DataPop :
580 self.Sheet.Populate(self.content)
583 self.ShowAPane(u"Data")
584 elif self.type == "Texte" or self.type == 'Analyse' :
585 if not self.DataTxt :
586 self.text_ctrl_txt.Clear()
587 self.text_ctrl_txt.write(self.content)
588 self.text_ctrl_txt.ShowPosition(0)
591 self.ShowAPane(u"Text")
594 def OnSubText(self, corpus, parametres = None):
595 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
597 builder = SubBuilder(self, corpus, parametres)
599 if builder.res == wx.ID_OK :
600 corpus = builder.doanalyse()
601 print corpus.parametres['uuid']
602 self.history.add(corpus.parametres)
603 self.tree.OnItemAppend(corpus.parametres)
604 OpenAnalyse(self, corpus.parametres)
607 dlg = wx.ProgressDialog("Ouverture...",
608 "Veuillez patienter...",
611 style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
614 builder = Builder(self, dlg)
615 if builder.res == wx.ID_OK :
617 corpus = builder.doanalyse()
618 self.history.add(corpus.parametres)
619 self.tree.OnItemAppend(corpus.parametres)
620 OpenAnalyse(self, corpus.parametres)
625 keepGoing = dlg.Update(count, u"Lecture du fichier")
626 self.ShowMenu(_(u"View").decode('utf8'))
627 self.ShowMenu(_(u"Text analysis").decode('utf8'))
628 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
633 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
635 #self.OnViewData(wx.EVT_BUTTON)
637 def OnExit(self, event):
640 def OnAbout(self, event):
641 info = wx.AboutDialogInfo()
642 info.Name = ConfigGlob.get('DEFAULT', 'name')
643 info.Version = ConfigGlob.get('DEFAULT', 'version')
644 info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
645 info.Description = u"""
646 Interface de R pour les Analyses Multidimensionnelles
647 de Textes et de Questionnaires
650 construit avec des logiciels libres.
656 info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
657 dev = ConfigGlob.get('DEFAULT', 'dev').split(';')
658 info.Developers = dev
659 info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier
660 suivant les termes de la Licence Publique Générale GNU telle que publiée
661 par la Free Software Foundation ; soit la version 2 de cette licence,
662 soit (à votre convenance) une version ultérieure.
664 Iramuteq est diffusé dans l'espoir qu'il sera utile,
665 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite
666 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER.
667 Voyez la Licence Publique Générale GNU pour plus de détails.
669 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
670 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
671 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
674 def GetDockArt(self):
675 return self._mgr.GetArtProvider()
680 def OnPageChanged(self, event) :
681 new = event.GetSelection()
682 nobject = event.GetEventObject()
683 parent = nobject.GetParent()
684 if isinstance(parent, IraFrame) :
685 npage = self.nb.GetPage(new)
686 if 'parametres' in dir(npage) :
687 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
688 if npage.parametres.get('matrix', False) :
689 self.ShowMenu(_(u"Text analysis").decode('utf8'), False)
690 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), True)
691 elif npage.parametres.get('corpus', False) :
692 self.ShowMenu(_(u"Text analysis").decode('utf8'))
693 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
695 def OnCloseTab(self, evt):
696 #log.info('Closing tab %s' % str(evt.GetEventObject()))
697 ctrl = evt.GetEventObject()
698 if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
702 page = self.nb.GetPage(self.nb.GetSelection())
703 if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
704 self.history.rmtab(page.parametres)
705 self.tree.CloseItem(uuid = page.parametres['uuid'])
706 TabTitle = self.nb.GetPageText(self.nb.GetSelection())
707 # if self.DictTab != {} :
708 # if TabTitle in self.DictTab :
709 # ListFile=self.DictTab[TabTitle]
710 # if False in ListFile:
712 # Certains résultats ne sont pas enregistrer.
713 # Voulez-vous fermer quand même ?"""
714 # dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
716 # dlg.CenterOnParent()
717 # if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
722 # for f in ListFile[1:] :
727 # elif True in ListFile :
730 # del self.DictTab[TabTitle]
732 # self.LastTabClose()
735 if self.nb.GetPageCount() == 1 and not notebook :
738 def LastTabClose(self) :
739 if self.nb.GetPageCount() == 1 :
740 #self.DisEnSaveTabAs(False)
742 self.ShowAPane("Text")
744 self.ShowAPane("Data")
746 self.ShowAPane("Intro_Text")
748 # def OnSaveTabAs(self, event):
749 # SelectTab = self.nb.GetSelection()
750 # TabTitle = self.nb.GetPageText(SelectTab)
751 # FileToSave = self.DictTab[TabTitle]
753 # dlg = wx.FileDialog(
754 # self, message="Enregistrer sous...", defaultDir=os.getcwd(),
755 # defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
757 # dlg.SetFilterIndex(2)
758 # dlg.CenterOnParent()
760 # if dlg.ShowModal() == wx.ID_OK:
761 # Path = dlg.GetPath()
762 # Dirname = os.path.dirname(Path)
763 # Filename = dlg.GetFilename()
768 # shutil.copyfile(FileToSave[-1], Path)
769 # os.remove(FileToSave[len(FileToSave) - 1])
770 # NewListFile.append(True)
771 # NewListFile.append(Path)
772 # for f in FileToSave[1:-1] :
773 # Fileout = os.path.join(Dirname, os.path.basename(f))
774 # shutil.copyfile(f, Fileout)
775 # NewListFile.append(Fileout)
778 # self.DictTab[TabText] = NewListFile
779 # del self.DictTab[TabTitle]
780 # self.nb.SetPageText(SelectTab, TabText)
782 def GetStartPosition(self):
786 pt = self.ClientToScreen(wx.Point(0, 0))
788 return wx.Point(pt.x + x, pt.y + x)
790 def ShowAPane(self, panel):
791 for pane in self._mgr.GetAllPanes() :
792 if not pane.IsToolbar() and pane.name != 'lefttree':
794 self._mgr.GetPane(panel).Show()
797 def OnAcceuil(self, event):
798 self.ShowAPane(u"Intro_Text")
801 def CreateHTMLCtrl(self):
802 ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
803 if "gtk2" in wx.PlatformInfo:
804 ctrl.SetStandardFonts()
805 ctrl.SetPage(u"text")
808 def ShowTab(self, evt):
809 self.ShowAPane("Tab_content")
811 ################################################################
813 ################################################################
814 def analyse_matrix(self, analyse, analyse_type = '', matrix = None, dlgnb = 1):
816 matrix = self.tree.getmatrix()
818 analyse(self, matrix, parametres = {'type' : analyse_type}, dlg = progressbar(self, dlgnb))
822 def OnFreq(self, event, matrix = None):
823 self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
825 # matrix = self.tree.getmatrix()
827 # Frequences(self, matrix, parametres = {'type' : 'freq'}, dlg = progressbar(self, 3))
831 def OnChi2(self, event, matrix = None):
833 self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3)
837 def OnSimiTab(self, event, matrix = None):
839 matrix = self.tree.getmatrix()
841 DoSimi(self, matrix, parametres = {'type' : 'simimatrix'}, dlg = progressbar(self, 3))
845 def OnCHDReinert(self, event, matrix = None):
847 matrix = self.tree.getmatrix()
848 AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = progressbar(self, 3))
850 def OnStudent(self, event):
856 def OnRCode(self, event):
862 def OnCHDSIM(self, event):
864 # print 'ATTENTION!!!!'
865 chdsim = ChdCluster(self)
866 if chdsim.val == wx.ID_OK:
871 # def OnCHDReinert(self, event):
873 # # print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
874 # self.quest = AnalyseQuest(self)
875 # if self.quest.val == wx.ID_OK:
880 def OnProto(self, evt) :
881 Prototypical(self, {'type' : 'proto'})
883 def OnSimiTxt(self, evt, corpus = None) :
884 # print 'PLUS DE BUG SUR SIMITXT'
886 #self.Text = SimiTxt(self)
888 corpus = self.tree.getcorpus()
889 self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = progressbar(self, 3))
890 if self.Text.val == wx.ID_OK :
895 def OnWordCloud(self, evt, corpus = None) :
896 # print 'PLUS DE BUG SUR WORDCLOUD'
899 corpus = self.tree.getcorpus()
900 self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = progressbar(self, 3))
901 if self.Text.val == wx.ID_OK :
906 def OnClusterCloud(self, corpus, parametres = None) :
907 self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = progressbar(self, 3))
909 def OnAFCM(self, event):
915 def OnTextStat(self, event, corpus = None):
916 #print 'PAS DE BUG SUR TEXT STAT'
919 corpus = self.tree.getcorpus()
920 self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7))
922 if self.Text.val == wx.ID_OK :
927 def OnTextSpec(self, event, corpus = None):
929 #self.Text = AsLexico(self)
930 #print('ATTENTION : PLUS DE BUG SUR LEXICO')
932 corpus = self.tree.getcorpus()
933 self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
934 if self.Text.val == wx.ID_OK :
939 def OnTextAfcm(self, event):
946 def import_factiva_xml(self,event):
948 ImportFactiva(self, 'xml')
952 def import_factiva_mail(self, evt) :
954 ImportFactiva(self, 'mail')
958 def import_factiva_txt(self, evt) :
960 ImportFactiva(self, 'txt')
964 def OnImportTXM(self, evt) :
966 ImportFactiva(self, 'txm')
970 def ExtractTools(self, evt) :
972 if ID == self.ID_splitvar :
973 Extract(self, 'splitvar')
974 elif ID == self.ID_extractmod :
975 Extract(self, 'mods')
976 elif ID == self.ID_extractthem :
977 Extract(self, 'them')
979 def OnTextReinert(self, event, corpus = None):
981 #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
982 #RunAnalyse(self, corpus, Alceste, OptAlceste)
984 corpus = self.tree.getcorpus()
985 self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = progressbar(self,6))
986 if self.Text.val == wx.ID_OK:
991 def OnPamSimple(self, event, corpus = None):
994 corpus = self.tree.getcorpus()
995 self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = progressbar(self,6))
996 if self.Text.val == wx.ID_OK:
1001 def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
1002 DoSimi(self, param = parametres, fromprof = fromprof, listactives = listactives, actives = actives, tableau = tableau)
1004 # def OnSimi(self,evt):
1006 #print 'ATTENTION !!!! VERGES'
1007 #print 'PLUS DE BUG SUR SIMI'
1008 # self.res = DoSimi(self, param = None)
1009 #self.res = Verges(self)
1010 # if self.res.val == wx.ID_OK :
1014 #################################################################
1016 def OnHelp(self, event):
1017 webbrowser.open('http://www.iramuteq.org/documentation')
1019 def OnPref(self, event):
1020 dlg = PrefDialog(self)
1021 dlg.CenterOnParent()
1022 self.val = dlg.ShowModal()
1025 if self.check_update:
1028 print 'pas de verif'
1030 #CheckRPackages(self)
1032 def OnOpenFromCmdl(self):
1034 if options.filename :
1035 if os.path.exists(options.filename):
1036 self.filename = os.path.abspath(options.filename)
1040 if os.path.exists(os.path.realpath(args[0])):
1041 self.filename = os.path.abspath(os.path.realpath(args[0]))
1047 if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1048 self.tableau = Tableau(self, self.filename)
1049 get_table_param(self, self.filename)
1050 self.tableau.make_content()
1051 self.tableau.show_tab()
1052 #open_data(self, self.filename)
1053 elif os.path.splitext(self.filename)[1] == '.txt':
1055 elif os.path.splitext(self.filename)[1] == '.ira' :
1056 #self.corpus = Corpus(self)
1057 #self.Text = OpenAnalyse(self, self.filename)
1058 OpenAnalyse(self, self.filename)
1060 print 'ce fichier n\'existe pas'
1064 class IntroPanel(wx.Panel):
1065 def __init__(self, parent):
1066 wx.Panel.__init__(self, parent)
1067 col = randint(0, 255)
1068 col1 = randint(0,255)
1069 col2 = randint(0,255)
1071 bckgrdcolor = wx.Colour(col, col1, col2)
1072 self.SetBackgroundColour(bckgrdcolor)
1073 txtcolour = wx.Colour(250, 250, 250)
1074 linkcolor = wx.Colour(255, 0, 0)
1075 sizer1 = wx.BoxSizer(wx.VERTICAL)
1076 sizer2 = wx.BoxSizer(wx.VERTICAL)
1077 sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1078 sizer4 = wx.BoxSizer(wx.VERTICAL)
1079 sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1080 grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1081 grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1082 grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1083 PanelPres = wx.Panel(self)
1084 PanelPres.SetBackgroundColour(bckgrdcolor)
1085 label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1086 label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1087 label_1.SetForegroundColour(wx.RED)
1088 label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1089 label2.SetForegroundColour(txtcolour)
1090 label2.SetBackgroundColour(bckgrdcolor)
1091 #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1092 #label3.SetForegroundColour(txtcolour)
1093 #label3.SetBackgroundColour(bckgrdcolor)
1094 self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1095 self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1096 self.hyper2.SetBackgroundColour(bckgrdcolor)
1097 self.hyper2.EnableRollover(True)
1098 self.hyper2.SetUnderlines(False, False, True)
1099 self.hyper2.SetBold(True)
1100 self.hyper2.UpdateLink()
1101 label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1102 label_lerass.SetForegroundColour(txtcolour)
1103 label_lerass.SetBackgroundColour(bckgrdcolor)
1104 self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1105 self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1106 self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1107 self.hyper_lerass.EnableRollover(True)
1108 self.hyper_lerass.SetUnderlines(False, False, True)
1109 self.hyper_lerass.SetBold(True)
1110 self.hyper_lerass.UpdateLink()
1111 blank = wx.StaticText(PanelPres, -1, u'\n')
1112 blank1 = wx.StaticText(PanelPres, -1, u'\n')
1113 labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1114 labellicence.SetForegroundColour(txtcolour)
1115 labellicence.SetBackgroundColour(bckgrdcolor)
1116 labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1117 labelcopy.SetForegroundColour(txtcolour)
1118 labelcopy.SetBackgroundColour(bckgrdcolor)
1119 python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1120 r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1121 lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1122 but_python = wx.BitmapButton(self, -1, python_img)
1123 but_lexique = wx.BitmapButton(self, -1, lexique_img)
1124 but_r = wx.BitmapButton(self, -1, r_img)
1125 self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1126 self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1127 self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1130 #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1131 grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1132 grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1133 grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1134 sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1135 sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1136 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1137 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1138 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1139 sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1140 sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1141 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1142 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1143 sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1144 sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1145 sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1146 sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1147 PanelPres.SetSizer(sizer2)
1148 sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1149 sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1150 sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1151 grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1152 grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1153 grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1155 sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1156 sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1157 self.SetSizer(sizer1)
1160 def OnPython(self,evt):
1161 webbrowser.open('http://www.python.org')
1163 def OnLexique(self,evt):
1164 webbrowser.open('http://www.lexique.org')
1167 webbrowser.open('http://www.r-project.org')
1169 class MySplashScreen(wx.SplashScreen):
1171 bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1172 wx.SplashScreen.__init__(self, bmp,
1173 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1175 self.Bind(wx.EVT_CLOSE, self.OnClose)
1176 self.fc = wx.FutureCall(1, self.ShowMain)
1178 def OnClose(self, evt):
1182 if self.fc.IsRunning():
1187 displaySize = wx.DisplaySize()
1188 w = displaySize[0]/1.2
1189 h = displaySize[1]/1.2
1190 frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1194 frame.OnOpenFromCmdl()
1195 # if self.fc.IsRunning():
1197 #wx.CallAfter(frame.ShowTip)
1199 class MyApp(wx.App):
1202 Create and show the splash screen. It will then create and show
1203 the main frame when it is time to do so.
1205 wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1206 self.SetAppName("Iramuteq")
1207 splash = MySplashScreen()
1215 if __name__ == '__main__':