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 textafcuci import AfcUci
51 from textdist import AnalysePam
52 from textstat import Stat
53 from textaslexico import Lexico
54 from textsimi import SimiTxt, SimiFromCluster
55 from textwordcloud import WordCloud, ClusterCloud
56 from textreinert import Reinert
57 #from profile_segment import ProfileSegment
58 #from textcheckcorpus import checkcorpus
59 from openanalyse import OpenAnalyse
60 from corpus import Builder, SubBuilder
61 #from sheet import MySheet
62 from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
63 from chemins import RscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
64 from parse_factiva_xml import ImportFactiva
65 from tools import Extract
67 from tree import LeftTree
68 ##########################################################
69 ID_OpenData = wx.NewId()
70 ID_Import = wx.NewId()
71 ID_OpenText = wx.NewId()
72 ID_OnOpenAnalyse = wx.NewId()
75 ID_Student = wx.NewId()
76 ID_CHDSIM = wx.NewId()
77 ID_CHDReinert = wx.NewId()
78 ID_TEXTAFCM = wx.NewId()
79 ID_TEXTSTAT = wx.NewId()
81 ID_TEXTREINERT = wx.NewId()
82 ID_TEXTPAM = wx.NewId()
83 ID_CHECKCORPUS = wx.NewId()
84 ID_Tabcontent = wx.NewId()
87 ID_CloseTab = wx.NewId()
88 ID_SaveTab = wx.NewId()
89 ID_CreateText = wx.NewId()
90 ID_ACCEUIL = wx.NewId()
91 ID_RESULT = wx.NewId()
92 ID_VIEWDATA = wx.NewId()
93 ID_HTMLcontent = wx.NewId()
94 ID_SimiTxt = wx.NewId()
96 ID_ImportTXM = wx.NewId()
97 ##########################################################
98 #elements de configuration
99 ##########################################################
101 if sys.platform == 'darwin' :
102 sys.setdefaultencoding('UTF-8')
103 wx.SetDefaultPyEncoding('UTF-8')
105 sys.setdefaultencoding(locale.getpreferredencoding())
107 #chemin de l'application
108 AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0])))
110 ImagePath = os.path.join(AppliPath, 'images')
111 #configuration generale
112 DictConfigPath = ConstructGlobalPath(AppliPath)
113 ConfigGlob = ConfigParser()
114 ConfigGlob.read(DictConfigPath['global'])
115 #repertoire de l'utilisateur
116 if os.getenv('HOME') != None:
117 user_home = os.getenv('HOME')
119 user_home = os.getenv('HOMEPATH')
120 UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq'))
121 #Si pas de fichiers de config utilisateur, on cree le repertoire
122 CreateIraDirectory(UserConfigPath, AppliPath)
123 #fichiers log pour windows (py2exe)
124 log = logging.getLogger('iramuteq')
125 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
126 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
127 fh.setFormatter(formatter)
129 if sys.platform != 'win32' and sys.platform != 'darwin':
130 ch = logging.StreamHandler()
131 ch.setFormatter(formatter)
133 log.setLevel(logging.INFO)
135 class writer(object):
136 def write(self, data):
137 if data.strip() != '' :
138 log.info('ERROR : %s' % data)
140 class printer(object) :
141 def write(self, data) :
142 if data.strip() != '' :
143 log.info('Print : %s' % data)
145 sys.stderr = writer()
146 sys.stdout = printer()
148 ConfigPath = ConstructConfigPath(UserConfigPath)
150 langues = {'french' : wx.LANGUAGE_FRENCH,
151 'english' : wx.LANGUAGE_ENGLISH,}
152 #####################################################################
154 class IraFrame(wx.Frame):
155 def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
156 size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE |
159 log.info('Starting...')
160 wx.Frame.__init__(self, parent, id, title, pos, size, style)
162 self.AppliPath = AppliPath
163 self.images_path = os.path.join(AppliPath,'images')
164 self.UserConfigPath = UserConfigPath
165 #self.RscriptsPath = ConstructRscriptsPath(AppliPath)
166 self.RscriptsPath = PathOut(dirout=os.path.join(AppliPath, 'Rscripts'))
167 self.RscriptsPath.basefiles(RscriptsPath)
168 #self.DictPath = ConstructDicoPath(AppliPath)
169 self.DictPath = ConstructDicoPath(UserConfigPath)
170 self.ConfigGlob = ConfigGlob
171 self.ConfigPath = ConstructConfigPath(UserConfigPath)
172 self.pref = RawConfigParser()
173 #workaround for import problem
174 self.SimiFromCluster = SimiFromCluster
176 gettext.install('iramuteq', os.path.join(AppliPath,'locale'), unicode=True)
177 self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
178 self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
180 # tell FrameManager to manage this frame
181 #self._mgr = wx.aui.AuiManager()
182 self._mgr = aui.AuiManager()
183 self._mgr.SetManagedWindow(self)
186 #--------------------------------------------------------------------------------
187 self.mb = wx.MenuBar()
189 file_menu = wx.Menu()
190 item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8'))
191 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
192 file_menu.AppendItem(item)
194 item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpora").decode('utf8'), _(u"Open a text corpora").decode('utf8'))
195 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
196 file_menu.AppendItem(item)
198 item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
199 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
200 file_menu.AppendItem(item)
203 menuFactiva = wx.Menu()
204 fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml").decode('utf8'))
205 fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
206 fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
207 menuFactiva.AppendItem(fact_from_xml)
208 menuFactiva.AppendItem(fact_from_mail)
209 menuFactiva.AppendItem(fact_from_txt)
210 file_menu.AppendMenu(-1, _(u"Import from factiva").decode('utf8'), menuFactiva)
212 item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8'))
213 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
214 file_menu.AppendItem(item)
216 menuTools = wx.Menu()
217 splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
218 extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
219 extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
220 menuTools.AppendItem(splitvar)
221 menuTools.AppendItem(extractmod)
222 menuTools.AppendItem(extractthem)
223 self.ID_splitvar = splitvar.GetId()
224 self.ID_extractmod = extractmod.GetId()
225 self.ID_extractthem = extractthem.GetId()
226 file_menu.AppendMenu(-1, _(u"Tools"), menuTools)
229 #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
230 #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
231 #file_menu.AppendItem(item)
233 file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
235 edit_menu = wx.Menu()
236 edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences').decode('utf8'))
238 view_menu = wx.Menu()
239 view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
240 view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
241 view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
242 #view_menu.AppendSeparator()
243 analyse_menu = wx.Menu()
244 analyse_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
245 analyse_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
246 #analyse_menu.Append(ID_Student, u"t de Student")
247 menu_classif = wx.Menu()
248 menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
249 #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
250 analyse_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
251 #analyse_menu.Append(ID_AFCM, u"AFCM")
252 analyse_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
253 analyse_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
254 ID_RCODE = wx.NewId()
255 analyse_menu.Append(ID_RCODE, u"Code R...")
256 self.analyse_menu = analyse_menu
258 text_menu = wx.Menu()
259 #text_menu.Append(ID_CHECKCORPUS, u"VĂ©rifier le corpus")
260 text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
261 text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
262 #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
263 menu_classiftxt = wx.Menu()
264 menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
265 #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
266 text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
267 text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'))
269 text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
270 self.text_menu = text_menu
272 help_menu = wx.Menu()
273 help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
274 help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
276 self.mb.Append(file_menu, _(u"File").decode('utf8'))
277 self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
278 self.mb.Append(view_menu, _(u"View").decode('utf8'))
279 self.mb.Append(analyse_menu, _(u"Matrix analysis").decode('utf8'))
280 self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
281 self.mb.Append(help_menu, _(u"Help").decode('utf8'))
283 self.SetMenuBar(self.mb)
284 #--------------------------------------------------------------------
285 self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
286 self.statusbar.SetStatusWidths([-2, -3])
287 self.statusbar.SetStatusText(u"PrĂŞt", 0)
288 self.statusbar.SetStatusText(u"Bienvenue", 1)
290 # min size for the frame itself isn't completely done.
291 # see the end up FrameManager::Update() for the test
292 # code. For now, just hard code a frame minimum size
293 self.SetMinSize(wx.Size(400, 400))
295 # create some toolbars
296 tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
297 wx.TB_FLAT | wx.TB_NODIVIDER)
298 tb1.SetToolBitmapSize(wx.Size(16, 16))
299 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")
301 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")
305 #------------------------------------------------------------------------------------------------
307 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)
309 #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
310 # Name("Text").CenterPane())
311 self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
312 Name("Text").CenterPane())
313 #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
315 self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
317 #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
318 # with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
320 self.history = History(os.path.join(UserConfigPath, 'history.db'))
321 self.tree = LeftTree(self)
322 self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Navigator").decode('utf8')).
323 Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
324 MinimizeButton(True))
326 #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)
327 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)
328 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
329 self.nb.SetAGWWindowStyleFlag(notebook_flags)
330 self.nb.SetArtProvider(aui.ChromeTabArt())
331 #self.nb.SetArtProvider(aui.VC8TabArt())
332 #self.nb.parent = self
333 #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
334 #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
335 # Name("Tab_content").
337 self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
341 #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
342 #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
343 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
344 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
345 # add the toolbars to the manager
347 #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
348 # Name("tb1").Caption("Fichiers").
349 # ToolbarPane().Top().
350 # LeftDockable(False).RightDockable(False))
351 self._mgr.AddPane(tb1, aui.AuiPaneInfo().
352 Name("tb1").Caption("Fichiers").
354 LeftDockable(True).RightDockable(False))
356 self.ShowAPane("Intro_Text")
357 self._mgr.GetPane("lefttree").Show()
358 self._mgr.GetPane("classif_tb").Hide()
359 # "commit" all changes made to FrameManager
362 # Show How To Use The Closing Panes Event
363 ##################################################################
364 self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
365 self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
366 self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
367 self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
368 self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
369 self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
370 self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
371 self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
372 self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
373 self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
374 self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
375 self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
376 self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
377 self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
378 self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
379 self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
380 self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
381 self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
382 self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
383 self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
384 #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
385 self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
386 self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
387 self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
388 self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
389 self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
390 self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
391 self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
392 self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
393 self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
394 #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
395 self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
396 self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
397 self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
398 self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM)
399 self.Bind(wx.EVT_CLOSE, self.OnClose)
400 ##################################################################
401 flags = self._mgr.GetAGWFlags()
402 #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
403 #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
404 #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
405 flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
406 self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
407 self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
408 self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
411 self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
412 self.SetIcon(self._icon)
413 ##########################
415 self.input_path = [False]
416 self.TEMPDIR = tempfile.mkdtemp('iramuteq')
417 self.FileTabList = []
423 self.g_header = False
430 self.SysEncoding = sys.getdefaultencoding()
431 self.syscoding = sys.getdefaultencoding()
432 #print 'SysEncoding',self.SysEncoding
433 if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
436 ##############################################################@
437 self.DisEnSaveTabAs(False)
438 self.ShowMenu(_("View").decode('utf8'), False)
439 self.ShowMenu(_("Matrix analysis").decode('utf8'), False)
440 self.ShowMenu(_("Text analysis").decode('utf8'), False)
451 def finish_init(self) :
453 self.pref.read(self.ConfigPath['preferences'])
456 self.pref.read(self.ConfigPath['preferences'])
463 self.pref.read(self.ConfigPath['preferences'])
465 self.sound = self.pref.getboolean('iramuteq', 'sound')
466 self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
467 self.version = ConfigGlob.get('DEFAULT', 'version')
468 #configuration des chemins de R
469 self.PathPath = ConfigParser()
470 self.PathPath.read(ConfigPath['path'])
472 if not CheckRPath(self.PathPath) :
473 if sys.platform == 'win32':
474 BestRPath = FindRPAthWin32()
476 BestRPath = FindRPathNix()
478 self.PathPath.set('PATHS', 'rpath', BestRPath)
479 with open(ConfigPath['path'], 'w') as f :
480 self.PathPath.write(f)
484 self.RPath = self.PathPath.get('PATHS', 'rpath')
487 if not RLibsAreInstalled(self) :
491 Le chemin de l'executable de R n'a pas été trouvé.
492 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
493 Si R n'est pas installé dans le répertoire par défaut
494 (souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
495 vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
496 dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
498 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
503 def setlangue(self) :
505 self.pref.read(self.ConfigPath['preferences'])
506 guilangue = self.pref.get('iramuteq', 'guilanguage')
507 if guilangue == 'french' :
508 self.presLan_fr.install()
510 self.presLan_en.install()
511 mylocale = wx.Locale(langues[guilangue])
512 mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
513 mylocale.AddCatalog('iramuteq')
515 self.presLan_fr.install()
516 mylocale = wx.Locale(langues['french'])
517 mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
518 mylocale.AddCatalog('iramuteq')
521 def OnVerif(self, evt) :
522 pack = CheckRPackages(self)
524 dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION)
526 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
529 def DisEnSaveTabAs(self, DISEN):
531 file_menu = self.mb.GetMenu(0)
532 items = file_menu.GetMenuItems()
534 if item.GetId() == ID_SaveTab :
537 def ShowMenu(self, menu, Show=True):
538 menu_pos = self.mb.FindMenu(menu)
539 self.mb.EnableTop(menu_pos, Show)
540 self.mb.UpdateMenus()
543 #--------------------------------------------------------------------
544 def OnClose(self, event):
546 with open(self.ConfigPath['path'], 'w') as f :
547 self.PathPath.write(f)
552 def OnOpenData(self, event):
553 inputname, self.input_path = OnOpen(self, "Data")
555 #filename = self.input_path[0]
556 self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
557 val = get_table_param(self, self.input_path[0])
559 self.tableau.make_content()
560 OpenAnalyse(self, self.tableau.parametres)
561 self.tree.OnItemAppend(self.tableau.parametres)
562 #self.tableau.show_tab()
564 def OnOpenAnalyse(self, event):
565 self.AnalysePath = OnOpen(self, "Analyse")
566 OpenAnalyse(self, self.AnalysePath[1][0], True)
567 self.ShowMenu(_("View"))
569 def OnOpenText(self, event):
570 inputname, self.input_path = OnOpen(self, "Texte")
571 self.filename = self.input_path[0]
575 def OnViewData(self, event):
578 if self.type == "Data":
579 if not self.DataPop :
580 self.Sheet.Populate(self.content)
583 self.ShowAPane(u"Data")
584 elif self.type == "Texte" or self.type == 'Analyse' :
585 if not self.DataTxt :
586 self.text_ctrl_txt.Clear()
587 self.text_ctrl_txt.write(self.content)
588 self.text_ctrl_txt.ShowPosition(0)
591 self.ShowAPane(u"Text")
594 def OnSubText(self, corpus, parametres = None):
595 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
597 builder = SubBuilder(self, corpus, parametres)
599 if builder.res == wx.ID_OK :
600 corpus = builder.doanalyse()
601 self.history.add(corpus.parametres)
602 self.tree.OnItemAppend(corpus.parametres)
603 OpenAnalyse(self, corpus.parametres)
606 dlg = wx.ProgressDialog("Ouverture...",
607 "Veuillez patienter...",
610 style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
613 builder = Builder(self, dlg)
614 if builder.res == wx.ID_OK :
616 corpus = builder.doanalyse()
617 self.history.add(corpus.parametres)
618 self.tree.OnItemAppend(corpus.parametres)
619 OpenAnalyse(self, corpus.parametres)
624 keepGoing = dlg.Update(count, u"Lecture du fichier")
625 self.ShowMenu(_(u"View").decode('utf8'))
626 self.ShowMenu(_(u"Text analysis").decode('utf8'))
627 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
632 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
634 #self.OnViewData(wx.EVT_BUTTON)
636 def OnExit(self, event):
639 def OnAbout(self, event):
640 info = wx.AboutDialogInfo()
641 info.Name = ConfigGlob.get('DEFAULT', 'name')
642 info.Version = ConfigGlob.get('DEFAULT', 'version')
643 info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
644 info.Description = u"""
645 Interface de R pour les Analyses Multidimensionnelles
646 de Textes et de Questionnaires
649 construit avec des logiciels libres.
655 info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
656 dev = ConfigGlob.get('DEFAULT', 'dev').split(';')
657 info.Developers = dev
658 info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier
659 suivant les termes de la Licence Publique Générale GNU telle que publiée
660 par la Free Software Foundation ; soit la version 2 de cette licence,
661 soit (à votre convenance) une version ultérieure.
663 Iramuteq est diffusé dans l'espoir qu'il sera utile,
664 mais SANS AUCUNE GARANTIEÂ ; sans mĂŞme une garantie implicite
665 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER.
666 Voyez la Licence Publique Générale GNU pour plus de détails.
668 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
669 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
670 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
673 def GetDockArt(self):
674 return self._mgr.GetArtProvider()
679 def OnPageChanged(self, event) :
680 new = event.GetSelection()
681 nobject = event.GetEventObject()
682 parent = nobject.GetParent()
683 if isinstance(parent, IraFrame) :
684 npage = self.nb.GetPage(new)
685 if 'parametres' in dir(npage) :
686 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
687 if npage.parametres.get('matrix', False) :
688 self.ShowMenu(_(u"Text analysis").decode('utf8'), False)
689 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), True)
690 elif npage.parametres.get('corpus', False) :
691 self.ShowMenu(_(u"Text analysis").decode('utf8'))
692 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
694 def OnCloseTab(self, evt):
695 #log.info('Closing tab %s' % str(evt.GetEventObject()))
696 ctrl = evt.GetEventObject()
697 if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
701 page = self.nb.GetPage(self.nb.GetSelection())
702 if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
703 self.history.rmtab(page.parametres)
704 self.tree.CloseItem(uuid = page.parametres['uuid'])
705 TabTitle = self.nb.GetPageText(self.nb.GetSelection())
706 # if self.DictTab != {} :
707 # if TabTitle in self.DictTab :
708 # ListFile=self.DictTab[TabTitle]
709 # if False in ListFile:
711 # Certains résultats ne sont pas enregistrer.
712 # Voulez-vous fermer quand mĂŞme ?"""
713 # dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
715 # dlg.CenterOnParent()
716 # if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
721 # for f in ListFile[1:] :
726 # elif True in ListFile :
729 # del self.DictTab[TabTitle]
731 # self.LastTabClose()
734 if self.nb.GetPageCount() == 1 and not notebook :
737 def LastTabClose(self) :
738 if self.nb.GetPageCount() == 1 :
739 #self.DisEnSaveTabAs(False)
741 self.ShowAPane("Text")
743 self.ShowAPane("Data")
745 self.ShowAPane("Intro_Text")
747 # def OnSaveTabAs(self, event):
748 # SelectTab = self.nb.GetSelection()
749 # TabTitle = self.nb.GetPageText(SelectTab)
750 # FileToSave = self.DictTab[TabTitle]
752 # dlg = wx.FileDialog(
753 # self, message="Enregistrer sous...", defaultDir=os.getcwd(),
754 # defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
756 # dlg.SetFilterIndex(2)
757 # dlg.CenterOnParent()
759 # if dlg.ShowModal() == wx.ID_OK:
760 # Path = dlg.GetPath()
761 # Dirname = os.path.dirname(Path)
762 # Filename = dlg.GetFilename()
767 # shutil.copyfile(FileToSave[-1], Path)
768 # os.remove(FileToSave[len(FileToSave) - 1])
769 # NewListFile.append(True)
770 # NewListFile.append(Path)
771 # for f in FileToSave[1:-1] :
772 # Fileout = os.path.join(Dirname, os.path.basename(f))
773 # shutil.copyfile(f, Fileout)
774 # NewListFile.append(Fileout)
777 # self.DictTab[TabText] = NewListFile
778 # del self.DictTab[TabTitle]
779 # self.nb.SetPageText(SelectTab, TabText)
781 def GetStartPosition(self):
785 pt = self.ClientToScreen(wx.Point(0, 0))
787 return wx.Point(pt.x + x, pt.y + x)
789 def ShowAPane(self, panel):
790 for pane in self._mgr.GetAllPanes() :
791 if not pane.IsToolbar() and pane.name != 'lefttree':
793 self._mgr.GetPane(panel).Show()
796 def OnAcceuil(self, event):
797 self.ShowAPane(u"Intro_Text")
800 def CreateHTMLCtrl(self):
801 ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
802 if "gtk2" in wx.PlatformInfo:
803 ctrl.SetStandardFonts()
804 ctrl.SetPage(u"text")
807 def ShowTab(self, evt):
808 self.ShowAPane("Tab_content")
810 ################################################################
812 ################################################################
813 def analyse_matrix(self, analyse, analyse_type = '', matrix = None, dlgnb = 1):
815 matrix = self.tree.getmatrix()
817 analyse(self, matrix, parametres = {'type' : analyse_type}, dlg = progressbar(self, dlgnb))
821 def OnFreq(self, event, matrix = None):
822 self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
824 # matrix = self.tree.getmatrix()
826 # Frequences(self, matrix, parametres = {'type' : 'freq'}, dlg = progressbar(self, 3))
830 def OnChi2(self, event, matrix = None):
832 self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3)
836 def OnSimiTab(self, event, matrix = None):
838 matrix = self.tree.getmatrix()
840 DoSimi(self, matrix, parametres = {'type' : 'simimatrix'}, dlg = progressbar(self, 3))
844 def OnCHDReinert(self, event, matrix = None):
846 matrix = self.tree.getmatrix()
847 AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = progressbar(self, 3))
849 def OnStudent(self, event):
855 def OnRCode(self, event):
861 def OnCHDSIM(self, event):
863 # print 'ATTENTION!!!!'
864 chdsim = ChdCluster(self)
865 if chdsim.val == wx.ID_OK:
870 # def OnCHDReinert(self, event):
872 # # print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
873 # self.quest = AnalyseQuest(self)
874 # if self.quest.val == wx.ID_OK:
879 def OnProto(self, evt) :
880 Prototypical(self, {'type' : 'proto'})
882 def OnSimiTxt(self, evt, corpus = None) :
883 # print 'PLUS DE BUG SUR SIMITXT'
885 #self.Text = SimiTxt(self)
887 corpus = self.tree.getcorpus()
888 self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = progressbar(self, 3))
889 if self.Text.val == wx.ID_OK :
894 def OnWordCloud(self, evt, corpus = None) :
895 # print 'PLUS DE BUG SUR WORDCLOUD'
898 corpus = self.tree.getcorpus()
899 self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = progressbar(self, 3))
900 if self.Text.val == wx.ID_OK :
905 def OnClusterCloud(self, corpus, parametres = None) :
906 self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = progressbar(self, 3))
908 def OnAFCM(self, event):
914 def OnTextStat(self, event, corpus = None):
915 #print 'PAS DE BUG SUR TEXT STAT'
918 corpus = self.tree.getcorpus()
919 self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7))
921 if self.Text.val == wx.ID_OK :
926 def OnTextSpec(self, event, corpus = None):
928 #self.Text = AsLexico(self)
929 #print('ATTENTION : PLUS DE BUG SUR LEXICO')
931 corpus = self.tree.getcorpus()
932 self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
933 if self.Text.val == wx.ID_OK :
938 def OnTextAfcm(self, event):
945 def import_factiva_xml(self,event):
947 ImportFactiva(self, 'xml')
951 def import_factiva_mail(self, evt) :
953 ImportFactiva(self, 'mail')
957 def import_factiva_txt(self, evt) :
959 ImportFactiva(self, 'txt')
963 def OnImportTXM(self, evt) :
965 ImportFactiva(self, 'txm')
969 def ExtractTools(self, evt) :
971 if ID == self.ID_splitvar :
972 Extract(self, 'splitvar')
973 elif ID == self.ID_extractmod :
974 Extract(self, 'mods')
975 elif ID == self.ID_extractthem :
976 Extract(self, 'them')
978 def OnTextReinert(self, event, corpus = None):
980 #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
981 #RunAnalyse(self, corpus, Alceste, OptAlceste)
983 corpus = self.tree.getcorpus()
984 self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = progressbar(self,6))
985 if self.Text.val == wx.ID_OK:
990 def OnPamSimple(self, event, corpus = None):
993 corpus = self.tree.getcorpus()
994 self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = progressbar(self,6))
995 if self.Text.val == wx.ID_OK:
1000 def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
1001 DoSimi(self, param = parametres, fromprof = fromprof, listactives = listactives, actives = actives, tableau = tableau)
1003 # def OnSimi(self,evt):
1005 #print 'ATTENTION !!!! VERGES'
1006 #print 'PLUS DE BUG SUR SIMI'
1007 # self.res = DoSimi(self, param = None)
1008 #self.res = Verges(self)
1009 # if self.res.val == wx.ID_OK :
1013 #################################################################
1015 def OnHelp(self, event):
1016 webbrowser.open('http://www.iramuteq.org/documentation')
1018 def OnPref(self, event):
1019 dlg = PrefDialog(self)
1020 dlg.CenterOnParent()
1021 self.val = dlg.ShowModal()
1024 if self.check_update:
1027 print 'pas de verif'
1029 #CheckRPackages(self)
1031 def OnOpenFromCmdl(self):
1033 if options.filename :
1034 if os.path.exists(options.filename):
1035 self.filename = os.path.abspath(options.filename)
1039 if os.path.exists(os.path.realpath(args[0])):
1040 self.filename = os.path.abspath(os.path.realpath(args[0]))
1046 if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1047 self.tableau = Tableau(self, self.filename)
1048 get_table_param(self, self.filename)
1049 self.tableau.make_content()
1050 self.tableau.show_tab()
1051 #open_data(self, self.filename)
1052 elif os.path.splitext(self.filename)[1] == '.txt':
1054 elif os.path.splitext(self.filename)[1] == '.ira' :
1055 #self.corpus = Corpus(self)
1056 #self.Text = OpenAnalyse(self, self.filename)
1057 OpenAnalyse(self, self.filename)
1059 print 'ce fichier n\'existe pas'
1063 class IntroPanel(wx.Panel):
1064 def __init__(self, parent):
1065 wx.Panel.__init__(self, parent)
1066 col = randint(0, 255)
1067 col1 = randint(0,255)
1068 col2 = randint(0,255)
1070 bckgrdcolor = wx.Colour(col, col1, col2)
1071 self.SetBackgroundColour(bckgrdcolor)
1072 txtcolour = wx.Colour(250, 250, 250)
1073 linkcolor = wx.Colour(255, 0, 0)
1074 sizer1 = wx.BoxSizer(wx.VERTICAL)
1075 sizer2 = wx.BoxSizer(wx.VERTICAL)
1076 sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1077 sizer4 = wx.BoxSizer(wx.VERTICAL)
1078 sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1079 grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1080 grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1081 grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1082 PanelPres = wx.Panel(self)
1083 PanelPres.SetBackgroundColour(bckgrdcolor)
1084 label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1085 label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1086 label_1.SetForegroundColour(wx.RED)
1087 label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1088 label2.SetForegroundColour(txtcolour)
1089 label2.SetBackgroundColour(bckgrdcolor)
1090 #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1091 #label3.SetForegroundColour(txtcolour)
1092 #label3.SetBackgroundColour(bckgrdcolor)
1093 self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1094 self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1095 self.hyper2.SetBackgroundColour(bckgrdcolor)
1096 self.hyper2.EnableRollover(True)
1097 self.hyper2.SetUnderlines(False, False, True)
1098 self.hyper2.SetBold(True)
1099 self.hyper2.UpdateLink()
1100 label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1101 label_lerass.SetForegroundColour(txtcolour)
1102 label_lerass.SetBackgroundColour(bckgrdcolor)
1103 self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1104 self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1105 self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1106 self.hyper_lerass.EnableRollover(True)
1107 self.hyper_lerass.SetUnderlines(False, False, True)
1108 self.hyper_lerass.SetBold(True)
1109 self.hyper_lerass.UpdateLink()
1110 blank = wx.StaticText(PanelPres, -1, u'\n')
1111 blank1 = wx.StaticText(PanelPres, -1, u'\n')
1112 labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1113 labellicence.SetForegroundColour(txtcolour)
1114 labellicence.SetBackgroundColour(bckgrdcolor)
1115 labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1116 labelcopy.SetForegroundColour(txtcolour)
1117 labelcopy.SetBackgroundColour(bckgrdcolor)
1118 python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1119 r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1120 lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1121 but_python = wx.BitmapButton(self, -1, python_img)
1122 but_lexique = wx.BitmapButton(self, -1, lexique_img)
1123 but_r = wx.BitmapButton(self, -1, r_img)
1124 self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1125 self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1126 self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1129 #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1130 grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1131 grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1132 grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1133 sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1134 sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1135 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1136 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1137 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1138 sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1139 sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1140 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1141 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1142 sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1143 sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1144 sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1145 sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1146 PanelPres.SetSizer(sizer2)
1147 sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1148 sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1149 sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1150 grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1151 grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1152 grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1154 sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1155 sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1156 self.SetSizer(sizer1)
1159 def OnPython(self,evt):
1160 webbrowser.open('http://www.python.org')
1162 def OnLexique(self,evt):
1163 webbrowser.open('http://www.lexique.org')
1166 webbrowser.open('http://www.r-project.org')
1168 class MySplashScreen(wx.SplashScreen):
1170 bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1171 wx.SplashScreen.__init__(self, bmp,
1172 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1174 self.Bind(wx.EVT_CLOSE, self.OnClose)
1175 self.fc = wx.FutureCall(1, self.ShowMain)
1177 def OnClose(self, evt):
1181 if self.fc.IsRunning():
1186 displaySize = wx.DisplaySize()
1187 w = displaySize[0]/1.2
1188 h = displaySize[1]/1.2
1189 frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1193 frame.OnOpenFromCmdl()
1194 # if self.fc.IsRunning():
1196 #wx.CallAfter(frame.ShowTip)
1198 class MyApp(wx.App):
1201 Create and show the splash screen. It will then create and show
1202 the main frame when it is time to do so.
1204 wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1205 self.SetAppName("Iramuteq")
1206 splash = MySplashScreen()
1214 if __name__ == '__main__':