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 = 3)
848 self.analyse_matrix(AnalyseQuest, matrix = matrix, analyse_type = 'reinertmatrix', dlgnb = 5)
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, matrix = None) :
881 self.analyse_matrix(Prototypical, matrix = matrix, analyse_type = 'proto', dlgnb = 3)
882 #Prototypical(self, {'type' : 'proto'})
884 def OnSplitVar(self, evt, matrix = None):
885 self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', dlgnb = 3)
886 matrix = self.tree.getmatrix()
889 def OnSimiTxt(self, evt, corpus = None) :
890 # print 'PLUS DE BUG SUR SIMITXT'
892 #self.Text = SimiTxt(self)
894 corpus = self.tree.getcorpus()
895 self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = 3)
896 if self.Text.val == wx.ID_OK :
901 def OnWordCloud(self, evt, corpus = None) :
902 # print 'PLUS DE BUG SUR WORDCLOUD'
905 corpus = self.tree.getcorpus()
906 self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = 3)
907 if self.Text.val == wx.ID_OK :
912 def OnClusterCloud(self, corpus, parametres = None) :
913 self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = 3)
915 def OnAFCM(self, event):
921 def OnTextStat(self, event, corpus = None):
922 #print 'PAS DE BUG SUR TEXT STAT'
925 corpus = self.tree.getcorpus()
926 self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = 7)
928 if self.Text.val == wx.ID_OK :
933 def OnTextSpec(self, event, corpus = None):
935 #self.Text = AsLexico(self)
936 #print('ATTENTION : PLUS DE BUG SUR LEXICO')
938 corpus = self.tree.getcorpus()
939 self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = 3)
940 if self.Text.val == wx.ID_OK :
945 def OnTextAfcm(self, event):
952 def import_factiva_xml(self,event):
954 ImportFactiva(self, 'xml')
958 def import_factiva_mail(self, evt) :
960 ImportFactiva(self, 'mail')
964 def import_factiva_txt(self, evt) :
966 ImportFactiva(self, 'txt')
970 def OnImportTXM(self, evt) :
972 ImportFactiva(self, 'txm')
976 def ExtractTools(self, evt) :
978 if ID == self.ID_splitvar :
979 Extract(self, 'splitvar')
980 elif ID == self.ID_extractmod :
981 Extract(self, 'mods')
982 elif ID == self.ID_extractthem :
983 Extract(self, 'them')
985 def OnTextReinert(self, event, corpus = None):
987 #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
988 #RunAnalyse(self, corpus, Alceste, OptAlceste)
990 corpus = self.tree.getcorpus()
991 self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6)
992 if self.Text.val == wx.ID_OK:
997 def OnPamSimple(self, event, corpus = None):
1000 corpus = self.tree.getcorpus()
1001 self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = 6)
1002 if self.Text.val == wx.ID_OK:
1007 def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
1008 DoSimi(self, param = parametres, fromprof = fromprof, listactives = listactives, actives = actives, tableau = tableau)
1010 # def OnSimi(self,evt):
1012 #print 'ATTENTION !!!! VERGES'
1013 #print 'PLUS DE BUG SUR SIMI'
1014 # self.res = DoSimi(self, param = None)
1015 #self.res = Verges(self)
1016 # if self.res.val == wx.ID_OK :
1020 #################################################################
1022 def OnHelp(self, event):
1023 webbrowser.open('http://www.iramuteq.org/documentation')
1025 def OnPref(self, event):
1026 dlg = PrefDialog(self)
1027 dlg.CenterOnParent()
1028 self.val = dlg.ShowModal()
1031 if self.check_update:
1034 print 'pas de verif'
1036 #CheckRPackages(self)
1038 def OnOpenFromCmdl(self):
1040 if options.filename :
1041 if os.path.exists(options.filename):
1042 self.filename = os.path.abspath(options.filename)
1046 if os.path.exists(os.path.realpath(args[0])):
1047 self.filename = os.path.abspath(os.path.realpath(args[0]))
1053 if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1054 self.tableau = Tableau(self, self.filename)
1055 val = get_table_param(self, self.filename)
1056 if val == wx.ID_OK :
1057 self.tableau.make_content()
1058 OpenAnalyse(self, self.tableau.parametres)
1059 self.tree.OnItemAppend(self.tableau.parametres)
1060 #get_table_param(self, self.filename)
1061 #self.tableau.make_content()
1062 #self.tableau.show_tab()
1063 #open_data(self, self.filename)
1064 elif os.path.splitext(self.filename)[1] == '.txt':
1066 elif os.path.splitext(self.filename)[1] == '.ira' :
1067 #self.corpus = Corpus(self)
1068 #self.Text = OpenAnalyse(self, self.filename)
1069 OpenAnalyse(self, self.filename)
1071 print 'ce fichier n\'existe pas'
1075 class IntroPanel(wx.Panel):
1076 def __init__(self, parent):
1077 wx.Panel.__init__(self, parent)
1078 col = randint(0, 255)
1079 col1 = randint(0,255)
1080 col2 = randint(0,255)
1082 bckgrdcolor = wx.Colour(col, col1, col2)
1083 self.SetBackgroundColour(bckgrdcolor)
1084 txtcolour = wx.Colour(250, 250, 250)
1085 linkcolor = wx.Colour(255, 0, 0)
1086 sizer1 = wx.BoxSizer(wx.VERTICAL)
1087 sizer2 = wx.BoxSizer(wx.VERTICAL)
1088 sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1089 sizer4 = wx.BoxSizer(wx.VERTICAL)
1090 sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1091 grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1092 grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1093 grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1094 PanelPres = wx.Panel(self)
1095 PanelPres.SetBackgroundColour(bckgrdcolor)
1096 label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1097 label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1098 label_1.SetForegroundColour(wx.RED)
1099 label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1100 label2.SetForegroundColour(txtcolour)
1101 label2.SetBackgroundColour(bckgrdcolor)
1102 #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1103 #label3.SetForegroundColour(txtcolour)
1104 #label3.SetBackgroundColour(bckgrdcolor)
1105 self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1106 self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1107 self.hyper2.SetBackgroundColour(bckgrdcolor)
1108 self.hyper2.EnableRollover(True)
1109 self.hyper2.SetUnderlines(False, False, True)
1110 self.hyper2.SetBold(True)
1111 self.hyper2.UpdateLink()
1112 label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1113 label_lerass.SetForegroundColour(txtcolour)
1114 label_lerass.SetBackgroundColour(bckgrdcolor)
1115 self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1116 self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1117 self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1118 self.hyper_lerass.EnableRollover(True)
1119 self.hyper_lerass.SetUnderlines(False, False, True)
1120 self.hyper_lerass.SetBold(True)
1121 self.hyper_lerass.UpdateLink()
1122 blank = wx.StaticText(PanelPres, -1, u'\n')
1123 blank1 = wx.StaticText(PanelPres, -1, u'\n')
1124 labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1125 labellicence.SetForegroundColour(txtcolour)
1126 labellicence.SetBackgroundColour(bckgrdcolor)
1127 labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1128 labelcopy.SetForegroundColour(txtcolour)
1129 labelcopy.SetBackgroundColour(bckgrdcolor)
1130 python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1131 r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1132 lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1133 but_python = wx.BitmapButton(self, -1, python_img)
1134 but_lexique = wx.BitmapButton(self, -1, lexique_img)
1135 but_r = wx.BitmapButton(self, -1, r_img)
1136 self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1137 self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1138 self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1141 #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1142 grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1143 grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1144 grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1145 sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1146 sizer2.Add(label2, 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(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1150 sizer2.Add(grid_sizer_3, 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(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1154 sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1155 sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1156 sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1157 sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1158 PanelPres.SetSizer(sizer2)
1159 sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1160 sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1161 sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1162 grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1163 grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1164 grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1166 sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1167 sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1168 self.SetSizer(sizer1)
1171 def OnPython(self,evt):
1172 webbrowser.open('http://www.python.org')
1174 def OnLexique(self,evt):
1175 webbrowser.open('http://www.lexique.org')
1178 webbrowser.open('http://www.r-project.org')
1180 class MySplashScreen(wx.SplashScreen):
1182 bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1183 wx.SplashScreen.__init__(self, bmp,
1184 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1186 self.Bind(wx.EVT_CLOSE, self.OnClose)
1187 self.fc = wx.FutureCall(1, self.ShowMain)
1189 def OnClose(self, evt):
1193 if self.fc.IsRunning():
1198 displaySize = wx.DisplaySize()
1199 w = displaySize[0]/1.2
1200 h = displaySize[1]/1.2
1201 frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1205 frame.OnOpenFromCmdl()
1206 # if self.fc.IsRunning():
1208 #wx.CallAfter(frame.ShowTip)
1210 class MyApp(wx.App):
1213 Create and show the splash screen. It will then create and show
1214 the main frame when it is time to do so.
1216 wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1217 self.SetAppName("Iramuteq")
1218 splash = MySplashScreen()
1226 if __name__ == '__main__':