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 'portuguese' : wx.LANGUAGE_PORTUGUESE,
154 'italian' : wx.LANGUAGE_ITALIAN,
155 'spanish' : wx.LANGUAGE_SPANISH}
157 code_langues = {'french' : 'fr_FR',
159 'portuguese' : 'pt_PT',
163 #####################################################################
165 class IraFrame(wx.Frame):
166 def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
167 size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE |
170 log.info('Starting...')
171 wx.Frame.__init__(self, parent, id, title, pos, size, style)
173 self.AppliPath = AppliPath
174 self.images_path = os.path.join(AppliPath,'images')
175 self.UserConfigPath = UserConfigPath
176 #self.RscriptsPath = ConstructRscriptsPath(AppliPath)
177 self.RscriptsPath = PathOut(dirout=os.path.join(AppliPath, 'Rscripts'))
178 self.RscriptsPath.basefiles(RscriptsPath)
179 #self.DictPath = ConstructDicoPath(AppliPath)
180 self.DictPath = ConstructDicoPath(UserConfigPath)
181 self.ConfigGlob = ConfigGlob
182 self.ConfigPath = ConstructConfigPath(UserConfigPath)
183 self.pref = RawConfigParser()
184 #workaround for import problem
185 self.SimiFromCluster = SimiFromCluster
187 gettext.install('iramuteq', os.path.join(AppliPath,'locale'), unicode=True)
188 #langues = ['fr_FR', 'en', 'pt_PT']
192 for langue in code_langues :
193 self.preslangue[langue] = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=[code_langues[langue]])
195 #self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
196 #self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
198 # tell FrameManager to manage this frame
199 #self._mgr = wx.aui.AuiManager()
200 self._mgr = aui.AuiManager()
201 self._mgr.SetManagedWindow(self)
204 #--------------------------------------------------------------------------------
205 self.mb = wx.MenuBar()
207 file_menu = wx.Menu()
208 item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8'))
209 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
210 file_menu.AppendItem(item)
212 item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8'))
213 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
214 file_menu.AppendItem(item)
216 item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
217 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
218 file_menu.AppendItem(item)
221 menuFactiva = wx.Menu()
222 fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml").decode('utf8'))
223 fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
224 fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
225 menuFactiva.AppendItem(fact_from_xml)
226 menuFactiva.AppendItem(fact_from_mail)
227 menuFactiva.AppendItem(fact_from_txt)
228 file_menu.AppendMenu(-1, _(u"Import from factiva").decode('utf8'), menuFactiva)
230 item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8'))
231 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
232 file_menu.AppendItem(item)
234 menuTools = wx.Menu()
235 splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
236 extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
237 extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
238 menuTools.AppendItem(splitvar)
239 menuTools.AppendItem(extractmod)
240 menuTools.AppendItem(extractthem)
241 self.ID_splitvar = splitvar.GetId()
242 self.ID_extractmod = extractmod.GetId()
243 self.ID_extractthem = extractthem.GetId()
244 file_menu.AppendMenu(-1, _(u"Tools").decode('utf8'), menuTools)
247 #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
248 #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
249 #file_menu.AppendItem(item)
251 file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
253 edit_menu = wx.Menu()
254 edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences').decode('utf8'))
256 view_menu = wx.Menu()
257 view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
258 view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
259 view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
260 #view_menu.AppendSeparator()
261 matrix_menu = wx.Menu()
262 matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
263 matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
264 #matrix_menu.Append(ID_Student, u"t de Student")
265 menu_classif = wx.Menu()
266 menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
267 #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
268 matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
269 #matrix_menu.Append(ID_AFCM, u"AFCM")
270 matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
271 matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
272 ID_RCODE = wx.NewId()
273 matrix_menu.Append(ID_RCODE, u"Code R...")
274 #menu_splittab = wx.Menu()
275 #ID_SPLITVAR = wx.NewId()
276 #splitvar = wx.MenuItem(menu_splittab, ID_SPLITVAR, _(u"Split from variable").decode('utf8'))
277 #menu_splittab.AppendItem(splitvar)
278 #matrix_menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), menu_splittab)
279 self.matrix_menu = matrix_menu
281 text_menu = wx.Menu()
282 #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
283 text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
284 text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
285 #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
286 menu_classiftxt = wx.Menu()
287 menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
288 #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
289 text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
290 text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'))
292 text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
293 self.text_menu = text_menu
295 help_menu = wx.Menu()
296 help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
297 help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
299 self.mb.Append(file_menu, _(u"File").decode('utf8'))
300 self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
301 self.mb.Append(view_menu, _(u"View").decode('utf8'))
302 self.mb.Append(matrix_menu, _(u"Matrix analysis").decode('utf8'))
303 self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
304 self.mb.Append(help_menu, _(u"Help").decode('utf8'))
306 self.SetMenuBar(self.mb)
307 #--------------------------------------------------------------------
308 self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
309 self.statusbar.SetStatusWidths([-2, -3])
310 self.statusbar.SetStatusText(u"Prêt", 0)
311 self.statusbar.SetStatusText(u"Bienvenue", 1)
313 # min size for the frame itself isn't completely done.
314 # see the end up FrameManager::Update() for the test
315 # code. For now, just hard code a frame minimum size
316 self.SetMinSize(wx.Size(400, 400))
318 # create some toolbars
319 tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
320 wx.TB_FLAT | wx.TB_NODIVIDER)
321 tb1.SetToolBitmapSize(wx.Size(16, 16))
322 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")
324 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")
328 #------------------------------------------------------------------------------------------------
330 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)
332 #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
333 # Name("Text").CenterPane())
334 self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
335 Name("Text").CenterPane())
336 #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
338 self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
340 #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
341 # with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
343 self.history = History(os.path.join(UserConfigPath, 'history.db'))
344 self.tree = LeftTree(self)
345 self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Navigator").decode('utf8')).
346 Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
347 MinimizeButton(True))
349 #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)
350 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)
351 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
352 self.nb.SetAGWWindowStyleFlag(notebook_flags)
353 self.nb.SetArtProvider(aui.ChromeTabArt())
354 #self.nb.SetArtProvider(aui.VC8TabArt())
355 #self.nb.parent = self
356 #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
357 #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
358 # Name("Tab_content").
360 self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
364 #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
365 #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
366 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
367 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
368 # add the toolbars to the manager
370 #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
371 # Name("tb1").Caption("Fichiers").
372 # ToolbarPane().Top().
373 # LeftDockable(False).RightDockable(False))
374 self._mgr.AddPane(tb1, aui.AuiPaneInfo().
375 Name("tb1").Caption("Fichiers").
377 LeftDockable(True).RightDockable(False))
379 self.ShowAPane("Intro_Text")
380 self._mgr.GetPane("lefttree").Show()
381 self._mgr.GetPane("classif_tb").Hide()
382 # "commit" all changes made to FrameManager
385 # Show How To Use The Closing Panes Event
386 ##################################################################
387 self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
388 self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
389 self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
390 self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
391 self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
392 self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
393 self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
394 self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
395 self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
396 self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
397 self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
398 self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
399 self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
400 self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
401 self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
402 self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
403 self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
404 self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
405 self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
406 self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
407 #self.Bind(wx.EVT_MENU, self.OnSplitVar, id=ID_SPLITVAR)
408 #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
409 self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
410 self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
411 self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
412 self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
413 self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
414 self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
415 self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
416 self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
417 self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
418 #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
419 self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
420 self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
421 self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
422 self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM)
423 self.Bind(wx.EVT_CLOSE, self.OnClose)
424 ##################################################################
425 flags = self._mgr.GetAGWFlags()
426 #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
427 #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
428 #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
429 flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
430 self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
431 self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
432 self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
435 self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
436 self.SetIcon(self._icon)
437 ##########################
439 self.input_path = [False]
440 self.TEMPDIR = tempfile.mkdtemp('iramuteq')
441 self.FileTabList = []
447 self.g_header = False
454 self.SysEncoding = sys.getdefaultencoding()
455 self.syscoding = sys.getdefaultencoding()
456 #print 'SysEncoding',self.SysEncoding
457 if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
460 ##############################################################@
461 self.DisEnSaveTabAs(False)
462 self.ShowMenu('view', False)
463 self.ShowMenu('matrix', False)
464 self.ShowMenu('text', False)
475 def finish_init(self) :
477 self.pref.read(self.ConfigPath['preferences'])
480 self.pref.read(self.ConfigPath['preferences'])
487 self.pref.read(self.ConfigPath['preferences'])
489 self.sound = self.pref.getboolean('iramuteq', 'sound')
490 self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
491 self.version = ConfigGlob.get('DEFAULT', 'version')
492 #configuration des chemins de R
493 self.PathPath = ConfigParser()
494 self.PathPath.read(ConfigPath['path'])
496 if not CheckRPath(self.PathPath) :
497 if sys.platform == 'win32':
498 BestRPath = FindRPAthWin32()
500 BestRPath = FindRPathNix()
502 self.PathPath.set('PATHS', 'rpath', BestRPath)
503 with open(ConfigPath['path'], 'w') as f :
504 self.PathPath.write(f)
508 self.RPath = self.PathPath.get('PATHS', 'rpath')
511 if not RLibsAreInstalled(self) :
515 Le chemin de l'executable de R n'a pas été trouvé.
516 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
517 Si R n'est pas installé dans le répertoire par défaut
518 (souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
519 vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
520 dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
522 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
526 def setlangue(self) :
527 self.pref.read(self.ConfigPath['preferences'])
528 guilangue = self.pref.get('iramuteq', 'guilanguage')
529 self.preslangue.get(guilangue, 'english').install()
531 def OnVerif(self, evt) :
532 pack = CheckRPackages(self)
534 dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION)
536 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
539 def DisEnSaveTabAs(self, DISEN):
541 file_menu = self.mb.GetMenu(0)
542 items = file_menu.GetMenuItems()
544 if item.GetId() == ID_SaveTab :
547 def ShowMenu(self, menu, Show=True):
550 elif menu == 'matrix' :
552 elif menu == 'view' :
557 #menu_pos = self.mb.FindMenu(menu)
558 if not menu_pos is None :
559 self.mb.EnableTop(menu_pos, Show)
560 self.mb.UpdateMenus()
563 #--------------------------------------------------------------------
564 def OnClose(self, event):
566 with open(self.ConfigPath['path'], 'w') as f :
567 self.PathPath.write(f)
572 def OnOpenData(self, event):
573 inputname, self.input_path = OnOpen(self, "Data")
575 #filename = self.input_path[0]
576 self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
577 val = get_table_param(self, self.input_path[0])
579 self.tableau.make_content()
580 OpenAnalyse(self, self.tableau.parametres)
581 self.tree.OnItemAppend(self.tableau.parametres)
582 #self.tableau.show_tab()
584 def OnOpenAnalyse(self, event):
585 self.AnalysePath = OnOpen(self, "Analyse")
586 OpenAnalyse(self, self.AnalysePath[1][0], True)
587 self.ShowMenu('view')
589 def OnOpenText(self, event):
590 inputname, self.input_path = OnOpen(self, "Texte")
591 self.filename = self.input_path[0]
595 def OnViewData(self, event):
598 if self.type == "Data":
599 if not self.DataPop :
600 self.Sheet.Populate(self.content)
603 self.ShowAPane(u"Data")
604 elif self.type == "Texte" or self.type == 'Analyse' :
605 if not self.DataTxt :
606 self.text_ctrl_txt.Clear()
607 self.text_ctrl_txt.write(self.content)
608 self.text_ctrl_txt.ShowPosition(0)
611 self.ShowAPane(u"Text")
614 def OnSubText(self, corpus, parametres = None):
616 corpus = self.tree.getcorpus()
617 builder = SubBuilder(self, corpus, parametres)
618 if builder.res == wx.ID_OK :
619 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
621 corpus = builder.doanalyse()
622 self.history.add(corpus.parametres)
623 self.tree.OnItemAppend(corpus.parametres)
624 OpenAnalyse(self, corpus.parametres)
628 dlg = wx.ProgressDialog("Ouverture...",
629 "Veuillez patienter...",
632 style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
635 builder = Builder(self, dlg)
636 if builder.res == wx.ID_OK :
638 corpus = builder.doanalyse()
639 self.history.add(corpus.parametres)
640 self.tree.OnItemAppend(corpus.parametres)
641 OpenAnalyse(self, corpus.parametres)
646 keepGoing = dlg.Update(count, u"Lecture du fichier")
647 self.ShowMenu('view')
648 self.ShowMenu('text')
649 self.ShowMenu('matrix', False)
654 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
656 #self.OnViewData(wx.EVT_BUTTON)
658 def OnExit(self, event):
661 def OnAbout(self, event):
662 info = wx.AboutDialogInfo()
663 info.Name = ConfigGlob.get('DEFAULT', 'name')
664 info.Version = ConfigGlob.get('DEFAULT', 'version')
665 info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
666 info.Description = u"""
667 Interface de R pour les Analyses Multidimensionnelles
668 de Textes et de Questionnaires
671 construit avec des logiciels libres.
677 info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
678 dev = ConfigGlob.get('DEFAULT', 'dev').decode('utf8').split(';')
679 info.Developers = dev
680 info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier
681 suivant les termes de la Licence Publique Générale GNU telle que publiée
682 par la Free Software Foundation ; soit la version 2 de cette licence,
683 soit (à votre convenance) une version ultérieure.
685 Iramuteq est diffusé dans l'espoir qu'il sera utile,
686 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite
687 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER.
688 Voyez la Licence Publique Générale GNU pour plus de détails.
690 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
691 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
692 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
695 def GetDockArt(self):
696 return self._mgr.GetArtProvider()
701 def OnPageChanged(self, event) :
702 new = event.GetSelection()
703 nobject = event.GetEventObject()
704 parent = nobject.GetParent()
705 if isinstance(parent, IraFrame) :
706 npage = self.nb.GetPage(new)
707 if 'parametres' in dir(npage) :
708 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
709 if npage.parametres.get('matrix', False) :
710 self.ShowMenu('text', False)
711 self.ShowMenu('matrix', True)
712 elif npage.parametres.get('corpus', False) :
713 self.ShowMenu('text')
714 self.ShowMenu('matrix', False)
716 def OnCloseTab(self, evt):
717 #log.info('Closing tab %s' % str(evt.GetEventObject()))
718 ctrl = evt.GetEventObject()
719 if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
723 page = self.nb.GetPage(self.nb.GetSelection())
724 if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
725 self.history.rmtab(page.parametres)
726 self.tree.CloseItem(uuid = page.parametres['uuid'])
727 TabTitle = self.nb.GetPageText(self.nb.GetSelection())
728 # if self.DictTab != {} :
729 # if TabTitle in self.DictTab :
730 # ListFile=self.DictTab[TabTitle]
731 # if False in ListFile:
733 # Certains résultats ne sont pas enregistrer.
734 # Voulez-vous fermer quand même ?"""
735 # dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
737 # dlg.CenterOnParent()
738 # if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
743 # for f in ListFile[1:] :
748 # elif True in ListFile :
751 # del self.DictTab[TabTitle]
753 # self.LastTabClose()
756 if self.nb.GetPageCount() == 1 and not notebook :
759 def LastTabClose(self) :
760 if self.nb.GetPageCount() == 1 :
761 #self.DisEnSaveTabAs(False)
763 self.ShowAPane("Text")
765 self.ShowAPane("Data")
767 self.ShowAPane("Intro_Text")
769 # def OnSaveTabAs(self, event):
770 # SelectTab = self.nb.GetSelection()
771 # TabTitle = self.nb.GetPageText(SelectTab)
772 # FileToSave = self.DictTab[TabTitle]
774 # dlg = wx.FileDialog(
775 # self, message="Enregistrer sous...", defaultDir=os.getcwd(),
776 # defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
778 # dlg.SetFilterIndex(2)
779 # dlg.CenterOnParent()
781 # if dlg.ShowModal() == wx.ID_OK:
782 # Path = dlg.GetPath()
783 # Dirname = os.path.dirname(Path)
784 # Filename = dlg.GetFilename()
789 # shutil.copyfile(FileToSave[-1], Path)
790 # os.remove(FileToSave[len(FileToSave) - 1])
791 # NewListFile.append(True)
792 # NewListFile.append(Path)
793 # for f in FileToSave[1:-1] :
794 # Fileout = os.path.join(Dirname, os.path.basename(f))
795 # shutil.copyfile(f, Fileout)
796 # NewListFile.append(Fileout)
799 # self.DictTab[TabText] = NewListFile
800 # del self.DictTab[TabTitle]
801 # self.nb.SetPageText(SelectTab, TabText)
803 def GetStartPosition(self):
807 pt = self.ClientToScreen(wx.Point(0, 0))
809 return wx.Point(pt.x + x, pt.y + x)
811 def ShowAPane(self, panel):
812 for pane in self._mgr.GetAllPanes() :
813 if not pane.IsToolbar() and pane.name != 'lefttree':
815 self._mgr.GetPane(panel).Show()
818 def OnAcceuil(self, event):
819 self.ShowAPane(u"Intro_Text")
822 def CreateHTMLCtrl(self):
823 ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
824 if "gtk2" in wx.PlatformInfo:
825 ctrl.SetStandardFonts()
826 ctrl.SetPage(u"text")
829 def ShowTab(self, evt):
830 self.ShowAPane("Tab_content")
832 ################################################################
834 ################################################################
835 def analyse_matrix(self, analyse, analyse_type = '', matrix = None, parametres = None, dlgnb = 1):
837 matrix = self.tree.getmatrix()
838 if parametres is not None :
839 parametres['type'] = analyse_type
841 parametres = {'type' : analyse_type}
843 print 'plus de bug@@@@@@@@@@@@@@@@@@@@@@'
844 analyse(self, matrix, parametres = parametres, dlg = dlgnb)
848 def OnFreq(self, event, matrix = None):
849 self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
851 def OnChi2(self, event, matrix = None):
852 self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3)
854 def OnSimiTab(self, event, matrix = None):
855 self.analyse_matrix(DoSimi, matrix = matrix, analyse_type = 'simimatrix', dlgnb = 5)
857 def OnCHDReinert(self, event, matrix = None):
859 # matrix = self.tree.getmatrix()
860 #AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = 3)
861 self.analyse_matrix(AnalyseQuest, matrix = matrix, analyse_type = 'reinertmatrix', dlgnb = 5)
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', parametres = {'pathout': matrix.pathout.dirout}, 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__':