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 DefaultConf = ConfigParser()
117 DefaultConf.read(DictConfigPath['preferences'])
118 #repertoire de l'utilisateur
119 if os.getenv('HOME') != None:
120 user_home = os.getenv('HOME')
122 user_home = os.getenv('HOMEPATH')
123 UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq'))
124 #Si pas de fichiers de config utilisateur, on cree le repertoire
125 CreateIraDirectory(UserConfigPath, AppliPath)
126 #fichiers log pour windows (py2exe)
127 log = logging.getLogger('iramuteq')
128 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
129 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
130 fh.setFormatter(formatter)
132 if sys.platform != 'win32' and sys.platform != 'darwin':
133 ch = logging.StreamHandler()
134 ch.setFormatter(formatter)
136 log.setLevel(logging.INFO)
138 class writer(object):
139 def write(self, data):
140 if data.strip() != '' :
141 log.info('ERROR : %s' % data)
143 class printer(object) :
144 def write(self, data) :
145 if data.strip() != '' :
146 log.info('Print : %s' % data)
148 sys.stderr = writer()
149 sys.stdout = printer()
151 ConfigPath = ConstructConfigPath(UserConfigPath)
153 langues = {'french' : wx.LANGUAGE_FRENCH,
154 'english' : wx.LANGUAGE_ENGLISH,
155 'portuguese' : wx.LANGUAGE_PORTUGUESE,
156 'italian' : wx.LANGUAGE_ITALIAN,
157 'spanish' : wx.LANGUAGE_SPANISH}
159 code_langues = {'french' : 'fr_FR',
161 'portuguese' : 'pt_PT',
165 #####################################################################
167 class IraFrame(wx.Frame):
168 def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
169 size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE |
172 log.info('Starting...')
173 wx.Frame.__init__(self, parent, id, title, pos, size, style)
175 self.AppliPath = AppliPath
176 self.images_path = os.path.join(AppliPath,'images')
177 self.UserConfigPath = UserConfigPath
178 #self.RscriptsPath = ConstructRscriptsPath(AppliPath)
179 self.RscriptsPath = PathOut(dirout=os.path.join(AppliPath, 'Rscripts'))
180 self.RscriptsPath.basefiles(RscriptsPath)
181 #self.DictPath = ConstructDicoPath(AppliPath)
182 self.DictPath = ConstructDicoPath(UserConfigPath)
183 self.ConfigGlob = ConfigGlob
184 self.ConfigPath = ConstructConfigPath(UserConfigPath)
185 self.pref = RawConfigParser()
186 #workaround for import problem
187 self.SimiFromCluster = SimiFromCluster
189 gettext.install('iramuteq', os.path.join(AppliPath,'locale'), unicode=True)
190 #langues = ['fr_FR', 'en', 'pt_PT']
194 for langue in code_langues :
195 self.preslangue[langue] = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=[code_langues[langue]])
197 #self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
198 #self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
199 # tell FrameManager to manage this frame
200 #self._mgr = wx.aui.AuiManager()
201 self._mgr = aui.AuiManager()
202 self._mgr.SetManagedWindow(self)
205 #--------------------------------------------------------------------------------
206 self.mb = wx.MenuBar()
208 file_menu = wx.Menu()
209 item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8'))
210 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
211 file_menu.AppendItem(item)
213 item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8'))
214 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
215 file_menu.AppendItem(item)
217 item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
218 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
219 file_menu.AppendItem(item)
222 menuFactiva = wx.Menu()
223 fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml").decode('utf8'))
224 fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
225 fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
226 menuFactiva.AppendItem(fact_from_xml)
227 menuFactiva.AppendItem(fact_from_mail)
228 menuFactiva.AppendItem(fact_from_txt)
229 file_menu.AppendMenu(-1, _(u"Import from factiva").decode('utf8'), menuFactiva)
231 item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8'))
232 item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
233 file_menu.AppendItem(item)
235 menuTools = wx.Menu()
236 splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
237 extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
238 extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
239 menuTools.AppendItem(splitvar)
240 menuTools.AppendItem(extractmod)
241 menuTools.AppendItem(extractthem)
242 self.ID_splitvar = splitvar.GetId()
243 self.ID_extractmod = extractmod.GetId()
244 self.ID_extractthem = extractthem.GetId()
245 file_menu.AppendMenu(-1, _(u"Tools").decode('utf8'), menuTools)
248 #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
249 #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
250 #file_menu.AppendItem(item)
252 file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
254 edit_menu = wx.Menu()
255 edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences').decode('utf8'))
257 view_menu = wx.Menu()
258 view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
259 view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
260 view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
261 #view_menu.AppendSeparator()
262 matrix_menu = wx.Menu()
263 matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
264 matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
265 #matrix_menu.Append(ID_Student, u"t de Student")
266 menu_classif = wx.Menu()
267 menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
268 #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
269 matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
270 #matrix_menu.Append(ID_AFCM, u"AFCM")
271 matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
272 matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
273 ID_RCODE = wx.NewId()
274 matrix_menu.Append(ID_RCODE, u"Code R...")
275 #menu_splittab = wx.Menu()
276 #ID_SPLITVAR = wx.NewId()
277 #splitvar = wx.MenuItem(menu_splittab, ID_SPLITVAR, _(u"Split from variable").decode('utf8'))
278 #menu_splittab.AppendItem(splitvar)
279 #matrix_menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), menu_splittab)
280 self.matrix_menu = matrix_menu
282 text_menu = wx.Menu()
283 #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
284 text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
285 text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
286 #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
287 menu_classiftxt = wx.Menu()
288 menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
289 #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
290 text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
291 text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'))
293 text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
294 self.text_menu = text_menu
296 help_menu = wx.Menu()
297 help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
298 help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
300 self.mb.Append(file_menu, _(u"File").decode('utf8'))
301 self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
302 self.mb.Append(view_menu, _(u"View").decode('utf8'))
303 self.mb.Append(matrix_menu, _(u"Matrix analysis").decode('utf8'))
304 self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
305 self.mb.Append(help_menu, _(u"Help").decode('utf8'))
307 self.SetMenuBar(self.mb)
308 #--------------------------------------------------------------------
309 self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
310 self.statusbar.SetStatusWidths([-2, -3])
311 self.statusbar.SetStatusText(u"Prêt", 0)
312 self.statusbar.SetStatusText(u"Bienvenue", 1)
314 # min size for the frame itself isn't completely done.
315 # see the end up FrameManager::Update() for the test
316 # code. For now, just hard code a frame minimum size
317 self.SetMinSize(wx.Size(400, 400))
319 # create some toolbars
320 tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
321 wx.TB_FLAT | wx.TB_NODIVIDER)
322 tb1.SetToolBitmapSize(wx.Size(16, 16))
323 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")
325 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")
329 #------------------------------------------------------------------------------------------------
331 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)
333 #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
334 # Name("Text").CenterPane())
335 self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
336 Name("Text").CenterPane())
337 #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
339 self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
341 #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
342 # with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
344 self.history = History(os.path.join(UserConfigPath, 'history.db'))
345 self.tree = LeftTree(self)
346 self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Navigator").decode('utf8')).
347 Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
348 MinimizeButton(True))
350 #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)
351 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)
352 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
353 self.nb.SetAGWWindowStyleFlag(notebook_flags)
354 self.nb.SetArtProvider(aui.ChromeTabArt())
355 #self.nb.SetArtProvider(aui.VC8TabArt())
356 #self.nb.parent = self
357 #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
358 #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
359 # Name("Tab_content").
361 self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
365 #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
366 #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
367 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
368 self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
369 # add the toolbars to the manager
371 #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
372 # Name("tb1").Caption("Fichiers").
373 # ToolbarPane().Top().
374 # LeftDockable(False).RightDockable(False))
375 self._mgr.AddPane(tb1, aui.AuiPaneInfo().
376 Name("tb1").Caption("Fichiers").
378 LeftDockable(True).RightDockable(False))
380 self.ShowAPane("Intro_Text")
381 self._mgr.GetPane("lefttree").Show()
382 self._mgr.GetPane("classif_tb").Hide()
383 # "commit" all changes made to FrameManager
386 # Show How To Use The Closing Panes Event
387 ##################################################################
388 self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
389 self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
390 self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
391 self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
392 self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
393 self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
394 self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
395 self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
396 self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
397 self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
398 self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
399 self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
400 self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
401 self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
402 self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
403 self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
404 self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
405 self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
406 self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
407 self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
408 #self.Bind(wx.EVT_MENU, self.OnSplitVar, id=ID_SPLITVAR)
409 #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
410 self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
411 self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
412 self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
413 self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
414 self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
415 self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
416 self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
417 self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
418 self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
419 #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
420 self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
421 self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
422 self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
423 self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM)
424 self.Bind(wx.EVT_CLOSE, self.OnClose)
425 ##################################################################
426 flags = self._mgr.GetAGWFlags()
427 #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
428 #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
429 #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
430 flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
431 self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
432 self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
433 self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
436 self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
437 self.SetIcon(self._icon)
438 ##########################
440 self.input_path = [False]
441 self.TEMPDIR = tempfile.mkdtemp('iramuteq')
442 self.FileTabList = []
448 self.g_header = False
455 self.SysEncoding = sys.getdefaultencoding()
456 self.syscoding = sys.getdefaultencoding()
457 #print 'SysEncoding',self.SysEncoding
458 if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
461 ##############################################################@
462 self.DisEnSaveTabAs(False)
463 self.ShowMenu('view', False)
464 self.ShowMenu('matrix', False)
465 self.ShowMenu('text', False)
476 def finish_init(self) :
478 self.pref.read(self.ConfigPath['preferences'])
481 self.pref.read(self.ConfigPath['preferences'])
488 self.pref.read(self.ConfigPath['preferences'])
490 self.sound = self.pref.getboolean('iramuteq', 'sound')
491 self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
492 self.version = ConfigGlob.get('DEFAULT', 'version')
493 #configuration des chemins de R
494 self.PathPath = ConfigParser()
495 self.PathPath.read(ConfigPath['path'])
497 if not CheckRPath(self.PathPath) :
498 if sys.platform == 'win32':
499 BestRPath = FindRPAthWin32()
501 BestRPath = FindRPathNix()
503 self.PathPath.set('PATHS', 'rpath', BestRPath)
504 with open(ConfigPath['path'], 'w') as f :
505 self.PathPath.write(f)
509 self.RPath = self.PathPath.get('PATHS', 'rpath')
512 if not RLibsAreInstalled(self) :
516 Le chemin de l'executable de R n'a pas été trouvé.
517 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
518 Si R n'est pas installé dans le répertoire par défaut
519 (souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
520 vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
521 dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
523 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
527 def setlangue(self) :
528 self.pref.read(self.ConfigPath['preferences'])
530 guilangue = self.pref.get('iramuteq', 'guilanguage')
532 guilangue = DefaultConf.get('iramuteq', 'guilanguage')
533 self.preslangue.get(guilangue, 'english').install()
535 def OnVerif(self, evt) :
536 pack = CheckRPackages(self)
538 dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION)
540 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
543 def DisEnSaveTabAs(self, DISEN):
545 file_menu = self.mb.GetMenu(0)
546 items = file_menu.GetMenuItems()
548 if item.GetId() == ID_SaveTab :
551 def ShowMenu(self, menu, Show=True):
554 elif menu == 'matrix' :
556 elif menu == 'view' :
561 #menu_pos = self.mb.FindMenu(menu)
562 if not menu_pos is None :
563 self.mb.EnableTop(menu_pos, Show)
564 self.mb.UpdateMenus()
567 #--------------------------------------------------------------------
568 def OnClose(self, event):
570 with open(self.ConfigPath['path'], 'w') as f :
571 self.PathPath.write(f)
576 def OnOpenData(self, event):
577 inputname, self.input_path = OnOpen(self, "Data")
579 #filename = self.input_path[0]
580 self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
581 val = get_table_param(self, self.input_path[0])
583 self.tableau.make_content()
584 OpenAnalyse(self, self.tableau.parametres)
585 self.tree.OnItemAppend(self.tableau.parametres)
586 #self.tableau.show_tab()
588 def OnOpenAnalyse(self, event):
589 self.AnalysePath = OnOpen(self, "Analyse")
590 OpenAnalyse(self, self.AnalysePath[1][0], True)
591 self.ShowMenu('view')
593 def OnOpenText(self, event):
594 inputname, self.input_path = OnOpen(self, "Texte")
595 self.filename = self.input_path[0]
599 def OnViewData(self, event):
600 if self.type == "Data":
601 if not self.DataPop :
602 self.Sheet.Populate(self.content)
605 self.ShowAPane(u"Data")
606 elif self.type == "Texte" or self.type == 'Analyse' :
607 if not self.DataTxt :
608 self.text_ctrl_txt.Clear()
609 self.text_ctrl_txt.write(self.content)
610 self.text_ctrl_txt.ShowPosition(0)
613 self.ShowAPane(u"Text")
616 def OnSubText(self, corpus, parametres = None):
618 corpus = self.tree.getcorpus()
619 builder = SubBuilder(self, corpus, parametres)
620 if builder.res == wx.ID_OK :
621 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
623 corpus = builder.doanalyse()
624 self.history.add(corpus.parametres)
625 self.tree.OnItemAppend(corpus.parametres)
626 OpenAnalyse(self, corpus.parametres)
630 dlg = wx.ProgressDialog("Ouverture...",
631 "Veuillez patienter...",
634 style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
637 builder = Builder(self, dlg)
638 if builder.res == wx.ID_OK :
640 corpus = builder.doanalyse()
641 self.history.add(corpus.parametres)
642 self.tree.OnItemAppend(corpus.parametres)
643 OpenAnalyse(self, corpus.parametres)
649 keepGoing = dlg.Update(count, u"Lecture du fichier")
650 self.ShowMenu('view')
651 self.ShowMenu('text')
652 self.ShowMenu('matrix', False)
657 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
659 #self.OnViewData(wx.EVT_BUTTON)
661 def OnExit(self, event):
664 def OnAbout(self, event):
665 info = wx.AboutDialogInfo()
666 info.Name = ConfigGlob.get('DEFAULT', 'name')
667 info.Version = ConfigGlob.get('DEFAULT', 'version')
668 info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
669 info.Description = u"""
670 Interface de R pour les Analyses Multidimensionnelles
671 de Textes et de Questionnaires
674 construit avec des logiciels libres.
680 info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
681 dev = ConfigGlob.get('DEFAULT', 'dev').decode('utf8').split(';')
682 info.Developers = dev
683 info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier
684 suivant les termes de la Licence Publique Générale GNU telle que publiée
685 par la Free Software Foundation ; soit la version 2 de cette licence,
686 soit (à votre convenance) une version ultérieure.
688 Iramuteq est diffusé dans l'espoir qu'il sera utile,
689 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite
690 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER.
691 Voyez la Licence Publique Générale GNU pour plus de détails.
693 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
694 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
695 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
698 def GetDockArt(self):
699 return self._mgr.GetArtProvider()
704 def OnPageChanged(self, event) :
705 new = event.GetSelection()
706 nobject = event.GetEventObject()
707 parent = nobject.GetParent()
708 if isinstance(parent, IraFrame) :
709 npage = self.nb.GetPage(new)
710 if 'parametres' in dir(npage) :
711 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
712 if npage.parametres.get('matrix', False) :
713 self.ShowMenu('text', False)
714 self.ShowMenu('matrix', True)
715 elif npage.parametres.get('corpus', False) :
716 self.ShowMenu('text')
717 self.ShowMenu('matrix', False)
719 def OnCloseTab(self, evt):
720 #log.info('Closing tab %s' % str(evt.GetEventObject()))
721 ctrl = evt.GetEventObject()
722 if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
726 page = self.nb.GetPage(self.nb.GetSelection())
727 if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
728 self.history.rmtab(page.parametres)
729 self.tree.CloseItem(uuid = page.parametres['uuid'])
730 TabTitle = self.nb.GetPageText(self.nb.GetSelection())
732 if self.nb.GetPageCount() == 1 and not notebook :
735 def LastTabClose(self) :
736 if self.nb.GetPageCount() == 1 :
737 #self.DisEnSaveTabAs(False)
739 self.ShowAPane("Text")
741 self.ShowAPane("Data")
743 self.ShowAPane("Intro_Text")
745 def GetStartPosition(self):
749 pt = self.ClientToScreen(wx.Point(0, 0))
751 return wx.Point(pt.x + x, pt.y + x)
753 def ShowAPane(self, panel):
754 for pane in self._mgr.GetAllPanes() :
755 if not pane.IsToolbar() and pane.name != 'lefttree':
757 self._mgr.GetPane(panel).Show()
760 def OnAcceuil(self, event):
761 self.ShowAPane(u"Intro_Text")
764 def CreateHTMLCtrl(self):
765 ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
766 if "gtk2" in wx.PlatformInfo:
767 ctrl.SetStandardFonts()
768 ctrl.SetPage(u"text")
771 def ShowTab(self, evt):
772 self.ShowAPane("Tab_content")
774 ################################################################
776 ################################################################
777 def analyse_matrix(self, analyse, analyse_type = '', matrix = None, parametres = None, dlgnb = 1):
779 matrix = self.tree.getmatrix()
780 if parametres is not None :
781 parametres['type'] = analyse_type
783 parametres = {'type' : analyse_type}
785 #print 'plus de bug@@@@@@@@@@@@@@@@@@@@@@'
786 analyse(self, matrix, parametres = parametres, dlg = dlgnb)
790 def OnFreq(self, event, matrix = None):
791 self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
793 def OnChi2(self, event, matrix = None):
794 self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3)
796 def OnSimiTab(self, event, matrix = None):
797 self.analyse_matrix(DoSimi, matrix = matrix, analyse_type = 'simimatrix', dlgnb = 5)
799 def OnCHDReinert(self, event, matrix = None):
801 # matrix = self.tree.getmatrix()
802 #AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = 3)
803 self.analyse_matrix(AnalyseQuest, matrix = matrix, analyse_type = 'reinertmatrix', dlgnb = 5)
805 def OnStudent(self, event):
811 def OnRCode(self, event):
817 def OnCHDSIM(self, event):
819 # print 'ATTENTION!!!!'
820 chdsim = ChdCluster(self)
821 if chdsim.val == wx.ID_OK:
826 # def OnCHDReinert(self, event):
828 # # print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
829 # self.quest = AnalyseQuest(self)
830 # if self.quest.val == wx.ID_OK:
835 def OnProto(self, evt, matrix = None) :
836 self.analyse_matrix(Prototypical, matrix = matrix, analyse_type = 'proto', dlgnb = 3)
837 #Prototypical(self, {'type' : 'proto'})
839 def OnSplitVar(self, evt, matrix = None):
840 self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', parametres = {'pathout': matrix.pathout.dirout}, dlgnb = 3)
841 matrix = self.tree.getmatrix()
844 def OnSimiTxt(self, evt, corpus = None) :
845 # print 'PLUS DE BUG SUR SIMITXT'
847 #self.Text = SimiTxt(self)
849 corpus = self.tree.getcorpus()
850 self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = 3)
851 if self.Text.val == wx.ID_OK :
856 def OnWordCloud(self, evt, corpus = None) :
857 # print 'PLUS DE BUG SUR WORDCLOUD'
860 corpus = self.tree.getcorpus()
861 self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = 3)
862 if self.Text.val == wx.ID_OK :
867 def OnClusterCloud(self, corpus, parametres = None) :
868 self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = 3)
870 def OnAFCM(self, event):
876 def OnTextStat(self, event, corpus = None):
877 #print 'PAS DE BUG SUR TEXT STAT'
880 corpus = self.tree.getcorpus()
881 self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = 7)
883 if self.Text.val == wx.ID_OK :
888 def OnTextSpec(self, event, corpus = None):
890 #self.Text = AsLexico(self)
891 #print('ATTENTION : PLUS DE BUG SUR LEXICO')
893 corpus = self.tree.getcorpus()
894 self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = 3)
895 if self.Text.val == wx.ID_OK :
900 def OnTextAfcm(self, event):
907 def import_factiva_xml(self,event):
909 ImportFactiva(self, 'xml')
913 def import_factiva_mail(self, evt) :
915 ImportFactiva(self, 'mail')
919 def import_factiva_txt(self, evt) :
921 ImportFactiva(self, 'txt')
925 def OnImportTXM(self, evt) :
927 ImportFactiva(self, 'txm')
931 def ExtractTools(self, evt) :
933 if ID == self.ID_splitvar :
934 Extract(self, 'splitvar')
935 elif ID == self.ID_extractmod :
936 Extract(self, 'mods')
937 elif ID == self.ID_extractthem :
938 Extract(self, 'them')
940 def OnTextReinert(self, event, corpus = None):
942 #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
943 #RunAnalyse(self, corpus, Alceste, OptAlceste)
945 corpus = self.tree.getcorpus()
946 self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6)
947 if self.Text.val == wx.ID_OK:
952 def OnPamSimple(self, event, corpus = None):
955 corpus = self.tree.getcorpus()
956 self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = 6)
957 if self.Text.val == wx.ID_OK:
962 def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
963 DoSimi(self, param = parametres, fromprof = fromprof, listactives = listactives, actives = actives, tableau = tableau)
965 # def OnSimi(self,evt):
967 #print 'ATTENTION !!!! VERGES'
968 #print 'PLUS DE BUG SUR SIMI'
969 # self.res = DoSimi(self, param = None)
970 #self.res = Verges(self)
971 # if self.res.val == wx.ID_OK :
975 #################################################################
977 def OnHelp(self, event):
978 webbrowser.open('http://www.iramuteq.org/documentation')
980 def OnPref(self, event):
981 dlg = PrefDialog(self)
983 self.val = dlg.ShowModal()
986 if self.check_update:
991 #CheckRPackages(self)
993 def OnOpenFromCmdl(self):
995 if options.filename :
996 if os.path.exists(options.filename):
997 self.filename = os.path.abspath(options.filename)
1001 if os.path.exists(os.path.realpath(args[0])):
1002 self.filename = os.path.abspath(os.path.realpath(args[0]))
1008 if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1009 self.tableau = Tableau(self, self.filename)
1010 val = get_table_param(self, self.filename)
1011 if val == wx.ID_OK :
1012 self.tableau.make_content()
1013 OpenAnalyse(self, self.tableau.parametres)
1014 self.tree.OnItemAppend(self.tableau.parametres)
1015 #get_table_param(self, self.filename)
1016 #self.tableau.make_content()
1017 #self.tableau.show_tab()
1018 #open_data(self, self.filename)
1019 elif os.path.splitext(self.filename)[1] == '.txt':
1021 elif os.path.splitext(self.filename)[1] == '.ira' :
1022 #self.corpus = Corpus(self)
1023 #self.Text = OpenAnalyse(self, self.filename)
1024 OpenAnalyse(self, self.filename)
1026 print 'ce fichier n\'existe pas'
1030 class IntroPanel(wx.Panel):
1031 def __init__(self, parent):
1032 wx.Panel.__init__(self, parent)
1033 col = randint(0, 255)
1034 col1 = randint(0,255)
1035 col2 = randint(0,255)
1037 bckgrdcolor = wx.Colour(col, col1, col2)
1038 self.SetBackgroundColour(bckgrdcolor)
1039 txtcolour = wx.Colour(250, 250, 250)
1040 linkcolor = wx.Colour(255, 0, 0)
1041 sizer1 = wx.BoxSizer(wx.VERTICAL)
1042 sizer2 = wx.BoxSizer(wx.VERTICAL)
1043 sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1044 sizer4 = wx.BoxSizer(wx.VERTICAL)
1045 sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1046 grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1047 grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1048 grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1049 PanelPres = wx.Panel(self)
1050 PanelPres.SetBackgroundColour(bckgrdcolor)
1051 label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1052 label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1053 label_1.SetForegroundColour(wx.RED)
1054 label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1055 label2.SetForegroundColour(txtcolour)
1056 label2.SetBackgroundColour(bckgrdcolor)
1057 #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1058 #label3.SetForegroundColour(txtcolour)
1059 #label3.SetBackgroundColour(bckgrdcolor)
1060 self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1061 self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1062 self.hyper2.SetBackgroundColour(bckgrdcolor)
1063 self.hyper2.EnableRollover(True)
1064 self.hyper2.SetUnderlines(False, False, True)
1065 self.hyper2.SetBold(True)
1066 self.hyper2.UpdateLink()
1067 label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1068 label_lerass.SetForegroundColour(txtcolour)
1069 label_lerass.SetBackgroundColour(bckgrdcolor)
1070 self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1071 self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1072 self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1073 self.hyper_lerass.EnableRollover(True)
1074 self.hyper_lerass.SetUnderlines(False, False, True)
1075 self.hyper_lerass.SetBold(True)
1076 self.hyper_lerass.UpdateLink()
1077 blank = wx.StaticText(PanelPres, -1, u'\n')
1078 blank1 = wx.StaticText(PanelPres, -1, u'\n')
1079 labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1080 labellicence.SetForegroundColour(txtcolour)
1081 labellicence.SetBackgroundColour(bckgrdcolor)
1082 labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1083 labelcopy.SetForegroundColour(txtcolour)
1084 labelcopy.SetBackgroundColour(bckgrdcolor)
1085 python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1086 r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1087 lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1088 but_python = wx.BitmapButton(self, -1, python_img)
1089 but_lexique = wx.BitmapButton(self, -1, lexique_img)
1090 but_r = wx.BitmapButton(self, -1, r_img)
1091 self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1092 self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1093 self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1096 #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1097 grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1098 grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1099 grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1100 sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1101 sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1102 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1103 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1104 sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1105 sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1106 sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1107 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1108 #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1109 sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1110 sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1111 sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1112 sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1113 PanelPres.SetSizer(sizer2)
1114 sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1115 sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1116 sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1117 grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1118 grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1119 grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1121 sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1122 sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1123 self.SetSizer(sizer1)
1126 def OnPython(self,evt):
1127 webbrowser.open('http://www.python.org')
1129 def OnLexique(self,evt):
1130 webbrowser.open('http://www.lexique.org')
1133 webbrowser.open('http://www.r-project.org')
1135 class MySplashScreen(wx.SplashScreen):
1137 bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1138 wx.SplashScreen.__init__(self, bmp,
1139 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1141 self.Bind(wx.EVT_CLOSE, self.OnClose)
1142 self.fc = wx.FutureCall(1, self.ShowMain)
1144 def OnClose(self, evt):
1148 if self.fc.IsRunning():
1153 displaySize = wx.DisplaySize()
1154 w = displaySize[0]/1.2
1155 h = displaySize[1]/1.2
1156 frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1160 frame.OnOpenFromCmdl()
1161 # if self.fc.IsRunning():
1163 #wx.CallAfter(frame.ShowTip)
1165 class MyApp(wx.App):
1168 Create and show the splash screen. It will then create and show
1169 the main frame when it is time to do so.
1171 wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1172 self.SetAppName("Iramuteq")
1173 splash = MySplashScreen()
1181 if __name__ == '__main__':