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 = dlgnb)
835 def OnFreq(self, event, matrix = None):
836 self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
838 def OnChi2(self, event, matrix = None):
839 self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3)
841 def OnSimiTab(self, event, matrix = None):
842 self.analyse_matrix(DoSimi, matrix = matrix, analyse_type = 'simimatrix', dlgnb = 5)
844 def OnCHDReinert(self, event, matrix = None):
846 matrix = self.tree.getmatrix()
847 AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = progressbar(self, 3))
849 def OnStudent(self, event):
855 def OnRCode(self, event):
861 def OnCHDSIM(self, event):
863 # print 'ATTENTION!!!!'
864 chdsim = ChdCluster(self)
865 if chdsim.val == wx.ID_OK:
870 # def OnCHDReinert(self, event):
872 # # print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
873 # self.quest = AnalyseQuest(self)
874 # if self.quest.val == wx.ID_OK:
879 def OnProto(self, evt, matrix = None) :
880 self.analyse_matrix(Prototypical, matrix = matrix, analyse_type = 'proto', dlgnb = 3)
881 #Prototypical(self, {'type' : 'proto'})
883 def OnSplitVar(self, evt, matrix = None):
884 self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', dlgnb = 3)
885 matrix = self.tree.getmatrix()
888 def OnSimiTxt(self, evt, corpus = None) :
889 # print 'PLUS DE BUG SUR SIMITXT'
891 #self.Text = SimiTxt(self)
893 corpus = self.tree.getcorpus()
894 self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = 3)
895 if self.Text.val == wx.ID_OK :
900 def OnWordCloud(self, evt, corpus = None) :
901 # print 'PLUS DE BUG SUR WORDCLOUD'
904 corpus = self.tree.getcorpus()
905 self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = 3)
906 if self.Text.val == wx.ID_OK :
911 def OnClusterCloud(self, corpus, parametres = None) :
912 self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = 3)
914 def OnAFCM(self, event):
920 def OnTextStat(self, event, corpus = None):
921 #print 'PAS DE BUG SUR TEXT STAT'
924 corpus = self.tree.getcorpus()
925 self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = 7)
927 if self.Text.val == wx.ID_OK :
932 def OnTextSpec(self, event, corpus = None):
934 #self.Text = AsLexico(self)
935 #print('ATTENTION : PLUS DE BUG SUR LEXICO')
937 corpus = self.tree.getcorpus()
938 self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = 3)
939 if self.Text.val == wx.ID_OK :
944 def OnTextAfcm(self, event):
951 def import_factiva_xml(self,event):
953 ImportFactiva(self, 'xml')
957 def import_factiva_mail(self, evt) :
959 ImportFactiva(self, 'mail')
963 def import_factiva_txt(self, evt) :
965 ImportFactiva(self, 'txt')
969 def OnImportTXM(self, evt) :
971 ImportFactiva(self, 'txm')
975 def ExtractTools(self, evt) :
977 if ID == self.ID_splitvar :
978 Extract(self, 'splitvar')
979 elif ID == self.ID_extractmod :
980 Extract(self, 'mods')
981 elif ID == self.ID_extractthem :
982 Extract(self, 'them')
984 def OnTextReinert(self, event, corpus = None):
986 #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
987 #RunAnalyse(self, corpus, Alceste, OptAlceste)
989 corpus = self.tree.getcorpus()
990 self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6)
991 if self.Text.val == wx.ID_OK:
996 def OnPamSimple(self, event, corpus = None):
999 corpus = self.tree.getcorpus()
1000 self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = 6)
1001 if self.Text.val == wx.ID_OK:
1006 def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
1007 DoSimi(self, param = parametres, fromprof = fromprof, listactives = listactives, actives = actives, tableau = tableau)
1009 # def OnSimi(self,evt):
1011 #print 'ATTENTION !!!! VERGES'
1012 #print 'PLUS DE BUG SUR SIMI'
1013 # self.res = DoSimi(self, param = None)
1014 #self.res = Verges(self)
1015 # if self.res.val == wx.ID_OK :
1019 #################################################################
1021 def OnHelp(self, event):
1022 webbrowser.open('http://www.iramuteq.org/documentation')
1024 def OnPref(self, event):
1025 dlg = PrefDialog(self)
1026 dlg.CenterOnParent()
1027 self.val = dlg.ShowModal()
1030 if self.check_update:
1033 print 'pas de verif'
1035 #CheckRPackages(self)
1037 def OnOpenFromCmdl(self):
1039 if options.filename :
1040 if os.path.exists(options.filename):
1041 self.filename = os.path.abspath(options.filename)
1045 if os.path.exists(os.path.realpath(args[0])):
1046 self.filename = os.path.abspath(os.path.realpath(args[0]))
1052 if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1053 self.tableau = Tableau(self, self.filename)
1054 val = get_table_param(self, self.filename)
1055 if val == wx.ID_OK :
1056 self.tableau.make_content()
1057 OpenAnalyse(self, self.tableau.parametres)
1058 self.tree.OnItemAppend(self.tableau.parametres)
1059 #get_table_param(self, self.filename)
1060 #self.tableau.make_content()
1061 #self.tableau.show_tab()
1062 #open_data(self, self.filename)
1063 elif os.path.splitext(self.filename)[1] == '.txt':
1065 elif os.path.splitext(self.filename)[1] == '.ira' :
1066 #self.corpus = Corpus(self)
1067 #self.Text = OpenAnalyse(self, self.filename)
1068 OpenAnalyse(self, self.filename)
1070 print 'ce fichier n\'existe pas'
1074 class IntroPanel(wx.Panel):
1075 def __init__(self, parent):
1076 wx.Panel.__init__(self, parent)
1077 col = randint(0, 255)
1078 col1 = randint(0,255)
1079 col2 = randint(0,255)
1081 bckgrdcolor = wx.Colour(col, col1, col2)
1082 self.SetBackgroundColour(bckgrdcolor)
1083 txtcolour = wx.Colour(250, 250, 250)
1084 linkcolor = wx.Colour(255, 0, 0)
1085 sizer1 = wx.BoxSizer(wx.VERTICAL)
1086 sizer2 = wx.BoxSizer(wx.VERTICAL)
1087 sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1088 sizer4 = wx.BoxSizer(wx.VERTICAL)
1089 sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1090 grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1091 grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1092 grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1093 PanelPres = wx.Panel(self)
1094 PanelPres.SetBackgroundColour(bckgrdcolor)
1095 label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1096 label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1097 label_1.SetForegroundColour(wx.RED)
1098 label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1099 label2.SetForegroundColour(txtcolour)
1100 label2.SetBackgroundColour(bckgrdcolor)
1101 #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1102 #label3.SetForegroundColour(txtcolour)
1103 #label3.SetBackgroundColour(bckgrdcolor)
1104 self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1105 self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1106 self.hyper2.SetBackgroundColour(bckgrdcolor)
1107 self.hyper2.EnableRollover(True)
1108 self.hyper2.SetUnderlines(False, False, True)
1109 self.hyper2.SetBold(True)
1110 self.hyper2.UpdateLink()
1111 label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1112 label_lerass.SetForegroundColour(txtcolour)
1113 label_lerass.SetBackgroundColour(bckgrdcolor)
1114 self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1115 self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1116 self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1117 self.hyper_lerass.EnableRollover(True)
1118 self.hyper_lerass.SetUnderlines(False, False, True)
1119 self.hyper_lerass.SetBold(True)
1120 self.hyper_lerass.UpdateLink()
1121 blank = wx.StaticText(PanelPres, -1, u'\n')
1122 blank1 = wx.StaticText(PanelPres, -1, u'\n')
1123 labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1124 labellicence.SetForegroundColour(txtcolour)
1125 labellicence.SetBackgroundColour(bckgrdcolor)
1126 labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1127 labelcopy.SetForegroundColour(txtcolour)
1128 labelcopy.SetBackgroundColour(bckgrdcolor)
1129 python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1130 r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1131 lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1132 but_python = wx.BitmapButton(self, -1, python_img)
1133 but_lexique = wx.BitmapButton(self, -1, lexique_img)
1134 but_r = wx.BitmapButton(self, -1, r_img)
1135 self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1136 self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1137 self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1140 #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1141 grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1142 grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1143 grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1144 sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1145 sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1146 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1147 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1148 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1149 sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1150 sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1151 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1152 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1153 sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1154 sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1155 sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1156 sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1157 PanelPres.SetSizer(sizer2)
1158 sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1159 sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1160 sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1161 grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1162 grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1163 grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1165 sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1166 sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1167 self.SetSizer(sizer1)
1170 def OnPython(self,evt):
1171 webbrowser.open('http://www.python.org')
1173 def OnLexique(self,evt):
1174 webbrowser.open('http://www.lexique.org')
1177 webbrowser.open('http://www.r-project.org')
1179 class MySplashScreen(wx.SplashScreen):
1181 bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1182 wx.SplashScreen.__init__(self, bmp,
1183 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1185 self.Bind(wx.EVT_CLOSE, self.OnClose)
1186 self.fc = wx.FutureCall(1, self.ShowMain)
1188 def OnClose(self, evt):
1192 if self.fc.IsRunning():
1197 displaySize = wx.DisplaySize()
1198 w = displaySize[0]/1.2
1199 h = displaySize[1]/1.2
1200 frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1204 frame.OnOpenFromCmdl()
1205 # if self.fc.IsRunning():
1207 #wx.CallAfter(frame.ShowTip)
1209 class MyApp(wx.App):
1212 Create and show the splash screen. It will then create and show
1213 the main frame when it is time to do so.
1215 wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1216 self.SetAppName("Iramuteq")
1217 splash = MySplashScreen()
1225 if __name__ == '__main__':