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, FreqMultiple
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 ID_FreqMulti = wx.NewId()
99 ##########################################################
100 #elements de configuration
101 ##########################################################
103 if sys.platform == 'darwin' :
104 sys.setdefaultencoding('UTF-8')
105 wx.SetDefaultPyEncoding('UTF-8')
107 sys.setdefaultencoding(locale.getpreferredencoding())
109 #chemin de l'application
110 AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0])))
112 ImagePath = os.path.join(AppliPath, 'images')
113 #configuration generale
114 DictConfigPath = ConstructGlobalPath(AppliPath)
115 ConfigGlob = ConfigParser()
116 ConfigGlob.read(DictConfigPath['global'])
117 DefaultConf = ConfigParser()
118 DefaultConf.read(DictConfigPath['preferences'])
119 #repertoire de l'utilisateur
120 if os.getenv('HOME') != None:
121 user_home = os.getenv('HOME')
123 user_home = os.getenv('HOMEPATH')
124 UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq'))
125 #Si pas de fichiers de config utilisateur, on cree le repertoire
126 CreateIraDirectory(UserConfigPath, AppliPath)
127 #fichiers log pour windows (py2exe)
128 log = logging.getLogger('iramuteq')
129 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
130 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
131 fh.setFormatter(formatter)
133 if sys.platform != 'win32' and sys.platform != 'darwin':
134 ch = logging.StreamHandler()
135 ch.setFormatter(formatter)
137 log.setLevel(logging.INFO)
139 class writer(object):
140 def write(self, data):
141 if data.strip() != '' :
142 log.info('ERROR : %s' % data)
144 class printer(object) :
145 def write(self, data) :
146 if data.strip() != '' :
147 log.info('Print : %s' % data)
149 sys.stderr = writer()
150 sys.stdout = printer()
152 ConfigPath = ConstructConfigPath(UserConfigPath)
154 langues = {'french' : wx.LANGUAGE_FRENCH,
155 'english' : wx.LANGUAGE_ENGLISH,
156 'portuguese' : wx.LANGUAGE_PORTUGUESE,
157 'italian' : wx.LANGUAGE_ITALIAN,
158 'spanish' : wx.LANGUAGE_SPANISH}
160 code_langues = {'french' : 'fr_FR',
162 'portuguese' : 'pt_PT',
166 #####################################################################
168 class IraFrame(wx.Frame):
169 def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
170 size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE |
173 log.info('Starting...')
174 wx.Frame.__init__(self, parent, id, title, pos, size, style)
176 self.AppliPath = AppliPath
177 self.images_path = os.path.join(AppliPath,'images')
178 self.UserConfigPath = UserConfigPath
179 #self.RscriptsPath = ConstructRscriptsPath(AppliPath)
180 self.RscriptsPath = PathOut(dirout=os.path.join(AppliPath, 'Rscripts'))
181 self.RscriptsPath.basefiles(RscriptsPath)
182 #self.DictPath = ConstructDicoPath(AppliPath)
183 self.DictPath = ConstructDicoPath(UserConfigPath)
184 self.ConfigGlob = ConfigGlob
185 self.ConfigPath = ConstructConfigPath(UserConfigPath)
186 self.pref = RawConfigParser()
187 #workaround for import problem
188 self.SimiFromCluster = SimiFromCluster
190 gettext.install('iramuteq', os.path.join(AppliPath,'locale'), unicode=True)
191 #langues = ['fr_FR', 'en', 'pt_PT']
195 for langue in code_langues :
196 self.preslangue[langue] = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=[code_langues[langue]])
198 #self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
199 #self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
200 # tell FrameManager to manage this frame
201 #self._mgr = wx.aui.AuiManager()
202 self._mgr = aui.AuiManager()
203 self._mgr.SetManagedWindow(self)
206 #--------------------------------------------------------------------------------
207 self.mb = wx.MenuBar()
209 file_menu = wx.Menu()
210 item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8'))
211 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
212 file_menu.AppendItem(item)
214 item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8'))
215 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
216 file_menu.AppendItem(item)
218 item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
219 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
220 file_menu.AppendItem(item)
223 menuFactiva = wx.Menu()
224 fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml").decode('utf8'))
225 fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
226 fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
227 menuFactiva.AppendItem(fact_from_xml)
228 menuFactiva.AppendItem(fact_from_mail)
229 menuFactiva.AppendItem(fact_from_txt)
230 file_menu.AppendMenu(-1, _(u"Import from factiva").decode('utf8'), menuFactiva)
232 item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8'))
233 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
234 file_menu.AppendItem(item)
236 menuTools = wx.Menu()
237 splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
238 extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
239 extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
240 menuTools.AppendItem(splitvar)
241 menuTools.AppendItem(extractmod)
242 menuTools.AppendItem(extractthem)
243 self.ID_splitvar = splitvar.GetId()
244 self.ID_extractmod = extractmod.GetId()
245 self.ID_extractthem = extractthem.GetId()
246 file_menu.AppendMenu(-1, _(u"Tools").decode('utf8'), menuTools)
249 #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
250 #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
251 #file_menu.AppendItem(item)
253 file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
255 edit_menu = wx.Menu()
256 edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences').decode('utf8'))
258 view_menu = wx.Menu()
259 view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
260 view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
261 view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
262 #view_menu.AppendSeparator()
263 matrix_menu = wx.Menu()
264 matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
265 matrix_menu.Append(ID_FreqMulti, _(u'Multiple frequencies').decode('utf8'))
266 matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
267 #matrix_menu.Append(ID_Student, u"t de Student")
268 menu_classif = wx.Menu()
269 menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
270 #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
271 matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
272 #matrix_menu.Append(ID_AFCM, u"AFCM")
273 matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
274 matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
275 ID_RCODE = wx.NewId()
276 matrix_menu.Append(ID_RCODE, u"Code R...")
277 #menu_splittab = wx.Menu()
278 #ID_SPLITVAR = wx.NewId()
279 #splitvar = wx.MenuItem(menu_splittab, ID_SPLITVAR, _(u"Split from variable").decode('utf8'))
280 #menu_splittab.AppendItem(splitvar)
281 #matrix_menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), menu_splittab)
282 self.matrix_menu = matrix_menu
284 text_menu = wx.Menu()
285 #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
286 text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
287 text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
288 #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
289 menu_classiftxt = wx.Menu()
290 menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
291 #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
292 text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
293 text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'))
295 text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
296 self.text_menu = text_menu
298 help_menu = wx.Menu()
299 help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
300 help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
302 self.mb.Append(file_menu, _(u"File").decode('utf8'))
303 self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
304 self.mb.Append(view_menu, _(u"View").decode('utf8'))
305 self.mb.Append(matrix_menu, _(u"Matrix analysis").decode('utf8'))
306 self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
307 self.mb.Append(help_menu, _(u"Help").decode('utf8'))
309 self.SetMenuBar(self.mb)
310 #--------------------------------------------------------------------
311 self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
312 self.statusbar.SetStatusWidths([-2, -3])
313 self.statusbar.SetStatusText(u"Prêt", 0)
314 self.statusbar.SetStatusText(u"Bienvenue", 1)
316 # min size for the frame itself isn't completely done.
317 # see the end up FrameManager::Update() for the test
318 # code. For now, just hard code a frame minimum size
319 self.SetMinSize(wx.Size(400, 400))
321 # create some toolbars
322 tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
323 wx.TB_FLAT | wx.TB_NODIVIDER)
324 tb1.SetToolBitmapSize(wx.Size(16, 16))
325 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")
327 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")
331 #------------------------------------------------------------------------------------------------
333 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)
335 #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
336 # Name("Text").CenterPane())
337 self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
338 Name("Text").CenterPane())
339 #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
341 self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
343 #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
344 # with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
346 self.history = History(os.path.join(UserConfigPath, 'history.db'))
347 self.tree = LeftTree(self)
348 self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Navigator").decode('utf8')).
349 Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
350 MinimizeButton(True))
352 #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)
353 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)
354 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
355 self.nb.SetAGWWindowStyleFlag(notebook_flags)
356 self.nb.SetArtProvider(aui.ChromeTabArt())
357 #self.nb.SetArtProvider(aui.VC8TabArt())
358 #self.nb.parent = self
359 #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
360 #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
361 # Name("Tab_content").
363 self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
367 #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
368 #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
369 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
370 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
371 # add the toolbars to the manager
373 #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
374 # Name("tb1").Caption("Fichiers").
375 # ToolbarPane().Top().
376 # LeftDockable(False).RightDockable(False))
377 self._mgr.AddPane(tb1, aui.AuiPaneInfo().
378 Name("tb1").Caption("Fichiers").
380 LeftDockable(True).RightDockable(False))
382 self.ShowAPane("Intro_Text")
383 self._mgr.GetPane("lefttree").Show()
384 self._mgr.GetPane("classif_tb").Hide()
385 # "commit" all changes made to FrameManager
388 # Show How To Use The Closing Panes Event
389 ##################################################################
390 self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
391 self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
392 self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
393 self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
394 self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
395 self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
396 self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
397 self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
398 self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
399 self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
400 self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
401 self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
402 self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
403 self.Bind(wx.EVT_MENU, self.OnFreqMulti, id=ID_FreqMulti)
404 self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
405 self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
406 self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
407 self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
408 self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
409 self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
410 self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
411 #self.Bind(wx.EVT_MENU, self.OnSplitVar, id=ID_SPLITVAR)
412 #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
413 self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
414 self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
415 self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
416 self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
417 self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
418 self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
419 self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
420 self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
421 self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
422 #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
423 self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
424 self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
425 self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
426 self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM)
427 self.Bind(wx.EVT_CLOSE, self.OnClose)
428 ##################################################################
429 flags = self._mgr.GetAGWFlags()
430 #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
431 #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
432 #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
433 flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
434 self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
435 self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
436 self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
439 self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
440 self.SetIcon(self._icon)
441 ##########################
443 self.input_path = [False]
444 self.TEMPDIR = tempfile.mkdtemp('iramuteq')
445 self.FileTabList = []
451 self.g_header = False
458 self.SysEncoding = sys.getdefaultencoding()
459 self.syscoding = sys.getdefaultencoding()
460 #print 'SysEncoding',self.SysEncoding
461 if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
464 ##############################################################@
465 self.DisEnSaveTabAs(False)
466 self.ShowMenu('view', False)
467 self.ShowMenu('matrix', False)
468 self.ShowMenu('text', False)
479 def finish_init(self) :
481 self.pref.read(self.ConfigPath['preferences'])
484 self.pref.read(self.ConfigPath['preferences'])
491 self.pref.read(self.ConfigPath['preferences'])
493 self.sound = self.pref.getboolean('iramuteq', 'sound')
494 self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
495 self.version = ConfigGlob.get('DEFAULT', 'version')
496 #configuration des chemins de R
497 self.PathPath = ConfigParser()
498 self.PathPath.read(ConfigPath['path'])
500 if not CheckRPath(self.PathPath) :
501 if sys.platform == 'win32':
502 BestRPath = FindRPAthWin32()
504 BestRPath = FindRPathNix()
506 self.PathPath.set('PATHS', 'rpath', BestRPath)
507 with open(ConfigPath['path'], 'w') as f :
508 self.PathPath.write(f)
512 self.RPath = self.PathPath.get('PATHS', 'rpath')
515 if not RLibsAreInstalled(self) :
519 Le chemin de l'executable de R n'a pas été trouvé.
520 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
521 Si R n'est pas installé dans le répertoire par défaut
522 (souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
523 vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
524 dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
526 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
530 def setlangue(self) :
531 self.pref.read(self.ConfigPath['preferences'])
533 guilangue = self.pref.get('iramuteq', 'guilanguage')
535 guilangue = DefaultConf.get('iramuteq', 'guilanguage')
536 self.preslangue.get(guilangue, 'english').install()
538 def OnVerif(self, evt) :
539 pack = CheckRPackages(self)
541 dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION)
543 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
546 def DisEnSaveTabAs(self, DISEN):
548 file_menu = self.mb.GetMenu(0)
549 items = file_menu.GetMenuItems()
551 if item.GetId() == ID_SaveTab :
554 def ShowMenu(self, menu, Show=True):
557 elif menu == 'matrix' :
559 elif menu == 'view' :
564 #menu_pos = self.mb.FindMenu(menu)
565 if not menu_pos is None :
566 self.mb.EnableTop(menu_pos, Show)
567 self.mb.UpdateMenus()
570 #--------------------------------------------------------------------
571 def OnClose(self, event):
573 with open(self.ConfigPath['path'], 'w') as f :
574 self.PathPath.write(f)
579 def OnOpenData(self, event):
580 inputname, self.input_path = OnOpen(self, "Data")
582 #filename = self.input_path[0]
583 self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
584 val = get_table_param(self, self.input_path[0])
586 self.tableau.make_content()
587 OpenAnalyse(self, self.tableau.parametres)
588 self.tree.OnItemAppend(self.tableau.parametres)
589 #self.tableau.show_tab()
591 def OnOpenAnalyse(self, event):
592 self.AnalysePath = OnOpen(self, "Analyse")
593 OpenAnalyse(self, self.AnalysePath[1][0], True)
594 self.ShowMenu('view')
596 def OnOpenText(self, event):
597 inputname, self.input_path = OnOpen(self, "Texte")
598 self.filename = self.input_path[0]
602 def OnViewData(self, event):
603 if self.type == "Data":
604 if not self.DataPop :
605 self.Sheet.Populate(self.content)
608 self.ShowAPane(u"Data")
609 elif self.type == "Texte" or self.type == 'Analyse' :
610 if not self.DataTxt :
611 self.text_ctrl_txt.Clear()
612 self.text_ctrl_txt.write(self.content)
613 self.text_ctrl_txt.ShowPosition(0)
616 self.ShowAPane(u"Text")
619 def OnSubText(self, corpus, parametres = None):
621 corpus = self.tree.getcorpus()
622 builder = SubBuilder(self, corpus, parametres)
623 if builder.res == wx.ID_OK :
624 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
626 corpus = builder.doanalyse()
627 self.history.add(corpus.parametres)
628 self.tree.OnItemAppend(corpus.parametres)
629 OpenAnalyse(self, corpus.parametres)
633 dlg = wx.ProgressDialog("Ouverture...",
634 "Veuillez patienter...",
637 style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
640 builder = Builder(self, dlg)
641 if builder.res == wx.ID_OK :
643 corpus = builder.doanalyse()
644 self.history.add(corpus.parametres)
645 self.tree.OnItemAppend(corpus.parametres)
646 OpenAnalyse(self, corpus.parametres)
652 keepGoing = dlg.Update(count, u"Lecture du fichier")
653 self.ShowMenu('view')
654 self.ShowMenu('text')
655 self.ShowMenu('matrix', False)
660 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
662 #self.OnViewData(wx.EVT_BUTTON)
664 def OnExit(self, event):
667 def OnAbout(self, event):
668 info = wx.AboutDialogInfo()
669 info.Name = ConfigGlob.get('DEFAULT', 'name')
670 info.Version = ConfigGlob.get('DEFAULT', 'version')
671 info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
672 info.Description = u"""
673 Interface de R pour les Analyses Multidimensionnelles
674 de Textes et de Questionnaires
677 construit avec des logiciels libres.
683 info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
684 dev = ConfigGlob.get('DEFAULT', 'dev').decode('utf8').split(';')
685 info.Developers = dev
686 info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier
687 suivant les termes de la Licence Publique Générale GNU telle que publiée
688 par la Free Software Foundation ; soit la version 2 de cette licence,
689 soit (à votre convenance) une version ultérieure.
691 Iramuteq est diffusé dans l'espoir qu'il sera utile,
692 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite
693 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER.
694 Voyez la Licence Publique Générale GNU pour plus de détails.
696 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
697 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
698 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
701 def GetDockArt(self):
702 return self._mgr.GetArtProvider()
707 def OnPageChanged(self, event) :
708 new = event.GetSelection()
709 nobject = event.GetEventObject()
710 parent = nobject.GetParent()
711 if isinstance(parent, IraFrame) :
712 npage = self.nb.GetPage(new)
713 if 'parametres' in dir(npage) :
714 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
715 if npage.parametres.get('matrix', False) :
716 self.ShowMenu('text', False)
717 self.ShowMenu('matrix', True)
718 elif npage.parametres.get('corpus', False) :
719 self.ShowMenu('text')
720 self.ShowMenu('matrix', False)
722 def OnCloseTab(self, evt):
723 #log.info('Closing tab %s' % str(evt.GetEventObject()))
724 ctrl = evt.GetEventObject()
725 if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
729 page = self.nb.GetPage(self.nb.GetSelection())
730 if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
731 self.history.rmtab(page.parametres)
732 self.tree.CloseItem(uuid = page.parametres['uuid'])
733 TabTitle = self.nb.GetPageText(self.nb.GetSelection())
735 if self.nb.GetPageCount() == 1 and not notebook :
738 def LastTabClose(self) :
739 if self.nb.GetPageCount() == 1 :
740 #self.DisEnSaveTabAs(False)
742 self.ShowAPane("Text")
744 self.ShowAPane("Data")
746 self.ShowAPane("Intro_Text")
748 def GetStartPosition(self):
752 pt = self.ClientToScreen(wx.Point(0, 0))
754 return wx.Point(pt.x + x, pt.y + x)
756 def ShowAPane(self, panel):
757 for pane in self._mgr.GetAllPanes() :
758 if not pane.IsToolbar() and pane.name != 'lefttree':
760 self._mgr.GetPane(panel).Show()
763 def OnAcceuil(self, event):
764 self.ShowAPane(u"Intro_Text")
767 def CreateHTMLCtrl(self):
768 ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
769 if "gtk2" in wx.PlatformInfo:
770 ctrl.SetStandardFonts()
771 ctrl.SetPage(u"text")
774 def ShowTab(self, evt):
775 self.ShowAPane("Tab_content")
777 ################################################################
779 ################################################################
780 def analyse_matrix(self, analyse, analyse_type = '', matrix = None, parametres = None, dlgnb = 1):
782 matrix = self.tree.getmatrix()
783 if parametres is not None :
784 parametres['type'] = analyse_type
786 parametres = {'type' : analyse_type}
788 #print 'plus de bug@@@@@@@@@@@@@@@@@@@@@@'
789 analyse(self, matrix, parametres = parametres, dlg = dlgnb)
793 def OnFreq(self, event, matrix = None):
794 self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
796 def OnFreqMulti(self, event, matrix = None):
797 self.analyse_matrix(FreqMultiple, analyse_type = 'freqmulti', matrix = matrix, dlgnb = 3)
799 def OnChi2(self, event, matrix = None):
800 self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3)
802 def OnSimiTab(self, event, matrix = None):
803 self.analyse_matrix(DoSimi, matrix = matrix, analyse_type = 'simimatrix', dlgnb = 5)
805 def OnCHDReinert(self, event, matrix = None):
807 # matrix = self.tree.getmatrix()
808 #AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = 3)
809 self.analyse_matrix(AnalyseQuest, matrix = matrix, analyse_type = 'reinertmatrix', dlgnb = 5)
811 def OnStudent(self, event):
817 def OnRCode(self, event):
823 def OnCHDSIM(self, event):
825 # print 'ATTENTION!!!!'
826 chdsim = ChdCluster(self)
827 if chdsim.val == wx.ID_OK:
832 # def OnCHDReinert(self, event):
834 # # print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
835 # self.quest = AnalyseQuest(self)
836 # if self.quest.val == wx.ID_OK:
841 def OnProto(self, evt, matrix = None) :
842 self.analyse_matrix(Prototypical, matrix = matrix, analyse_type = 'proto', dlgnb = 3)
843 #Prototypical(self, {'type' : 'proto'})
845 def OnSplitVar(self, evt, matrix = None):
846 self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', parametres = {'pathout': matrix.pathout.dirout}, dlgnb = 3)
847 matrix = self.tree.getmatrix()
850 def OnSimiTxt(self, evt, corpus = None) :
851 # print 'PLUS DE BUG SUR SIMITXT'
853 #self.Text = SimiTxt(self)
855 corpus = self.tree.getcorpus()
856 self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = 3)
857 if self.Text.val == wx.ID_OK :
862 def OnWordCloud(self, evt, corpus = None) :
863 # print 'PLUS DE BUG SUR WORDCLOUD'
866 corpus = self.tree.getcorpus()
867 self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = 3)
868 if self.Text.val == wx.ID_OK :
873 def OnClusterCloud(self, corpus, parametres = None) :
874 self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = 3)
876 def OnAFCM(self, event):
882 def OnTextStat(self, event, corpus = None):
883 #print 'PAS DE BUG SUR TEXT STAT'
886 corpus = self.tree.getcorpus()
887 self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = 7)
889 if self.Text.val == wx.ID_OK :
894 def OnTextSpec(self, event, corpus = None):
896 #self.Text = AsLexico(self)
897 #print('ATTENTION : PLUS DE BUG SUR LEXICO')
899 corpus = self.tree.getcorpus()
900 self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = 3)
901 if self.Text.val == wx.ID_OK :
906 def OnTextAfcm(self, event):
913 def import_factiva_xml(self,event):
915 ImportFactiva(self, 'xml')
919 def import_factiva_mail(self, evt) :
921 ImportFactiva(self, 'mail')
925 def import_factiva_txt(self, evt) :
927 ImportFactiva(self, 'txt')
931 def OnImportTXM(self, evt) :
933 ImportFactiva(self, 'txm')
937 def ExtractTools(self, evt) :
939 if ID == self.ID_splitvar :
940 Extract(self, 'splitvar')
941 elif ID == self.ID_extractmod :
942 Extract(self, 'mods')
943 elif ID == self.ID_extractthem :
944 Extract(self, 'them')
946 def OnTextReinert(self, event, corpus = None):
948 #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
949 #RunAnalyse(self, corpus, Alceste, OptAlceste)
951 corpus = self.tree.getcorpus()
952 self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6)
953 if self.Text.val == wx.ID_OK:
958 def OnPamSimple(self, event, corpus = None):
961 corpus = self.tree.getcorpus()
962 self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = 6)
963 if self.Text.val == wx.ID_OK:
968 def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
969 DoSimi(self, param = parametres, fromprof = fromprof, listactives = listactives, actives = actives, tableau = tableau)
971 # def OnSimi(self,evt):
973 #print 'ATTENTION !!!! VERGES'
974 #print 'PLUS DE BUG SUR SIMI'
975 # self.res = DoSimi(self, param = None)
976 #self.res = Verges(self)
977 # if self.res.val == wx.ID_OK :
981 #################################################################
983 def OnHelp(self, event):
984 webbrowser.open('http://www.iramuteq.org/documentation')
986 def OnPref(self, event):
987 dlg = PrefDialog(self)
989 self.val = dlg.ShowModal()
992 if self.check_update:
997 #CheckRPackages(self)
999 def OnOpenFromCmdl(self):
1001 if options.filename :
1002 if os.path.exists(options.filename):
1003 self.filename = os.path.abspath(options.filename)
1007 if os.path.exists(os.path.realpath(args[0])):
1008 self.filename = os.path.abspath(os.path.realpath(args[0]))
1014 if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1015 self.tableau = Tableau(self, self.filename)
1016 val = get_table_param(self, self.filename)
1017 if val == wx.ID_OK :
1018 self.tableau.make_content()
1019 OpenAnalyse(self, self.tableau.parametres)
1020 self.tree.OnItemAppend(self.tableau.parametres)
1021 #get_table_param(self, self.filename)
1022 #self.tableau.make_content()
1023 #self.tableau.show_tab()
1024 #open_data(self, self.filename)
1025 elif os.path.splitext(self.filename)[1] == '.txt':
1027 elif os.path.splitext(self.filename)[1] == '.ira' :
1028 #self.corpus = Corpus(self)
1029 #self.Text = OpenAnalyse(self, self.filename)
1030 OpenAnalyse(self, self.filename)
1032 print 'ce fichier n\'existe pas'
1036 class IntroPanel(wx.Panel):
1037 def __init__(self, parent):
1038 wx.Panel.__init__(self, parent)
1039 col = randint(0, 255)
1040 col1 = randint(0,255)
1041 col2 = randint(0,255)
1043 bckgrdcolor = wx.Colour(col, col1, col2)
1044 self.SetBackgroundColour(bckgrdcolor)
1045 txtcolour = wx.Colour(250, 250, 250)
1046 linkcolor = wx.Colour(255, 0, 0)
1047 sizer1 = wx.BoxSizer(wx.VERTICAL)
1048 sizer2 = wx.BoxSizer(wx.VERTICAL)
1049 sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1050 sizer4 = wx.BoxSizer(wx.VERTICAL)
1051 sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1052 grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1053 grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1054 grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1055 PanelPres = wx.Panel(self)
1056 PanelPres.SetBackgroundColour(bckgrdcolor)
1057 label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1058 label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1059 label_1.SetForegroundColour(wx.RED)
1060 label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1061 label2.SetForegroundColour(txtcolour)
1062 label2.SetBackgroundColour(bckgrdcolor)
1063 #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1064 #label3.SetForegroundColour(txtcolour)
1065 #label3.SetBackgroundColour(bckgrdcolor)
1066 self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1067 self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1068 self.hyper2.SetBackgroundColour(bckgrdcolor)
1069 self.hyper2.EnableRollover(True)
1070 self.hyper2.SetUnderlines(False, False, True)
1071 self.hyper2.SetBold(True)
1072 self.hyper2.UpdateLink()
1073 label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1074 label_lerass.SetForegroundColour(txtcolour)
1075 label_lerass.SetBackgroundColour(bckgrdcolor)
1076 self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1077 self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1078 self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1079 self.hyper_lerass.EnableRollover(True)
1080 self.hyper_lerass.SetUnderlines(False, False, True)
1081 self.hyper_lerass.SetBold(True)
1082 self.hyper_lerass.UpdateLink()
1083 blank = wx.StaticText(PanelPres, -1, u'\n')
1084 blank1 = wx.StaticText(PanelPres, -1, u'\n')
1085 labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1086 labellicence.SetForegroundColour(txtcolour)
1087 labellicence.SetBackgroundColour(bckgrdcolor)
1088 labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1089 labelcopy.SetForegroundColour(txtcolour)
1090 labelcopy.SetBackgroundColour(bckgrdcolor)
1091 python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1092 r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1093 lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1094 but_python = wx.BitmapButton(self, -1, python_img)
1095 but_lexique = wx.BitmapButton(self, -1, lexique_img)
1096 but_r = wx.BitmapButton(self, -1, r_img)
1097 self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1098 self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1099 self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1102 #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1103 grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1104 grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1105 grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1106 sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1107 sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1108 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1109 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1110 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1111 sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1112 sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1113 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1114 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1115 sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1116 sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1117 sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1118 sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1119 PanelPres.SetSizer(sizer2)
1120 sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1121 sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1122 sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1123 grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1124 grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1125 grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1127 sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1128 sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1129 self.SetSizer(sizer1)
1132 def OnPython(self,evt):
1133 webbrowser.open('http://www.python.org')
1135 def OnLexique(self,evt):
1136 webbrowser.open('http://www.lexique.org')
1139 webbrowser.open('http://www.r-project.org')
1141 class MySplashScreen(wx.SplashScreen):
1143 bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1144 wx.SplashScreen.__init__(self, bmp,
1145 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1147 self.Bind(wx.EVT_CLOSE, self.OnClose)
1148 self.fc = wx.FutureCall(1, self.ShowMain)
1150 def OnClose(self, evt):
1154 if self.fc.IsRunning():
1159 displaySize = wx.DisplaySize()
1160 w = displaySize[0]/1.2
1161 h = displaySize[1]/1.2
1162 frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1166 frame.OnOpenFromCmdl()
1167 # if self.fc.IsRunning():
1169 #wx.CallAfter(frame.ShowTip)
1171 class MyApp(wx.App):
1174 Create and show the splash screen. It will then create and show
1175 the main frame when it is time to do so.
1177 wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1178 self.SetAppName("Iramuteq")
1179 splash = MySplashScreen()
1187 if __name__ == '__main__':