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 tabsplitvar import SplitMatrixFromVar
51 #from textafcuci import AfcUci
52 from textdist import AnalysePam
53 from textstat import Stat
54 from textaslexico import Lexico
55 from textsimi import SimiTxt, SimiFromCluster
56 from textwordcloud import WordCloud, ClusterCloud
57 from textreinert import Reinert
58 #from profile_segment import ProfileSegment
59 #from textcheckcorpus import checkcorpus
60 from openanalyse import OpenAnalyse
61 from corpus import Builder, SubBuilder
62 #from sheet import MySheet
63 from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
64 from chemins import RscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
65 from parse_factiva_xml import ImportFactiva
66 from tools import Extract
68 from tree import LeftTree
69 ##########################################################
70 ID_OpenData = wx.NewId()
71 ID_Import = wx.NewId()
72 ID_OpenText = wx.NewId()
73 ID_OnOpenAnalyse = wx.NewId()
76 ID_Student = wx.NewId()
77 ID_CHDSIM = wx.NewId()
78 ID_CHDReinert = wx.NewId()
79 ID_TEXTAFCM = wx.NewId()
80 ID_TEXTSTAT = wx.NewId()
82 ID_TEXTREINERT = wx.NewId()
83 ID_TEXTPAM = wx.NewId()
84 ID_CHECKCORPUS = wx.NewId()
85 ID_Tabcontent = wx.NewId()
88 ID_CloseTab = wx.NewId()
89 ID_SaveTab = wx.NewId()
90 ID_CreateText = wx.NewId()
91 ID_ACCEUIL = wx.NewId()
92 ID_RESULT = wx.NewId()
93 ID_VIEWDATA = wx.NewId()
94 ID_HTMLcontent = wx.NewId()
95 ID_SimiTxt = wx.NewId()
97 ID_ImportTXM = wx.NewId()
98 ##########################################################
99 #elements de configuration
100 ##########################################################
102 if sys.platform == 'darwin' :
103 sys.setdefaultencoding('UTF-8')
104 wx.SetDefaultPyEncoding('UTF-8')
106 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)
151 langues = {'french' : wx.LANGUAGE_FRENCH,
152 'english' : wx.LANGUAGE_ENGLISH,}
153 #####################################################################
155 class IraFrame(wx.Frame):
156 def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
157 size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE |
160 log.info('Starting...')
161 wx.Frame.__init__(self, parent, id, title, pos, size, style)
163 self.AppliPath = AppliPath
164 self.images_path = os.path.join(AppliPath,'images')
165 self.UserConfigPath = UserConfigPath
166 #self.RscriptsPath = ConstructRscriptsPath(AppliPath)
167 self.RscriptsPath = PathOut(dirout=os.path.join(AppliPath, 'Rscripts'))
168 self.RscriptsPath.basefiles(RscriptsPath)
169 #self.DictPath = ConstructDicoPath(AppliPath)
170 self.DictPath = ConstructDicoPath(UserConfigPath)
171 self.ConfigGlob = ConfigGlob
172 self.ConfigPath = ConstructConfigPath(UserConfigPath)
173 self.pref = RawConfigParser()
174 #workaround for import problem
175 self.SimiFromCluster = SimiFromCluster
177 gettext.install('iramuteq', os.path.join(AppliPath,'locale'), unicode=True)
178 #langues = ['fr_FR', 'en', 'pt_PT']
181 self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
182 self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
184 # tell FrameManager to manage this frame
185 #self._mgr = wx.aui.AuiManager()
186 self._mgr = aui.AuiManager()
187 self._mgr.SetManagedWindow(self)
190 #--------------------------------------------------------------------------------
191 self.mb = wx.MenuBar()
193 file_menu = wx.Menu()
194 item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8'))
195 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
196 file_menu.AppendItem(item)
198 item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8'))
199 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
200 file_menu.AppendItem(item)
202 item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
203 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
204 file_menu.AppendItem(item)
207 menuFactiva = wx.Menu()
208 fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml").decode('utf8'))
209 fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
210 fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
211 menuFactiva.AppendItem(fact_from_xml)
212 menuFactiva.AppendItem(fact_from_mail)
213 menuFactiva.AppendItem(fact_from_txt)
214 file_menu.AppendMenu(-1, _(u"Import from factiva").decode('utf8'), menuFactiva)
216 item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8'))
217 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
218 file_menu.AppendItem(item)
220 menuTools = wx.Menu()
221 splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
222 extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
223 extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
224 menuTools.AppendItem(splitvar)
225 menuTools.AppendItem(extractmod)
226 menuTools.AppendItem(extractthem)
227 self.ID_splitvar = splitvar.GetId()
228 self.ID_extractmod = extractmod.GetId()
229 self.ID_extractthem = extractthem.GetId()
230 file_menu.AppendMenu(-1, _(u"Tools").decode('utf8'), menuTools)
233 #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
234 #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
235 #file_menu.AppendItem(item)
237 file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
239 edit_menu = wx.Menu()
240 edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences').decode('utf8'))
242 view_menu = wx.Menu()
243 view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
244 view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
245 view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
246 #view_menu.AppendSeparator()
247 matrix_menu = wx.Menu()
248 matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
249 matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
250 #matrix_menu.Append(ID_Student, u"t de Student")
251 menu_classif = wx.Menu()
252 menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
253 #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
254 matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
255 #matrix_menu.Append(ID_AFCM, u"AFCM")
256 matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
257 matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
258 ID_RCODE = wx.NewId()
259 matrix_menu.Append(ID_RCODE, u"Code R...")
260 #menu_splittab = wx.Menu()
261 #ID_SPLITVAR = wx.NewId()
262 #splitvar = wx.MenuItem(menu_splittab, ID_SPLITVAR, _(u"Split from variable").decode('utf8'))
263 #menu_splittab.AppendItem(splitvar)
264 #matrix_menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), menu_splittab)
265 self.matrix_menu = matrix_menu
267 text_menu = wx.Menu()
268 #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
269 text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
270 text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
271 #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
272 menu_classiftxt = wx.Menu()
273 menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
274 #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
275 text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
276 text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'))
278 text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
279 self.text_menu = text_menu
281 help_menu = wx.Menu()
282 help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
283 help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
285 self.mb.Append(file_menu, _(u"File").decode('utf8'))
286 self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
287 self.mb.Append(view_menu, _(u"View").decode('utf8'))
288 self.mb.Append(matrix_menu, _(u"Matrix analysis").decode('utf8'))
289 self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
290 self.mb.Append(help_menu, _(u"Help").decode('utf8'))
292 self.SetMenuBar(self.mb)
293 #--------------------------------------------------------------------
294 self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
295 self.statusbar.SetStatusWidths([-2, -3])
296 self.statusbar.SetStatusText(u"Prêt", 0)
297 self.statusbar.SetStatusText(u"Bienvenue", 1)
299 # min size for the frame itself isn't completely done.
300 # see the end up FrameManager::Update() for the test
301 # code. For now, just hard code a frame minimum size
302 self.SetMinSize(wx.Size(400, 400))
304 # create some toolbars
305 tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
306 wx.TB_FLAT | wx.TB_NODIVIDER)
307 tb1.SetToolBitmapSize(wx.Size(16, 16))
308 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")
310 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")
314 #------------------------------------------------------------------------------------------------
316 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)
318 #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
319 # Name("Text").CenterPane())
320 self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
321 Name("Text").CenterPane())
322 #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
324 self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
326 #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
327 # with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
329 self.history = History(os.path.join(UserConfigPath, 'history.db'))
330 self.tree = LeftTree(self)
331 self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Navigator").decode('utf8')).
332 Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
333 MinimizeButton(True))
335 #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)
336 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)
337 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
338 self.nb.SetAGWWindowStyleFlag(notebook_flags)
339 self.nb.SetArtProvider(aui.ChromeTabArt())
340 #self.nb.SetArtProvider(aui.VC8TabArt())
341 #self.nb.parent = self
342 #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
343 #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
344 # Name("Tab_content").
346 self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
350 #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
351 #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
352 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
353 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
354 # add the toolbars to the manager
356 #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
357 # Name("tb1").Caption("Fichiers").
358 # ToolbarPane().Top().
359 # LeftDockable(False).RightDockable(False))
360 self._mgr.AddPane(tb1, aui.AuiPaneInfo().
361 Name("tb1").Caption("Fichiers").
363 LeftDockable(True).RightDockable(False))
365 self.ShowAPane("Intro_Text")
366 self._mgr.GetPane("lefttree").Show()
367 self._mgr.GetPane("classif_tb").Hide()
368 # "commit" all changes made to FrameManager
371 # Show How To Use The Closing Panes Event
372 ##################################################################
373 self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
374 self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
375 self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
376 self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
377 self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
378 self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
379 self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
380 self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
381 self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
382 self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
383 self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
384 self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
385 self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
386 self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
387 self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
388 self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
389 self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
390 self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
391 self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
392 self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
393 #self.Bind(wx.EVT_MENU, self.OnSplitVar, id=ID_SPLITVAR)
394 #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
395 self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
396 self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
397 self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
398 self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
399 self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
400 self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
401 self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
402 self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
403 self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
404 #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
405 self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
406 self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
407 self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
408 self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM)
409 self.Bind(wx.EVT_CLOSE, self.OnClose)
410 ##################################################################
411 flags = self._mgr.GetAGWFlags()
412 #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
413 #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
414 #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
415 flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
416 self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
417 self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
418 self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
421 self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
422 self.SetIcon(self._icon)
423 ##########################
425 self.input_path = [False]
426 self.TEMPDIR = tempfile.mkdtemp('iramuteq')
427 self.FileTabList = []
433 self.g_header = False
440 self.SysEncoding = sys.getdefaultencoding()
441 self.syscoding = sys.getdefaultencoding()
442 #print 'SysEncoding',self.SysEncoding
443 if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
446 ##############################################################@
447 self.DisEnSaveTabAs(False)
448 self.ShowMenu(_("View").decode('utf8'), False)
449 self.ShowMenu(_("Matrix analysis").decode('utf8'), False)
450 self.ShowMenu(_("Text analysis").decode('utf8'), False)
461 def finish_init(self) :
463 self.pref.read(self.ConfigPath['preferences'])
466 self.pref.read(self.ConfigPath['preferences'])
473 self.pref.read(self.ConfigPath['preferences'])
475 self.sound = self.pref.getboolean('iramuteq', 'sound')
476 self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
477 self.version = ConfigGlob.get('DEFAULT', 'version')
478 #configuration des chemins de R
479 self.PathPath = ConfigParser()
480 self.PathPath.read(ConfigPath['path'])
482 if not CheckRPath(self.PathPath) :
483 if sys.platform == 'win32':
484 BestRPath = FindRPAthWin32()
486 BestRPath = FindRPathNix()
488 self.PathPath.set('PATHS', 'rpath', BestRPath)
489 with open(ConfigPath['path'], 'w') as f :
490 self.PathPath.write(f)
494 self.RPath = self.PathPath.get('PATHS', 'rpath')
497 if not RLibsAreInstalled(self) :
501 Le chemin de l'executable de R n'a pas été trouvé.
502 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
503 Si R n'est pas installé dans le répertoire par défaut
504 (souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
505 vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
506 dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
508 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
513 def setlangue(self) :
515 self.pref.read(self.ConfigPath['preferences'])
516 guilangue = self.pref.get('iramuteq', 'guilanguage')
517 if guilangue == 'french' :
518 self.presLan_fr.install()
519 elif guilangue == 'portuguese' :
520 self.presLan_pt.install()
522 self.presLan_en.install()
523 mylocale = wx.Locale(langues[guilangue])
524 mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
525 mylocale.AddCatalog('iramuteq')
527 self.presLan_fr.install()
528 mylocale = wx.Locale(langues['french'])
529 mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
530 mylocale.AddCatalog('iramuteq')
533 def OnVerif(self, evt) :
534 pack = CheckRPackages(self)
536 dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION)
538 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
541 def DisEnSaveTabAs(self, DISEN):
543 file_menu = self.mb.GetMenu(0)
544 items = file_menu.GetMenuItems()
546 if item.GetId() == ID_SaveTab :
549 def ShowMenu(self, menu, Show=True):
550 menu_pos = self.mb.FindMenu(menu)
551 self.mb.EnableTop(menu_pos, Show)
552 self.mb.UpdateMenus()
555 #--------------------------------------------------------------------
556 def OnClose(self, event):
558 with open(self.ConfigPath['path'], 'w') as f :
559 self.PathPath.write(f)
564 def OnOpenData(self, event):
565 inputname, self.input_path = OnOpen(self, "Data")
567 #filename = self.input_path[0]
568 self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
569 val = get_table_param(self, self.input_path[0])
571 self.tableau.make_content()
572 OpenAnalyse(self, self.tableau.parametres)
573 self.tree.OnItemAppend(self.tableau.parametres)
574 #self.tableau.show_tab()
576 def OnOpenAnalyse(self, event):
577 self.AnalysePath = OnOpen(self, "Analyse")
578 OpenAnalyse(self, self.AnalysePath[1][0], True)
579 self.ShowMenu(_("View"))
581 def OnOpenText(self, event):
582 inputname, self.input_path = OnOpen(self, "Texte")
583 self.filename = self.input_path[0]
587 def OnViewData(self, event):
590 if self.type == "Data":
591 if not self.DataPop :
592 self.Sheet.Populate(self.content)
595 self.ShowAPane(u"Data")
596 elif self.type == "Texte" or self.type == 'Analyse' :
597 if not self.DataTxt :
598 self.text_ctrl_txt.Clear()
599 self.text_ctrl_txt.write(self.content)
600 self.text_ctrl_txt.ShowPosition(0)
603 self.ShowAPane(u"Text")
606 def OnSubText(self, corpus, parametres = None):
608 corpus = self.tree.getcorpus()
609 builder = SubBuilder(self, corpus, parametres)
610 if builder.res == wx.ID_OK :
611 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
613 corpus = builder.doanalyse()
614 self.history.add(corpus.parametres)
615 self.tree.OnItemAppend(corpus.parametres)
616 OpenAnalyse(self, corpus.parametres)
620 dlg = wx.ProgressDialog("Ouverture...",
621 "Veuillez patienter...",
624 style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
627 builder = Builder(self, dlg)
628 if builder.res == wx.ID_OK :
630 corpus = builder.doanalyse()
631 self.history.add(corpus.parametres)
632 self.tree.OnItemAppend(corpus.parametres)
633 OpenAnalyse(self, corpus.parametres)
638 keepGoing = dlg.Update(count, u"Lecture du fichier")
639 self.ShowMenu(_(u"View").decode('utf8'))
640 self.ShowMenu(_(u"Text analysis").decode('utf8'))
641 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
646 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
648 #self.OnViewData(wx.EVT_BUTTON)
650 def OnExit(self, event):
653 def OnAbout(self, event):
654 info = wx.AboutDialogInfo()
655 info.Name = ConfigGlob.get('DEFAULT', 'name')
656 info.Version = ConfigGlob.get('DEFAULT', 'version')
657 info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
658 info.Description = u"""
659 Interface de R pour les Analyses Multidimensionnelles
660 de Textes et de Questionnaires
663 construit avec des logiciels libres.
669 info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
670 dev = ConfigGlob.get('DEFAULT', 'dev').decode('utf8').split(';')
671 info.Developers = dev
672 info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier
673 suivant les termes de la Licence Publique Générale GNU telle que publiée
674 par la Free Software Foundation ; soit la version 2 de cette licence,
675 soit (à votre convenance) une version ultérieure.
677 Iramuteq est diffusé dans l'espoir qu'il sera utile,
678 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite
679 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER.
680 Voyez la Licence Publique Générale GNU pour plus de détails.
682 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
683 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
684 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
687 def GetDockArt(self):
688 return self._mgr.GetArtProvider()
693 def OnPageChanged(self, event) :
694 new = event.GetSelection()
695 nobject = event.GetEventObject()
696 parent = nobject.GetParent()
697 if isinstance(parent, IraFrame) :
698 npage = self.nb.GetPage(new)
699 if 'parametres' in dir(npage) :
700 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
701 if npage.parametres.get('matrix', False) :
702 self.ShowMenu(_(u"Text analysis").decode('utf8'), False)
703 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), True)
704 elif npage.parametres.get('corpus', False) :
705 self.ShowMenu(_(u"Text analysis").decode('utf8'))
706 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
708 def OnCloseTab(self, evt):
709 #log.info('Closing tab %s' % str(evt.GetEventObject()))
710 ctrl = evt.GetEventObject()
711 if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
715 page = self.nb.GetPage(self.nb.GetSelection())
716 if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
717 self.history.rmtab(page.parametres)
718 self.tree.CloseItem(uuid = page.parametres['uuid'])
719 TabTitle = self.nb.GetPageText(self.nb.GetSelection())
720 # if self.DictTab != {} :
721 # if TabTitle in self.DictTab :
722 # ListFile=self.DictTab[TabTitle]
723 # if False in ListFile:
725 # Certains résultats ne sont pas enregistrer.
726 # Voulez-vous fermer quand même ?"""
727 # dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
729 # dlg.CenterOnParent()
730 # if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
735 # for f in ListFile[1:] :
740 # elif True in ListFile :
743 # del self.DictTab[TabTitle]
745 # self.LastTabClose()
748 if self.nb.GetPageCount() == 1 and not notebook :
751 def LastTabClose(self) :
752 if self.nb.GetPageCount() == 1 :
753 #self.DisEnSaveTabAs(False)
755 self.ShowAPane("Text")
757 self.ShowAPane("Data")
759 self.ShowAPane("Intro_Text")
761 # def OnSaveTabAs(self, event):
762 # SelectTab = self.nb.GetSelection()
763 # TabTitle = self.nb.GetPageText(SelectTab)
764 # FileToSave = self.DictTab[TabTitle]
766 # dlg = wx.FileDialog(
767 # self, message="Enregistrer sous...", defaultDir=os.getcwd(),
768 # defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
770 # dlg.SetFilterIndex(2)
771 # dlg.CenterOnParent()
773 # if dlg.ShowModal() == wx.ID_OK:
774 # Path = dlg.GetPath()
775 # Dirname = os.path.dirname(Path)
776 # Filename = dlg.GetFilename()
781 # shutil.copyfile(FileToSave[-1], Path)
782 # os.remove(FileToSave[len(FileToSave) - 1])
783 # NewListFile.append(True)
784 # NewListFile.append(Path)
785 # for f in FileToSave[1:-1] :
786 # Fileout = os.path.join(Dirname, os.path.basename(f))
787 # shutil.copyfile(f, Fileout)
788 # NewListFile.append(Fileout)
791 # self.DictTab[TabText] = NewListFile
792 # del self.DictTab[TabTitle]
793 # self.nb.SetPageText(SelectTab, TabText)
795 def GetStartPosition(self):
799 pt = self.ClientToScreen(wx.Point(0, 0))
801 return wx.Point(pt.x + x, pt.y + x)
803 def ShowAPane(self, panel):
804 for pane in self._mgr.GetAllPanes() :
805 if not pane.IsToolbar() and pane.name != 'lefttree':
807 self._mgr.GetPane(panel).Show()
810 def OnAcceuil(self, event):
811 self.ShowAPane(u"Intro_Text")
814 def CreateHTMLCtrl(self):
815 ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
816 if "gtk2" in wx.PlatformInfo:
817 ctrl.SetStandardFonts()
818 ctrl.SetPage(u"text")
821 def ShowTab(self, evt):
822 self.ShowAPane("Tab_content")
824 ################################################################
826 ################################################################
827 def analyse_matrix(self, analyse, analyse_type = '', matrix = None, dlgnb = 1):
829 matrix = self.tree.getmatrix()
831 analyse(self, matrix, parametres = {'type' : analyse_type}, dlg = progressbar(self, dlgnb))
835 def OnFreq(self, event, matrix = None):
836 self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
838 # matrix = self.tree.getmatrix()
840 # Frequences(self, matrix, parametres = {'type' : 'freq'}, dlg = progressbar(self, 3))
844 def OnChi2(self, event, matrix = None):
846 self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3)
850 def OnSimiTab(self, event, matrix = None):
852 matrix = self.tree.getmatrix()
854 DoSimi(self, matrix, parametres = {'type' : 'simimatrix'}, dlg = progressbar(self, 3))
858 def OnCHDReinert(self, event, matrix = None):
860 matrix = self.tree.getmatrix()
861 AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = progressbar(self, 3))
863 def OnStudent(self, event):
869 def OnRCode(self, event):
875 def OnCHDSIM(self, event):
877 # print 'ATTENTION!!!!'
878 chdsim = ChdCluster(self)
879 if chdsim.val == wx.ID_OK:
884 # def OnCHDReinert(self, event):
886 # # print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
887 # self.quest = AnalyseQuest(self)
888 # if self.quest.val == wx.ID_OK:
893 def OnProto(self, evt, matrix = None) :
894 self.analyse_matrix(Prototypical, matrix = matrix, analyse_type = 'proto', dlgnb = 3)
895 #Prototypical(self, {'type' : 'proto'})
897 def OnSplitVar(self, evt, matrix = None):
898 self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', dlgnb = 3)
899 matrix = self.tree.getmatrix()
902 def OnSimiTxt(self, evt, corpus = None) :
903 # print 'PLUS DE BUG SUR SIMITXT'
905 #self.Text = SimiTxt(self)
907 corpus = self.tree.getcorpus()
908 self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = 3)
909 if self.Text.val == wx.ID_OK :
914 def OnWordCloud(self, evt, corpus = None) :
915 # print 'PLUS DE BUG SUR WORDCLOUD'
918 corpus = self.tree.getcorpus()
919 self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = 3)
920 if self.Text.val == wx.ID_OK :
925 def OnClusterCloud(self, corpus, parametres = None) :
926 self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = 3)
928 def OnAFCM(self, event):
934 def OnTextStat(self, event, corpus = None):
935 #print 'PAS DE BUG SUR TEXT STAT'
938 corpus = self.tree.getcorpus()
939 self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = 7)
941 if self.Text.val == wx.ID_OK :
946 def OnTextSpec(self, event, corpus = None):
948 #self.Text = AsLexico(self)
949 #print('ATTENTION : PLUS DE BUG SUR LEXICO')
951 corpus = self.tree.getcorpus()
952 self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = 3)
953 if self.Text.val == wx.ID_OK :
958 def OnTextAfcm(self, event):
965 def import_factiva_xml(self,event):
967 ImportFactiva(self, 'xml')
971 def import_factiva_mail(self, evt) :
973 ImportFactiva(self, 'mail')
977 def import_factiva_txt(self, evt) :
979 ImportFactiva(self, 'txt')
983 def OnImportTXM(self, evt) :
985 ImportFactiva(self, 'txm')
989 def ExtractTools(self, evt) :
991 if ID == self.ID_splitvar :
992 Extract(self, 'splitvar')
993 elif ID == self.ID_extractmod :
994 Extract(self, 'mods')
995 elif ID == self.ID_extractthem :
996 Extract(self, 'them')
998 def OnTextReinert(self, event, corpus = None):
1000 #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
1001 #RunAnalyse(self, corpus, Alceste, OptAlceste)
1003 corpus = self.tree.getcorpus()
1004 self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6)
1005 if self.Text.val == wx.ID_OK:
1010 def OnPamSimple(self, event, corpus = None):
1013 corpus = self.tree.getcorpus()
1014 self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = 6)
1015 if self.Text.val == wx.ID_OK:
1020 def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
1021 DoSimi(self, param = parametres, fromprof = fromprof, listactives = listactives, actives = actives, tableau = tableau)
1023 # def OnSimi(self,evt):
1025 #print 'ATTENTION !!!! VERGES'
1026 #print 'PLUS DE BUG SUR SIMI'
1027 # self.res = DoSimi(self, param = None)
1028 #self.res = Verges(self)
1029 # if self.res.val == wx.ID_OK :
1033 #################################################################
1035 def OnHelp(self, event):
1036 webbrowser.open('http://www.iramuteq.org/documentation')
1038 def OnPref(self, event):
1039 dlg = PrefDialog(self)
1040 dlg.CenterOnParent()
1041 self.val = dlg.ShowModal()
1044 if self.check_update:
1047 print 'pas de verif'
1049 #CheckRPackages(self)
1051 def OnOpenFromCmdl(self):
1053 if options.filename :
1054 if os.path.exists(options.filename):
1055 self.filename = os.path.abspath(options.filename)
1059 if os.path.exists(os.path.realpath(args[0])):
1060 self.filename = os.path.abspath(os.path.realpath(args[0]))
1066 if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1067 self.tableau = Tableau(self, self.filename)
1068 val = get_table_param(self, self.filename)
1069 if val == wx.ID_OK :
1070 self.tableau.make_content()
1071 OpenAnalyse(self, self.tableau.parametres)
1072 self.tree.OnItemAppend(self.tableau.parametres)
1073 #get_table_param(self, self.filename)
1074 #self.tableau.make_content()
1075 #self.tableau.show_tab()
1076 #open_data(self, self.filename)
1077 elif os.path.splitext(self.filename)[1] == '.txt':
1079 elif os.path.splitext(self.filename)[1] == '.ira' :
1080 #self.corpus = Corpus(self)
1081 #self.Text = OpenAnalyse(self, self.filename)
1082 OpenAnalyse(self, self.filename)
1084 print 'ce fichier n\'existe pas'
1088 class IntroPanel(wx.Panel):
1089 def __init__(self, parent):
1090 wx.Panel.__init__(self, parent)
1091 col = randint(0, 255)
1092 col1 = randint(0,255)
1093 col2 = randint(0,255)
1095 bckgrdcolor = wx.Colour(col, col1, col2)
1096 self.SetBackgroundColour(bckgrdcolor)
1097 txtcolour = wx.Colour(250, 250, 250)
1098 linkcolor = wx.Colour(255, 0, 0)
1099 sizer1 = wx.BoxSizer(wx.VERTICAL)
1100 sizer2 = wx.BoxSizer(wx.VERTICAL)
1101 sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1102 sizer4 = wx.BoxSizer(wx.VERTICAL)
1103 sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1104 grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1105 grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1106 grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1107 PanelPres = wx.Panel(self)
1108 PanelPres.SetBackgroundColour(bckgrdcolor)
1109 label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1110 label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1111 label_1.SetForegroundColour(wx.RED)
1112 label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1113 label2.SetForegroundColour(txtcolour)
1114 label2.SetBackgroundColour(bckgrdcolor)
1115 #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1116 #label3.SetForegroundColour(txtcolour)
1117 #label3.SetBackgroundColour(bckgrdcolor)
1118 self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1119 self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1120 self.hyper2.SetBackgroundColour(bckgrdcolor)
1121 self.hyper2.EnableRollover(True)
1122 self.hyper2.SetUnderlines(False, False, True)
1123 self.hyper2.SetBold(True)
1124 self.hyper2.UpdateLink()
1125 label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1126 label_lerass.SetForegroundColour(txtcolour)
1127 label_lerass.SetBackgroundColour(bckgrdcolor)
1128 self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1129 self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1130 self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1131 self.hyper_lerass.EnableRollover(True)
1132 self.hyper_lerass.SetUnderlines(False, False, True)
1133 self.hyper_lerass.SetBold(True)
1134 self.hyper_lerass.UpdateLink()
1135 blank = wx.StaticText(PanelPres, -1, u'\n')
1136 blank1 = wx.StaticText(PanelPres, -1, u'\n')
1137 labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1138 labellicence.SetForegroundColour(txtcolour)
1139 labellicence.SetBackgroundColour(bckgrdcolor)
1140 labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1141 labelcopy.SetForegroundColour(txtcolour)
1142 labelcopy.SetBackgroundColour(bckgrdcolor)
1143 python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1144 r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1145 lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1146 but_python = wx.BitmapButton(self, -1, python_img)
1147 but_lexique = wx.BitmapButton(self, -1, lexique_img)
1148 but_r = wx.BitmapButton(self, -1, r_img)
1149 self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1150 self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1151 self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1154 #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1155 grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1156 grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1157 grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1158 sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1159 sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1160 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1161 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1162 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1163 sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1164 sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1165 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1166 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1167 sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1168 sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1169 sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1170 sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1171 PanelPres.SetSizer(sizer2)
1172 sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1173 sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1174 sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1175 grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1176 grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1177 grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1179 sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1180 sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1181 self.SetSizer(sizer1)
1184 def OnPython(self,evt):
1185 webbrowser.open('http://www.python.org')
1187 def OnLexique(self,evt):
1188 webbrowser.open('http://www.lexique.org')
1191 webbrowser.open('http://www.r-project.org')
1193 class MySplashScreen(wx.SplashScreen):
1195 bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1196 wx.SplashScreen.__init__(self, bmp,
1197 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1199 self.Bind(wx.EVT_CLOSE, self.OnClose)
1200 self.fc = wx.FutureCall(1, self.ShowMain)
1202 def OnClose(self, evt):
1206 if self.fc.IsRunning():
1211 displaySize = wx.DisplaySize()
1212 w = displaySize[0]/1.2
1213 h = displaySize[1]/1.2
1214 frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1218 frame.OnOpenFromCmdl()
1219 # if self.fc.IsRunning():
1221 #wx.CallAfter(frame.ShowTip)
1223 class MyApp(wx.App):
1226 Create and show the splash screen. It will then create and show
1227 the main frame when it is time to do so.
1229 wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1230 self.SetAppName("Iramuteq")
1231 splash = MySplashScreen()
1239 if __name__ == '__main__':