From 25061ca972d5be7a8ef3aa42276accc3761a3364 Mon Sep 17 00:00:00 2001 From: pierre Date: Thu, 3 Jan 2013 23:01:29 +0100 Subject: [PATCH] mac OS X --- OptionAlceste.py | 2 +- ProfList.py | 104 ++++++++++++++++++------------------ dialog.py | 87 ++++++++++++++++++++++++------ images/iraicone.icns | Bin 0 -> 47174 bytes layout.py | 13 +++-- listlex.py | 2 +- search_list.py | 148 ++++++++++++++++++++++++++------------------------- setup.py | 9 +--- 8 files changed, 212 insertions(+), 153 deletions(-) create mode 100644 images/iraicone.icns diff --git a/OptionAlceste.py b/OptionAlceste.py index ea3ba80..f515d7a 100755 --- a/OptionAlceste.py +++ b/OptionAlceste.py @@ -76,7 +76,7 @@ analysée (2 = automatique)""" def __do_layout(self): sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_2 = wx.BoxSizer(wx.VERTICAL) - grid_sizer2 = wx.FlexGridSizer(15, 2, 0, 0) + grid_sizer2 = wx.FlexGridSizer(0, 2, 0, 0) grid_button = wx.FlexGridSizer(1, 3, 0, 0) #grid_sizer2.Add(self.label_dict, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 0) diff --git a/ProfList.py b/ProfList.py index cca1423..9097897 100644 --- a/ProfList.py +++ b/ProfList.py @@ -20,7 +20,7 @@ import wx.lib.mixins.listctrl as listmix from tabsimi import DoSimi from listlex import ListForSpec from chemins import ConstructPathOut, ffr -from dialog import PrefExport, PrefUCECarac, SearchDial +from dialog import PrefExport, PrefUCECarac, SearchDial, message from tableau import Tableau from search_tools import SearchFrame import webbrowser @@ -1593,53 +1593,55 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col # def OnCloseWindow(self, event): # self.Destroy() # -class message(wx.Dialog): - def __init__(self, parent, title, size): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = title, pos = wx.DefaultPosition, size = size, style = wx.DEFAULT_DIALOG_STYLE ) - - self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) - - self.html = "" - self.HtmlPage=wx.html.HtmlWindow(self, -1) - self.HtmlPage.SetMinSize( size ) - if "gtk2" in wx.PlatformInfo: - self.HtmlPage.SetStandardFonts() - self.HtmlPage.SetFonts('Courier','Courier') - - self.button_1 = wx.Button(self, wx.ID_CANCEL) - self.button_2 = wx.Button(self, wx.ID_SAVE) - - self.Bind(wx.EVT_BUTTON, self.OnSavePage, self.button_2) - self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1) - self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) - self.__do_layout() - - def __do_layout(self): - sizer_2 = wx.BoxSizer(wx.VERTICAL) - sizer_2.Add(self.HtmlPage, 0, wx.EXPAND|wx.ADJUST_MINSIZE, 0) - m_sdbSizer1 = wx.StdDialogButtonSizer() - m_sdbSizer1.AddButton( self.button_1 ) - m_sdbSizer1.AddButton( self.button_2 ) - m_sdbSizer1.Realize() - sizer_2.Add(m_sdbSizer1, 1, wx.EXPAND, 5) - self.SetSizer(sizer_2) - self.Layout() - sizer_2.Fit( self ) - - def OnSavePage(self, evt) : - dlg = wx.FileDialog( - self, message="Enregistrer sous...", defaultDir=os.getcwd(), - defaultFile="concordancier.html", wildcard="html|*.html", style=wx.SAVE | wx.OVERWRITE_PROMPT - ) - dlg.SetFilterIndex(2) - dlg.CenterOnParent() - if dlg.ShowModal() == wx.ID_OK: - path = dlg.GetPath() - with open(path, 'w') as f : - f.write(self.html) - - def OnCloseMe(self, event): - self.Close(True) - - def OnCloseWindow(self, event): - self.Destroy() +#class message(wx.Dialog): +# def __init__(self, parent, title, size, save = True): +# wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = title, pos = wx.DefaultPosition, size = size, style = wx.DEFAULT_DIALOG_STYLE ) +# self.save = save +# self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) +# +# self.html = "" +# self.HtmlPage=wx.html.HtmlWindow(self, -1) +# self.HtmlPage.SetMinSize( size ) +# if "gtk2" in wx.PlatformInfo: +# self.HtmlPage.SetStandardFonts() +# self.HtmlPage.SetFonts('Courier','Courier') +# +# self.button_1 = wx.Button(self, wx.ID_CANCEL) +# +# self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1) +# if self.save : +# self.button_2 = wx.Button(self, wx.ID_SAVE) +# self.Bind(wx.EVT_BUTTON, self.OnSavePage, self.button_2) +# self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) +# self.__do_layout() +# +# def __do_layout(self): +# sizer_2 = wx.BoxSizer(wx.VERTICAL) +# sizer_2.Add(self.HtmlPage, 0, wx.EXPAND|wx.ADJUST_MINSIZE, 0) +# m_sdbSizer1 = wx.StdDialogButtonSizer() +# m_sdbSizer1.AddButton( self.button_1 ) +# if self.save : +# m_sdbSizer1.AddButton( self.button_2 ) +# m_sdbSizer1.Realize() +# sizer_2.Add(m_sdbSizer1, 1, wx.EXPAND, 5) +# self.SetSizer(sizer_2) +# self.Layout() +# sizer_2.Fit( self ) +# +# def OnSavePage(self, evt) : +# dlg = wx.FileDialog( +# self, message="Enregistrer sous...", defaultDir=os.getcwd(), +# defaultFile="concordancier.html", wildcard="html|*.html", style=wx.SAVE | wx.OVERWRITE_PROMPT +# ) +# dlg.SetFilterIndex(2) +# dlg.CenterOnParent() +# if dlg.ShowModal() == wx.ID_OK: +# path = dlg.GetPath() +# with open(path, 'w') as f : +# f.write(self.html) +# +# def OnCloseMe(self, event): +# self.Close(True) +# +# def OnCloseWindow(self, event): +# self.Destroy() diff --git a/dialog.py b/dialog.py index 691a291..da4eed7 100755 --- a/dialog.py +++ b/dialog.py @@ -35,7 +35,7 @@ class FileOptionDialog(wx.Dialog): self.PostCreate(pre) sizer = wx.BoxSizer(wx.VERTICAL) - grid_sizer = wx.FlexGridSizer(5, 2, 2, 2) + grid_sizer = wx.FlexGridSizer(0, 2, 2, 2) ############################## label = wx.StaticText(self, -1, u"La première ligne contient les noms de colonne") @@ -379,7 +379,7 @@ class PrefDialog ( wx.Dialog ): bSizer1 = wx.BoxSizer( wx.VERTICAL ) - fgSizer1 = wx.FlexGridSizer( 4, 3, 0, 0 ) + fgSizer1 = wx.FlexGridSizer( 0, 3, 0, 0 ) fgSizer1.SetFlexibleDirection( wx.BOTH ) fgSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) @@ -706,13 +706,13 @@ au chi2 d'association de la forme""" def __do_layout(self): sizer_2 = wx.BoxSizer(wx.VERTICAL) - fsizer = wx.FlexGridSizer(12,2,0,5) - grid_min = wx.FlexGridSizer(1, 2, 0, 0) - grid_max = wx.FlexGridSizer(1, 2, 0, 0) - grid_minmax = wx.FlexGridSizer(1, 2, 0, 0) - grid_min_tchi = wx.FlexGridSizer(1, 2, 0, 0) - grid_max_tchi = wx.FlexGridSizer(1, 2, 0, 0) - grid_minmax_tchi = wx.FlexGridSizer(1, 2, 0, 0) + fsizer = wx.FlexGridSizer(0,2,0,5) + grid_min = wx.FlexGridSizer(0, 2, 0, 0) + grid_max = wx.FlexGridSizer(0, 2, 0, 0) + grid_minmax = wx.FlexGridSizer(0, 2, 0, 0) + grid_min_tchi = wx.FlexGridSizer(0, 2, 0, 0) + grid_max_tchi = wx.FlexGridSizer(0, 2, 0, 0) + grid_minmax_tchi = wx.FlexGridSizer(0, 2, 0, 0) sizer_3 = wx.BoxSizer(wx.VERTICAL) @@ -778,7 +778,7 @@ au chi2 d'association de la forme""" sizer_2.Add(fsizer, 0, wx.EXPAND, 0) - bsizer_1 = wx.FlexGridSizer(3,3,0,0) + bsizer_1 = wx.FlexGridSizer(0,3,0,0) bsizer_1.Add(self.label_7, 0, wx.ALL | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 5) bsizer_1.Add(self.check4, 0, wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, 5) grid_min.Add(self.label_min, 0,wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 5) @@ -821,7 +821,7 @@ au chi2 d'association de la forme""" sizer_2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 5) - fsizer2 = wx.FlexGridSizer(2,2,0,0) + fsizer2 = wx.FlexGridSizer(0,2,0,0) fsizer2.Add(self.label_sphere, 0, wx.ALL | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 5) fsizer2.Add(self.slider_sphere, 0, wx.ALL | wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL, 5) fsizer2.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) @@ -1097,7 +1097,7 @@ class StatDialog(wx.Dialog): def __do_layout(self) : first = wx.BoxSizer(wx.VERTICAL) - sizer = wx.FlexGridSizer(4,2,0,0) + sizer = wx.FlexGridSizer(0,2,0,0) sizer.Add(self.label_lem, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT, 5) sizer.Add(self.radio_lem, 0, wx.ALIGN_LEFT, 5) sizer.Add(wx.StaticLine(self),0, wx.ALIGN_LEFT, 5) @@ -1168,7 +1168,7 @@ class LexDialog( wx.Dialog ): bSizer2 = wx.BoxSizer( wx.VERTICAL ) - fgSizer2 = wx.FlexGridSizer( 2, 2, 0, 0 ) + fgSizer2 = wx.FlexGridSizer( 0, 2, 0, 0 ) fgSizer2.SetFlexibleDirection( wx.BOTH ) fgSizer2.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) @@ -1212,7 +1212,7 @@ class PrefUCECarac(wx.Dialog): wx.Dialog.__init__(self, *args, **kwds) self.parent = parent first = wx.BoxSizer(wx.VERTICAL) - sizer = wx.FlexGridSizer(2,2,0,0) + sizer = wx.FlexGridSizer(0,2,0,0) self.label_type = wx.StaticText(self, -1, u"Score de classement") sizer.Add(self.label_type, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT, 5) self.radio_type = wx.RadioBox(self, -1, u"", choices=[u'absolu (somme des chi2 des formes marquées de l\'UCE)', u'relatif (moyenne des chi2 des formes marquées de l\'UCE)'], majorDimension=0, style=wx.RA_SPECIFY_ROWS) @@ -1243,7 +1243,7 @@ class PrefSegProf(wx.Dialog) : self.label = wx.StaticText( self, wx.ID_ANY, txt, wx.DefaultPosition, wx.DefaultSize, 0 ) bSizer1.Add( self.label, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5 ) - fgSizer1 = wx.FlexGridSizer( 2, 2, 0, 0 ) + fgSizer1 = wx.FlexGridSizer( 0, 2, 0, 0 ) fgSizer1.SetFlexibleDirection( wx.BOTH ) fgSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) @@ -1314,7 +1314,7 @@ class PrefQuestAlc ( wx.Dialog ): #--------------------------------------------------------------- bSizer2 = wx.BoxSizer( wx.VERTICAL ) - fgSizer1 = wx.FlexGridSizer( 2, 2, 0, 0 ) + fgSizer1 = wx.FlexGridSizer( 0, 2, 0, 0 ) fgSizer1.SetFlexibleDirection( wx.BOTH ) fgSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) @@ -1738,7 +1738,7 @@ class OptLexi(wx.Dialog): def __do_layout(self): # begin wxGlade: MyDialog.__do_layout sizer_1 = wx.BoxSizer(wx.VERTICAL) - sizer_2 = wx.FlexGridSizer(2,2,0,0) + sizer_2 = wx.FlexGridSizer(0,2,0,0) sizer_3 = wx.BoxSizer(wx.HORIZONTAL) #sizer_2.Add(self.labellem, 0, wx.ALIGN_CENTER_VERTICAL, 3) #sizer_2.Add(self.checklem, 0, wx.ALIGN_CENTER_VERTICAL, 3) @@ -2445,3 +2445,56 @@ class CorpusPref ( wx.Dialog ): else : parametres[val] = 0 return parametres + +class message(wx.Dialog): + def __init__(self, parent, title, size, save = True): + wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = title, pos = wx.DefaultPosition, size = size, style = wx.DEFAULT_DIALOG_STYLE ) + self.save = save + self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) + + self.html = "" + self.HtmlPage=wx.html.HtmlWindow(self, -1) + self.HtmlPage.SetMinSize( size ) + if "gtk2" in wx.PlatformInfo: + self.HtmlPage.SetStandardFonts() + self.HtmlPage.SetFonts('Courier','Courier') + + self.button_1 = wx.Button(self, wx.ID_CANCEL) + + self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1) + if self.save : + self.button_2 = wx.Button(self, wx.ID_SAVE) + self.Bind(wx.EVT_BUTTON, self.OnSavePage, self.button_2) + self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) + self.__do_layout() + + def __do_layout(self): + sizer_2 = wx.BoxSizer(wx.VERTICAL) + sizer_2.Add(self.HtmlPage, 0, wx.EXPAND|wx.ADJUST_MINSIZE, 0) + m_sdbSizer1 = wx.StdDialogButtonSizer() + m_sdbSizer1.AddButton( self.button_1 ) + if self.save : + m_sdbSizer1.AddButton( self.button_2 ) + m_sdbSizer1.Realize() + sizer_2.Add(m_sdbSizer1, 1, wx.EXPAND, 5) + self.SetSizer(sizer_2) + self.Layout() + sizer_2.Fit( self ) + + def OnSavePage(self, evt) : + dlg = wx.FileDialog( + self, message="Enregistrer sous...", defaultDir=os.getcwd(), + defaultFile="concordancier.html", wildcard="html|*.html", style=wx.SAVE | wx.OVERWRITE_PROMPT + ) + dlg.SetFilterIndex(2) + dlg.CenterOnParent() + if dlg.ShowModal() == wx.ID_OK: + path = dlg.GetPath() + with open(path, 'w') as f : + f.write(self.html) + + def OnCloseMe(self, event): + self.Close(True) + + def OnCloseWindow(self, event): + self.Destroy() diff --git a/images/iraicone.icns b/images/iraicone.icns new file mode 100644 index 0000000000000000000000000000000000000000..9b910f71b1e51ccaeea5d06a511eab818420c4ab GIT binary patch literal 47174 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 E2l(QeJ^%m! literal 0 HcmV?d00001 diff --git a/layout.py b/layout.py index b84541c..384e000 100644 --- a/layout.py +++ b/layout.py @@ -127,12 +127,19 @@ class GraphPanelAfc(wx.Panel): oldimg.Destroy() oldlab = self.labels.pop(image_id) oldlab.Destroy() - No = [but.Destroy() for but in self.buts] - self.buts = [wx.Button(self.panel_1, wx.ID_DELETE, name = `i`) for i, img in enumerate(self.listimg)] + oldbut = self.buts.pop(image_id) + oldbut.Show(False) + #No = [but.Destroy() for but in self.buts] + #self.buts = [wx.Button(self.panel_1, wx.ID_DELETE, name = `i`) for i, img in enumerate(self.listimg)] + for i, but in enumerate(self.buts) : + but.SetName(`i`) todel = self.list_graph.pop(image_id) os.remove(os.path.join(self.dirout, todel[0])) print_liste(self.Dict[self.itempath], self.list_graph) - self.__do_layout() + #self.sizer_1.Destroy() + #self.sizer_2.Destroy() + #self.sizer_3.Destroy() + #self.__do_layout() self.sizer_3.Fit(self.panel_1) self.Layout() else : diff --git a/listlex.py b/listlex.py index cdae6e9..2237fcc 100644 --- a/listlex.py +++ b/listlex.py @@ -169,7 +169,7 @@ class ListForSpec(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSor menu.Destroy() def getselectedwords(self) : - words = [self.getColumnText(self.GetFirstSelected(), 6)] + words = [self.getColumnText(self.GetFirstSelected(), 0)] last = self.GetFirstSelected() while self.GetNextSelected(last) != -1: last = self.GetNextSelected(last) diff --git a/search_list.py b/search_list.py index 65b83c4..dab8f83 100644 --- a/search_list.py +++ b/search_list.py @@ -19,6 +19,7 @@ import wx.lib.mixins.listctrl as listmix import cStringIO import tempfile from functions import exec_rcode, MessageImage +from dialog import message from chemins import ffr from PrintRScript import barplot, dendroandbarplot #--------------------------------------------------------------------------- @@ -80,7 +81,6 @@ class SearchList(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSort self.SetItemCount(len(dlist)) listmix.ColumnSorterMixin.__init__(self, len(first)+2) - self.SortListItems(0, True) #----------------------------------------------------------------------------------------- @@ -92,6 +92,8 @@ class SearchList(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSort for i in range(1,len(first)-1): self.SetColumnWidth(i, 130) + self.SortListItems(0, True) + # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py def GetListCtrl(self): return self @@ -202,7 +204,7 @@ class SearchList(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSort rep = [] for forme in lems[word] : rep.append([forme, corpus.formes[forme][0]]) - win = message(self, -1, u"Formes associées", size=(300, 200), style=wx.DEFAULT_FRAME_STYLE) + win = message(self, u"Formes associées", size=(300, 200)) win.html = '\n' + '
'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n' win.HtmlPage.SetPage(win.html) win.Show(True) @@ -212,7 +214,7 @@ class SearchList(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSort page = self.parent.nb.GetPage(activenotebook) item=self.getColumnText(self.GetFirstSelected(), 0) corpus = page.corpus - win = message(self, -1, u"Concordancier", size=(600, 200),style = wx.DEFAULT_FRAME_STYLE) + win = message(self, u"Concordancier", size=(600, 200)) avap=60 listmot = corpus.lems[item] uce_ok = [corpus.formes[forme][1] for forme in listmot] @@ -275,7 +277,7 @@ class SearchList(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSort with open(tmpscript,'w') as f : f.write(txt) exec_rcode(self.parent.parent.RPath, tmpscript, wait = True) - win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE) + win = MessageImage(self, u"Graphique", size=(700, 500)) win.addsaveimage(tmpgraph) txt = "" % tmpgraph win.HtmlPage.SetPage(txt) @@ -298,77 +300,77 @@ class SearchList(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSort with open(tmpscript,'w') as f : f.write(txt) exec_rcode(self.parent.parent.RPath, tmpscript, wait = True) - win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE) + win = MessageImage(self, u"Graphique", size=(700, 500)) win.addsaveimage(tmpgraph) txt = "" % tmpgraph win.HtmlPage.SetPage(txt) win.Show(True) -class message(wx.Frame): - def __init__(self, *args, **kwds): - # begin wxGlade: MyFrame.__init__ - kwds["style"] = wx.DEFAULT_FRAME_STYLE - wx.Frame.__init__(self, *args, **kwds) - self.HtmlPage=wx.html.HtmlWindow(self, -1) - if "gtk2" in wx.PlatformInfo: - self.HtmlPage.SetStandardFonts() - self.HtmlPage.SetFonts('Courier','Courier') - - - self.button_1 = wx.Button(self, -1, "Fermer") - self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1) - self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) - self.__do_layout() - # end wxGlade - - def __do_layout(self): - # begin wxGlade: MyFrame.__do_layout - sizer_1 = wx.BoxSizer(wx.VERTICAL) - sizer_2 = wx.BoxSizer(wx.VERTICAL) - sizer_2.Add(self.HtmlPage, 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) - sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ADJUST_MINSIZE, 0) - sizer_1.Add(sizer_2, 1, wx.EXPAND, 0) - self.SetAutoLayout(True) - self.SetSizer(sizer_1) - self.Layout() - # end wxGlade - - def OnCloseMe(self, event): - self.Close(True) - - def OnCloseWindow(self, event): - self.Destroy() - - -def getSmallUpArrowData(): - return \ -'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ -\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ -\x00\x00C\xb0\x89\ -\xd3.\x10\xd1m\xc3\xe5*\xbc.\x80i\xc2\x17.\x8c\xa3y\x81\x01\x00\xa1\x0e\x04e\ -?\x84B\xef\x00\x00\x00\x00IEND\xaeB`\x82" - -def getSmallDnArrowBitmap(): - return wx.BitmapFromImage(getSmallDnArrowImage()) - -def getSmallDnArrowImage(): - stream = cStringIO.StringIO(getSmallDnArrowData()) - return wx.ImageFromStream(stream) +#class message(wx.Dialog): +# def __init__(self, *args, **kwds): +# # begin wxGlade: MyFrame.__init__ +# kwds["style"] = wx.DEFAULT_FRAME_STYLE +# wx.Frame.__init__(self, *args, **kwds) +# self.HtmlPage=wx.html.HtmlWindow(self, -1) +# if "gtk2" in wx.PlatformInfo: +# self.HtmlPage.SetStandardFonts() +# self.HtmlPage.SetFonts('Courier','Courier') +# +# +# self.button_1 = wx.Button(self, -1, "Fermer") +# self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1) +# self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) +# self.__do_layout() +# # end wxGlade +# +# def __do_layout(self): +# # begin wxGlade: MyFrame.__do_layout +# sizer_1 = wx.BoxSizer(wx.VERTICAL) +# sizer_2 = wx.BoxSizer(wx.VERTICAL) +# sizer_2.Add(self.HtmlPage, 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) +# sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ADJUST_MINSIZE, 0) +# sizer_1.Add(sizer_2, 1, wx.EXPAND, 0) +# self.SetAutoLayout(True) +# self.SetSizer(sizer_1) +# self.Layout() +# # end wxGlade +# +# def OnCloseMe(self, event): +# self.Close(True) +# +# def OnCloseWindow(self, event): +# self.Destroy() +# +# +#def getSmallUpArrowData(): +# return \ +#'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ +#\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\ +#\x00\x00C\xb0\x89\ +#\xd3.\x10\xd1m\xc3\xe5*\xbc.\x80i\xc2\x17.\x8c\xa3y\x81\x01\x00\xa1\x0e\x04e\ +#?\x84B\xef\x00\x00\x00\x00IEND\xaeB`\x82" +# +#def getSmallDnArrowBitmap(): +# return wx.BitmapFromImage(getSmallDnArrowImage()) +# +#def getSmallDnArrowImage(): +# stream = cStringIO.StringIO(getSmallDnArrowData()) +# return wx.ImageFromStream(stream) diff --git a/setup.py b/setup.py index 8a96984..077ebd0 100644 --- a/setup.py +++ b/setup.py @@ -7,13 +7,8 @@ Usage: from setuptools import setup import os -DATA_FILES=['configuration','Rscripts','images','dictionnaires','locale','son_fin.wav'] -#DATA_FILES=[] -#for rep in replist : -# DATA_FILES+=os.listdir(rep) -print DATA_FILES +DATA_FILES=['configuration','Rscripts','images','dictionnaires','locale', 'Rlib','son_fin.wav'] APP = ['iramuteq.py'] -#DATA_FILES = ['-r', 'configuration*,Rscripts/*'] OPTIONS = {'argv_emulation': True, 'iconfile':('images/iraicone.icns')} @@ -22,4 +17,4 @@ setup( data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], -) \ No newline at end of file +) -- 2.7.4